microwave 0.1004.4 → 0.1004.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (105) hide show
  1. data/README.rdoc +0 -3
  2. data/lib/chef/client.rb +2 -11
  3. data/lib/chef/platform.rb +1 -192
  4. data/lib/chef/providers.rb +0 -68
  5. data/lib/chef/resources.rb +0 -36
  6. data/lib/chef/version.rb +1 -1
  7. metadata +123 -239
  8. data/lib/chef/provider/breakpoint.rb +0 -31
  9. data/lib/chef/provider/cron.rb +0 -186
  10. data/lib/chef/provider/cron/solaris.rb +0 -195
  11. data/lib/chef/provider/deploy.rb +0 -343
  12. data/lib/chef/provider/deploy/revision.rb +0 -80
  13. data/lib/chef/provider/deploy/timestamped.rb +0 -33
  14. data/lib/chef/provider/env.rb +0 -152
  15. data/lib/chef/provider/env/windows.rb +0 -75
  16. data/lib/chef/provider/erl_call.rb +0 -101
  17. data/lib/chef/provider/git.rb +0 -243
  18. data/lib/chef/provider/group.rb +0 -133
  19. data/lib/chef/provider/group/aix.rb +0 -70
  20. data/lib/chef/provider/group/dscl.rb +0 -121
  21. data/lib/chef/provider/group/gpasswd.rb +0 -53
  22. data/lib/chef/provider/group/groupadd.rb +0 -81
  23. data/lib/chef/provider/group/pw.rb +0 -84
  24. data/lib/chef/provider/group/suse.rb +0 -53
  25. data/lib/chef/provider/group/usermod.rb +0 -57
  26. data/lib/chef/provider/group/windows.rb +0 -79
  27. data/lib/chef/provider/ifconfig.rb +0 -134
  28. data/lib/chef/provider/log.rb +0 -54
  29. data/lib/chef/provider/mdadm.rb +0 -91
  30. data/lib/chef/provider/mount.rb +0 -114
  31. data/lib/chef/provider/mount/mount.rb +0 -240
  32. data/lib/chef/provider/mount/windows.rb +0 -81
  33. data/lib/chef/provider/ohai.rb +0 -42
  34. data/lib/chef/provider/package.rb +0 -163
  35. data/lib/chef/provider/package/apt.rb +0 -135
  36. data/lib/chef/provider/package/dpkg.rb +0 -115
  37. data/lib/chef/provider/package/easy_install.rb +0 -136
  38. data/lib/chef/provider/package/freebsd.rb +0 -125
  39. data/lib/chef/provider/package/macports.rb +0 -105
  40. data/lib/chef/provider/package/pacman.rb +0 -101
  41. data/lib/chef/provider/package/portage.rb +0 -135
  42. data/lib/chef/provider/package/rpm.rb +0 -104
  43. data/lib/chef/provider/package/rubygems.rb +0 -465
  44. data/lib/chef/provider/package/solaris.rb +0 -130
  45. data/lib/chef/provider/package/yum.rb +0 -1128
  46. data/lib/chef/provider/package/zypper.rb +0 -144
  47. data/lib/chef/provider/route.rb +0 -193
  48. data/lib/chef/provider/ruby_block.rb +0 -34
  49. data/lib/chef/provider/script.rb +0 -55
  50. data/lib/chef/provider/service.rb +0 -122
  51. data/lib/chef/provider/service/arch.rb +0 -116
  52. data/lib/chef/provider/service/debian.rb +0 -130
  53. data/lib/chef/provider/service/freebsd.rb +0 -154
  54. data/lib/chef/provider/service/gentoo.rb +0 -53
  55. data/lib/chef/provider/service/init.rb +0 -71
  56. data/lib/chef/provider/service/insserv.rb +0 -52
  57. data/lib/chef/provider/service/redhat.rb +0 -60
  58. data/lib/chef/provider/service/simple.rb +0 -120
  59. data/lib/chef/provider/service/solaris.rb +0 -85
  60. data/lib/chef/provider/service/systemd.rb +0 -102
  61. data/lib/chef/provider/service/upstart.rb +0 -198
  62. data/lib/chef/provider/service/windows.rb +0 -146
  63. data/lib/chef/provider/subversion.rb +0 -197
  64. data/lib/chef/provider/user.rb +0 -186
  65. data/lib/chef/provider/user/dscl.rb +0 -280
  66. data/lib/chef/provider/user/pw.rb +0 -113
  67. data/lib/chef/provider/user/useradd.rb +0 -137
  68. data/lib/chef/provider/user/windows.rb +0 -124
  69. data/lib/chef/resource/apt_package.rb +0 -34
  70. data/lib/chef/resource/bash.rb +0 -33
  71. data/lib/chef/resource/breakpoint.rb +0 -35
  72. data/lib/chef/resource/cron.rb +0 -188
  73. data/lib/chef/resource/csh.rb +0 -33
  74. data/lib/chef/resource/deploy.rb +0 -380
  75. data/lib/chef/resource/deploy_revision.rb +0 -40
  76. data/lib/chef/resource/dpkg_package.rb +0 -34
  77. data/lib/chef/resource/easy_install_package.rb +0 -57
  78. data/lib/chef/resource/erl_call.rb +0 -83
  79. data/lib/chef/resource/freebsd_package.rb +0 -35
  80. data/lib/chef/resource/gem_package.rb +0 -53
  81. data/lib/chef/resource/git.rb +0 -46
  82. data/lib/chef/resource/group.rb +0 -70
  83. data/lib/chef/resource/ifconfig.rb +0 -134
  84. data/lib/chef/resource/log.rb +0 -62
  85. data/lib/chef/resource/macports_package.rb +0 -29
  86. data/lib/chef/resource/mdadm.rb +0 -82
  87. data/lib/chef/resource/mount.rb +0 -134
  88. data/lib/chef/resource/ohai.rb +0 -40
  89. data/lib/chef/resource/package.rb +0 -80
  90. data/lib/chef/resource/pacman_package.rb +0 -33
  91. data/lib/chef/resource/perl.rb +0 -33
  92. data/lib/chef/resource/portage_package.rb +0 -33
  93. data/lib/chef/resource/python.rb +0 -33
  94. data/lib/chef/resource/route.rb +0 -135
  95. data/lib/chef/resource/rpm_package.rb +0 -34
  96. data/lib/chef/resource/ruby.rb +0 -33
  97. data/lib/chef/resource/ruby_block.rb +0 -40
  98. data/lib/chef/resource/scm.rb +0 -147
  99. data/lib/chef/resource/script.rb +0 -60
  100. data/lib/chef/resource/service.rb +0 -160
  101. data/lib/chef/resource/solaris_package.rb +0 -36
  102. data/lib/chef/resource/subversion.rb +0 -36
  103. data/lib/chef/resource/timestamped_deploy.rb +0 -31
  104. data/lib/chef/resource/user.rb +0 -130
  105. data/lib/chef/resource/yum_package.rb +0 -63
@@ -1,135 +0,0 @@
1
- #
2
- # Author:: Ezra Zygmuntowicz (<ezra@engineyard.com>)
3
- # Copyright:: Copyright (c) 2008 Opscode, Inc.
4
- # License:: Apache License, Version 2.0
5
- #
6
- # Licensed under the Apache License, Version 2.0 (the "License");
7
- # you may not use this file except in compliance with the License.
8
- # You may obtain a copy of the License at
9
- #
10
- # http://www.apache.org/licenses/LICENSE-2.0
11
- #
12
- # Unless required by applicable law or agreed to in writing, software
13
- # distributed under the License is distributed on an "AS IS" BASIS,
14
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
- # See the License for the specific language governing permissions and
16
- # limitations under the License.
17
- #
18
-
19
- require 'chef/provider/package'
20
- require 'chef/mixin/command'
21
- require 'chef/resource/package'
22
-
23
- class Chef
24
- class Provider
25
- class Package
26
- class Portage < Chef::Provider::Package
27
- PACKAGE_NAME_PATTERN = %r{(([^/]+)/)?([^/]+)}
28
-
29
- def load_current_resource
30
- @current_resource = Chef::Resource::Package.new(@new_resource.name)
31
- @current_resource.package_name(@new_resource.package_name)
32
-
33
- @current_resource.version(nil)
34
-
35
- _, category_with_slash, category, pkg = %r{^#{PACKAGE_NAME_PATTERN}$}.match(@new_resource.package_name).to_a
36
-
37
- possibilities = Dir["/var/db/pkg/#{category || "*"}/#{pkg}-*"].map {|d| d.sub(%r{/var/db/pkg/}, "") }
38
- versions = possibilities.map do |entry|
39
- if(entry =~ %r{[^/]+/#{Regexp.escape(pkg)}\-(\d[\.\d]*((_(alpha|beta|pre|rc|p)\d*)*)?(-r\d+)?)})
40
- [$&, $1]
41
- end
42
- end.compact
43
-
44
- if versions.size > 1
45
- atoms = versions.map {|v| v.first }.sort
46
- raise Chef::Exceptions::Package, "Multiple packages found for #{@new_resource.package_name}: #{atoms.join(" ")}. Specify a category."
47
- elsif versions.size == 1
48
- @current_resource.version(versions.first.last)
49
- Chef::Log.debug("#{@new_resource} current version #{$1}")
50
- end
51
-
52
- @current_resource
53
- end
54
-
55
-
56
- def parse_emerge(package, txt)
57
- availables = {}
58
- package_without_category = package.split("/").last
59
- found_package_name = nil
60
-
61
- txt.each_line do |line|
62
- if line =~ /\*\s+#{PACKAGE_NAME_PATTERN}/
63
- found_package_name = $&.strip
64
- if found_package_name == package || found_package_name.split("/").last == package_without_category
65
- availables[found_package_name] = nil
66
- end
67
- end
68
-
69
- if line =~ /Latest version available: (.*)/ && availables.has_key?(found_package_name)
70
- availables[found_package_name] = $1.strip
71
- end
72
- end
73
-
74
- if availables.size > 1
75
- # shouldn't happen if a category is specified so just use `package`
76
- raise Chef::Exceptions::Package, "Multiple emerge results found for #{package}: #{availables.keys.join(" ")}. Specify a category."
77
- end
78
-
79
- availables.values.first
80
- end
81
-
82
- def candidate_version
83
- return @candidate_version if @candidate_version
84
-
85
- status = popen4("emerge --color n --nospinner --search #{@new_resource.package_name.split('/').last}") do |pid, stdin, stdout, stderr|
86
- available, installed = parse_emerge(@new_resource.package_name, stdout.read)
87
- @candidate_version = available
88
- end
89
-
90
- unless status.exitstatus == 0
91
- raise Chef::Exceptions::Package, "emerge --search failed - #{status.inspect}!"
92
- end
93
-
94
- @candidate_version
95
-
96
- end
97
-
98
-
99
- def install_package(name, version)
100
- pkg = "=#{name}-#{version}"
101
-
102
- if(version =~ /^\~(.+)/)
103
- # If we start with a tilde
104
- pkg = "~#{name}-#{$1}"
105
- end
106
-
107
- run_command_with_systems_locale(
108
- :command => "emerge -g --color n --nospinner --quiet#{expand_options(@new_resource.options)} #{pkg}"
109
- )
110
- end
111
-
112
- def upgrade_package(name, version)
113
- install_package(name, version)
114
- end
115
-
116
- def remove_package(name, version)
117
- if(version)
118
- pkg = "=#{@new_resource.package_name}-#{version}"
119
- else
120
- pkg = "#{@new_resource.package_name}"
121
- end
122
-
123
- run_command_with_systems_locale(
124
- :command => "emerge --unmerge --color n --nospinner --quiet#{expand_options(@new_resource.options)} #{pkg}"
125
- )
126
- end
127
-
128
- def purge_package(name, version)
129
- remove_package(name, version)
130
- end
131
-
132
- end
133
- end
134
- end
135
- end
@@ -1,104 +0,0 @@
1
- #
2
- # Author:: Joshua Timberman (<joshua@opscode.com>)
3
- # Copyright:: Copyright (c) 2008 Opscode, Inc.
4
- # License:: Apache License, Version 2.0
5
- #
6
- # Licensed under the Apache License, Version 2.0 (the "License");
7
- # you may not use this file except in compliance with the License.
8
- # You may obtain a copy of the License at
9
- #
10
- # http://www.apache.org/licenses/LICENSE-2.0
11
- #
12
- # Unless required by applicable law or agreed to in writing, software
13
- # distributed under the License is distributed on an "AS IS" BASIS,
14
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
- # See the License for the specific language governing permissions and
16
- # limitations under the License.
17
- #
18
- require 'chef/provider/package'
19
- require 'chef/mixin/command'
20
- require 'chef/resource/package'
21
- require 'chef/mixin/get_source_from_package'
22
-
23
- class Chef
24
- class Provider
25
- class Package
26
- class Rpm < Chef::Provider::Package
27
-
28
- include Chef::Mixin::GetSourceFromPackage
29
-
30
- def load_current_resource
31
- @current_resource = Chef::Resource::Package.new(@new_resource.name)
32
- @current_resource.package_name(@new_resource.package_name)
33
- @new_resource.version(nil)
34
-
35
- if @new_resource.source
36
- unless ::File.exists?(@new_resource.source)
37
- raise Chef::Exceptions::Package, "Package #{@new_resource.name} not found: #{@new_resource.source}"
38
- end
39
-
40
- Chef::Log.debug("#{@new_resource} checking rpm status")
41
- status = popen4("rpm -qp --queryformat '%{NAME} %{VERSION}-%{RELEASE}\n' #{@new_resource.source}") do |pid, stdin, stdout, stderr|
42
- stdout.each do |line|
43
- case line
44
- when /([\w\d_.-]+)\s([\w\d_.-]+)/
45
- @current_resource.package_name($1)
46
- @new_resource.version($2)
47
- end
48
- end
49
- end
50
- else
51
- if Array(@new_resource.action).include?(:install)
52
- raise Chef::Exceptions::Package, "Source for package #{@new_resource.name} required for action install"
53
- end
54
- end
55
-
56
- Chef::Log.debug("#{@new_resource} checking install state")
57
- status = popen4("rpm -q --queryformat '%{NAME} %{VERSION}-%{RELEASE}\n' #{@current_resource.package_name}") do |pid, stdin, stdout, stderr|
58
- stdout.each do |line|
59
- case line
60
- when /([\w\d_.-]+)\s([\w\d_.-]+)/
61
- Chef::Log.debug("#{@new_resource} current version is #{$2}")
62
- @current_resource.version($2)
63
- end
64
- end
65
- end
66
-
67
- unless status.exitstatus == 0 || status.exitstatus == 1
68
- raise Chef::Exceptions::Package, "rpm failed - #{status.inspect}!"
69
- end
70
-
71
- @current_resource
72
- end
73
-
74
- def install_package(name, version)
75
- unless @current_resource.version
76
- run_command_with_systems_locale(
77
- :command => "rpm #{@new_resource.options} -i #{@new_resource.source}"
78
- )
79
- else
80
- run_command_with_systems_locale(
81
- :command => "rpm #{@new_resource.options} -U #{@new_resource.source}"
82
- )
83
- end
84
- end
85
-
86
- alias_method :upgrade_package, :install_package
87
-
88
- def remove_package(name, version)
89
- if version
90
- run_command_with_systems_locale(
91
- :command => "rpm #{@new_resource.options} -e #{name}-#{version}"
92
- )
93
- else
94
- run_command_with_systems_locale(
95
- :command => "rpm #{@new_resource.options} -e #{name}"
96
- )
97
- end
98
- end
99
-
100
- end
101
- end
102
- end
103
- end
104
-
@@ -1,465 +0,0 @@
1
- #
2
- # Author:: Adam Jacob (<adam@opscode.com>)
3
- # Author:: Daniel DeLeo (<dan@opscode.com>)
4
- # Copyright:: Copyright (c) 2008, 2010 Opscode, Inc.
5
- # License:: Apache License, Version 2.0
6
- #
7
- # Licensed under the Apache License, Version 2.0 (the "License");
8
- # you may not use this file except in compliance with the License.
9
- # You may obtain a copy of the License at
10
- #
11
- # http://www.apache.org/licenses/LICENSE-2.0
12
- #
13
- # Unless required by applicable law or agreed to in writing, software
14
- # distributed under the License is distributed on an "AS IS" BASIS,
15
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
- # See the License for the specific language governing permissions and
17
- # limitations under the License.
18
- #
19
-
20
- require 'chef/provider/package'
21
- require 'chef/mixin/command'
22
- require 'chef/resource/package'
23
- require 'chef/mixin/get_source_from_package'
24
-
25
- # Class methods on Gem are defined in rubygems
26
- require 'rubygems'
27
- # Ruby 1.9's gem_prelude can interact poorly with loading the full rubygems
28
- # explicitly like this. Make sure rubygems/specification is always last in this
29
- # list
30
- require 'rubygems/version'
31
- require 'rubygems/dependency'
32
- require 'rubygems/spec_fetcher'
33
- require 'rubygems/platform'
34
- require 'rubygems/format'
35
- require 'rubygems/dependency_installer'
36
- require 'rubygems/uninstaller'
37
- require 'rubygems/specification'
38
-
39
- class Chef
40
- class Provider
41
- class Package
42
- class Rubygems < Chef::Provider::Package
43
- class GemEnvironment
44
- # HACK: trigger gem config load early. Otherwise it can get lazy
45
- # loaded during operations where we've set Gem.sources to an
46
- # alternate value and overwrite it with the defaults.
47
- Gem.configuration
48
-
49
- DEFAULT_UNINSTALLER_OPTS = {:ignore => true, :executables => true}
50
-
51
- ##
52
- # The paths where rubygems should search for installed gems.
53
- # Implemented by subclasses.
54
- def gem_paths
55
- raise NotImplementedError
56
- end
57
-
58
- ##
59
- # A rubygems source index containing the list of gemspecs for all
60
- # available gems in the gem installation.
61
- # Implemented by subclasses
62
- # === Returns
63
- # Gem::SourceIndex
64
- def gem_source_index
65
- raise NotImplementedError
66
- end
67
-
68
- ##
69
- # Lists the installed versions of +gem_name+, constrained by the
70
- # version spec in +gem_dep+
71
- # === Arguments
72
- # Gem::Dependency +gem_dep+ is a Gem::Dependency object, its version
73
- # specification constrains which gems are returned.
74
- # === Returns
75
- # [Gem::Specification] an array of Gem::Specification objects
76
- def installed_versions(gem_dep)
77
- gem_source_index.search(gem_dep)
78
- end
79
-
80
- ##
81
- # Yields to the provided block with rubygems' source list set to the
82
- # list provided. Always resets the list when the block returns or
83
- # raises an exception.
84
- def with_gem_sources(*sources)
85
- sources.compact!
86
- original_sources = Gem.sources
87
- Gem.sources = sources unless sources.empty?
88
- yield
89
- ensure
90
- Gem.sources = original_sources
91
- end
92
-
93
- ##
94
- # Determines the candidate version for a gem from a .gem file on disk
95
- # and checks if it matches the version contraints in +gem_dependency+
96
- # === Returns
97
- # Gem::Version a singular gem version object is returned if the gem
98
- # is available
99
- # nil returns nil if the gem on disk doesn't match the
100
- # version constraints for +gem_dependency+
101
- def candidate_version_from_file(gem_dependency, source)
102
- spec = Gem::Format.from_file_by_path(source).spec
103
- if spec.satisfies_requirement?(gem_dependency)
104
- logger.debug {"#{@new_resource} found candidate gem version #{spec.version} from local gem package #{source}"}
105
- spec.version
106
- else
107
- # This is probably going to end badly...
108
- logger.warn { "#{@new_resource} gem package #{source} does not satisfy the requirements #{gem_dependency.to_s}" }
109
- nil
110
- end
111
- end
112
-
113
- ##
114
- # Finds the newest version that satisfies the constraints of
115
- # +gem_dependency+. The version is determined from the cache or a
116
- # round-trip to the server as needed. The architecture and gem
117
- # sources will be set before making the query.
118
- # === Returns
119
- # Gem::Version a singular gem version object is returned if the gem
120
- # is available
121
- # nil returns nil if the gem could not be found
122
- def candidate_version_from_remote(gem_dependency, *sources)
123
- raise NotImplementedError
124
- end
125
-
126
- ##
127
- # Find the newest gem version available from Gem.sources that satisfies
128
- # the constraints of +gem_dependency+
129
- def find_newest_remote_version(gem_dependency, *sources)
130
- # DependencyInstaller sorts the results such that the last one is
131
- # always the one it considers best.
132
- spec_with_source = dependency_installer.find_gems_with_sources(gem_dependency).last
133
-
134
- spec = spec_with_source && spec_with_source[0]
135
- version = spec && spec_with_source[0].version
136
- if version
137
- logger.debug { "#{@new_resource} found gem #{spec.name} version #{version} for platform #{spec.platform} from #{spec_with_source[1]}" }
138
- version
139
- else
140
- source_list = sources.compact.empty? ? "[#{Gem.sources.join(', ')}]" : "[#{sources.join(', ')}]"
141
- logger.warn { "#{@new_resource} failed to find gem #{gem_dependency} from #{source_list}" }
142
- nil
143
- end
144
- end
145
-
146
- ##
147
- # Installs a gem via the rubygems ruby API.
148
- # === Options
149
- # :sources rubygems servers to use
150
- # Other options are passed to Gem::DependencyInstaller.new
151
- def install(gem_dependency, options={})
152
- with_gem_sources(*options.delete(:sources)) do
153
- with_correct_verbosity do
154
- dependency_installer(options).install(gem_dependency)
155
- end
156
- end
157
- end
158
-
159
- ##
160
- # Uninstall the gem +gem_name+ via the rubygems ruby API. If
161
- # +gem_version+ is provided, only that version will be uninstalled.
162
- # Otherwise, all versions are uninstalled.
163
- # === Options
164
- # Options are passed to Gem::Uninstaller.new
165
- def uninstall(gem_name, gem_version=nil, opts={})
166
- gem_version ? opts[:version] = gem_version : opts[:all] = true
167
- with_correct_verbosity do
168
- uninstaller(gem_name, opts).uninstall
169
- end
170
- end
171
-
172
- ##
173
- # Set rubygems' user interaction to ConsoleUI or SilentUI depending
174
- # on our current debug level
175
- def with_correct_verbosity
176
- Gem::DefaultUserInteraction.ui = Chef::Log.debug? ? Gem::ConsoleUI.new : Gem::SilentUI.new
177
- yield
178
- end
179
-
180
- def dependency_installer(opts={})
181
- Gem::DependencyInstaller.new(opts)
182
- end
183
-
184
- def uninstaller(gem_name, opts={})
185
- Gem::Uninstaller.new(gem_name, DEFAULT_UNINSTALLER_OPTS.merge(opts))
186
- end
187
-
188
- private
189
-
190
- def logger
191
- Chef::Log.logger
192
- end
193
-
194
- end
195
-
196
- class CurrentGemEnvironment < GemEnvironment
197
-
198
- def gem_paths
199
- Gem.path
200
- end
201
-
202
- def gem_source_index
203
- Gem.source_index
204
- end
205
-
206
- def candidate_version_from_remote(gem_dependency, *sources)
207
- with_gem_sources(*sources) do
208
- find_newest_remote_version(gem_dependency, *sources)
209
- end
210
- end
211
-
212
- end
213
-
214
- class AlternateGemEnvironment < GemEnvironment
215
- JRUBY_PLATFORM = /(:?universal|x86_64|x86)\-java\-[0-9\.]+/
216
-
217
- def self.gempath_cache
218
- @gempath_cache ||= {}
219
- end
220
-
221
- def self.platform_cache
222
- @platform_cache ||= {}
223
- end
224
-
225
- include Chef::Mixin::ShellOut
226
-
227
- attr_reader :gem_binary_location
228
-
229
- def initialize(gem_binary_location)
230
- @gem_binary_location = gem_binary_location
231
- end
232
-
233
- def gem_paths
234
- if self.class.gempath_cache.key?(@gem_binary_location)
235
- self.class.gempath_cache[@gem_binary_location]
236
- else
237
- # shellout! is a fork/exec which won't work on windows
238
- shell_style_paths = shell_out!("#{@gem_binary_location} env gempath").stdout
239
- # on windows, the path separator is (usually? always?) semicolon
240
- paths = shell_style_paths.split(::File::PATH_SEPARATOR).map { |path| path.strip }
241
- self.class.gempath_cache[@gem_binary_location] = paths
242
- end
243
- end
244
-
245
- def gem_source_index
246
- @source_index ||= Gem::SourceIndex.from_gems_in(*gem_paths.map { |p| p + '/specifications' })
247
- end
248
-
249
- ##
250
- # Attempt to detect the correct platform settings for the target gem
251
- # environment.
252
- #
253
- # In practice, this only makes a difference if different versions are
254
- # available depending on platform, and only if the target gem
255
- # environment has a radically different platform (i.e., jruby), so we
256
- # just try to detect jruby and fall back to the current platforms
257
- # (Gem.platforms) if we don't detect it.
258
- #
259
- # === Returns
260
- # [String|Gem::Platform] returns an array of Gem::Platform-compatible
261
- # objects, i.e., Strings that are valid for Gem::Platform or actual
262
- # Gem::Platform objects.
263
- def gem_platforms
264
- if self.class.platform_cache.key?(@gem_binary_location)
265
- self.class.platform_cache[@gem_binary_location]
266
- else
267
- gem_environment = shell_out!("#{@gem_binary_location} env").stdout
268
- if jruby = gem_environment[JRUBY_PLATFORM]
269
- self.class.platform_cache[@gem_binary_location] = ['ruby', Gem::Platform.new(jruby)]
270
- else
271
- self.class.platform_cache[@gem_binary_location] = Gem.platforms
272
- end
273
- end
274
- end
275
-
276
- def with_gem_platforms(*alt_gem_platforms)
277
- alt_gem_platforms.flatten!
278
- original_gem_platforms = Gem.platforms
279
- Gem.platforms = alt_gem_platforms
280
- yield
281
- ensure
282
- Gem.platforms = original_gem_platforms
283
- end
284
-
285
- def candidate_version_from_remote(gem_dependency, *sources)
286
- with_gem_sources(*sources) do
287
- with_gem_platforms(*gem_platforms) do
288
- find_newest_remote_version(gem_dependency, *sources)
289
- end
290
- end
291
- end
292
-
293
- end
294
-
295
- include Chef::Mixin::ShellOut
296
-
297
- attr_reader :gem_env
298
-
299
- def logger
300
- Chef::Log.logger
301
- end
302
-
303
- include Chef::Mixin::GetSourceFromPackage
304
-
305
- def initialize(new_resource, run_context=nil)
306
- super
307
- if new_resource.gem_binary
308
- if new_resource.options && new_resource.options.kind_of?(Hash)
309
- msg = "options cannot be given as a hash when using an explicit gem_binary\n"
310
- msg << "in #{new_resource} from #{new_resource.source_line}"
311
- raise ArgumentError, msg
312
- end
313
- @gem_env = AlternateGemEnvironment.new(new_resource.gem_binary)
314
- else
315
- @gem_env = CurrentGemEnvironment.new
316
- end
317
- end
318
-
319
- def gem_dependency
320
- Gem::Dependency.new(@new_resource.package_name, @new_resource.version)
321
- end
322
-
323
- def source_is_remote?
324
- return true if @new_resource.source.nil?
325
- URI.parse(@new_resource.source).absolute?
326
- end
327
-
328
- def current_version
329
- #raise 'todo'
330
- # If one or more matching versions are installed, the newest of them
331
- # is the current version
332
- if !matching_installed_versions.empty?
333
- gemspec = matching_installed_versions.last
334
- logger.debug { "#{@new_resource} found installed gem #{gemspec.name} version #{gemspec.version} matching #{gem_dependency}"}
335
- gemspec
336
- # If no version matching the requirements exists, the latest installed
337
- # version is the current version.
338
- elsif !all_installed_versions.empty?
339
- gemspec = all_installed_versions.last
340
- logger.debug { "#{@new_resource} newest installed version of gem #{gemspec.name} is #{gemspec.version}" }
341
- gemspec
342
- else
343
- logger.debug { "#{@new_resource} no installed version found for #{gem_dependency.to_s}"}
344
- nil
345
- end
346
- end
347
-
348
- def matching_installed_versions
349
- @matching_installed_versions ||= @gem_env.installed_versions(gem_dependency)
350
- end
351
-
352
- def all_installed_versions
353
- @all_installed_versions ||= begin
354
- @gem_env.installed_versions(Gem::Dependency.new(gem_dependency.name, '>= 0'))
355
- end
356
- end
357
-
358
- def gem_sources
359
- @new_resource.source ? Array(@new_resource.source) : nil
360
- end
361
-
362
- def load_current_resource
363
- @current_resource = Chef::Resource::Package::GemPackage.new(@new_resource.name)
364
- @current_resource.package_name(@new_resource.package_name)
365
- if current_spec = current_version
366
- @current_resource.version(current_spec.version.to_s)
367
- end
368
- @current_resource
369
- end
370
-
371
- def candidate_version
372
- @candidate_version ||= begin
373
- if target_version_already_installed?
374
- nil
375
- elsif source_is_remote?
376
- @gem_env.candidate_version_from_remote(gem_dependency, *gem_sources).to_s
377
- else
378
- @gem_env.candidate_version_from_file(gem_dependency, @new_resource.source).to_s
379
- end
380
- end
381
- end
382
-
383
- def target_version_already_installed?
384
- return false unless @current_resource && @current_resource.version
385
- return false if @current_resource.version.nil?
386
- # in the future we could support squiggly requirements like "~> 1.2.0"
387
- # for now, the behavior when using anything other than exact
388
- # requirements is undefined.
389
- Gem::Requirement.new(@new_resource.version).satisfied_by?(Gem::Version.new(@current_resource.version))
390
- end
391
-
392
- ##
393
- # Installs the gem, using either the gems API or shelling out to `gem`
394
- # according to the following criteria:
395
- # 1. Use gems API (Gem::DependencyInstaller) by default
396
- # 2. shell out to `gem install` when a String of options is given
397
- # 3. use gems API with options if a hash of options is given
398
- def install_package(name, version)
399
- if source_is_remote? && @new_resource.gem_binary.nil?
400
- if @new_resource.options.nil?
401
- @gem_env.install(gem_dependency, :sources => gem_sources)
402
- elsif @new_resource.options.kind_of?(Hash)
403
- options = @new_resource.options
404
- options[:sources] = gem_sources
405
- @gem_env.install(gem_dependency, options)
406
- else
407
- install_via_gem_command(name, version)
408
- end
409
- elsif @new_resource.gem_binary.nil?
410
- @gem_env.install(@new_resource.source)
411
- else
412
- install_via_gem_command(name,version)
413
- end
414
- true
415
- end
416
-
417
- def gem_binary_path
418
- @new_resource.gem_binary || 'gem'
419
- end
420
-
421
- def install_via_gem_command(name, version)
422
- src = @new_resource.source && " --source=#{@new_resource.source} --source=http://rubygems.org"
423
- shell_out!("#{gem_binary_path} install #{name} -q --no-rdoc --no-ri -v \"#{version}\"#{src}#{opts}", :env=>nil)
424
- end
425
-
426
- def upgrade_package(name, version)
427
- install_package(name, version)
428
- end
429
-
430
- def remove_package(name, version)
431
- if @new_resource.gem_binary.nil?
432
- if @new_resource.options.nil?
433
- @gem_env.uninstall(name, version)
434
- elsif @new_resource.options.kind_of?(Hash)
435
- @gem_env.uninstall(name, version, @new_resource.options)
436
- else
437
- uninstall_via_gem_command(name, version)
438
- end
439
- else
440
- uninstall_via_gem_command(name, version)
441
- end
442
- end
443
-
444
- def uninstall_via_gem_command(name, version)
445
- if version
446
- shell_out!("#{gem_binary_path} uninstall #{name} -q -x -I -v \"#{version}\"#{opts}", :env=>nil)
447
- else
448
- shell_out!("#{gem_binary_path} uninstall #{name} -q -x -I -a#{opts}", :env=>nil)
449
- end
450
- end
451
-
452
- def purge_package(name, version)
453
- remove_package(name, version)
454
- end
455
-
456
- private
457
-
458
- def opts
459
- expand_options(@new_resource.options)
460
- end
461
-
462
- end
463
- end
464
- end
465
- end