chef 0.9.14.rc.1 → 0.9.14

Sign up to get free protection for your applications and to get access to all the features.
@@ -6,9 +6,9 @@
6
6
  # Licensed under the Apache License, Version 2.0 (the "License");
7
7
  # you may not use this file except in compliance with the License.
8
8
  # You may obtain a copy of the License at
9
- #
9
+ #
10
10
  # http://www.apache.org/licenses/LICENSE-2.0
11
- #
11
+ #
12
12
  # Unless required by applicable law or agreed to in writing, software
13
13
  # distributed under the License is distributed on an "AS IS" BASIS,
14
14
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -24,40 +24,40 @@ require "chef/provider/subversion"
24
24
  class Chef
25
25
  class Provider
26
26
  class Deploy < Chef::Provider
27
-
27
+
28
28
  include Chef::Mixin::FromFile
29
29
  include Chef::Mixin::Command
30
-
30
+
31
31
  attr_reader :scm_provider, :release_path
32
-
32
+
33
33
  def initialize(new_resource, run_context)
34
34
  super(new_resource, run_context)
35
-
35
+
36
36
  @scm_provider = new_resource.scm_provider.new(new_resource, run_context)
37
-
37
+
38
38
  # @configuration is not used by Deploy, it is only for backwards compat with
39
39
  # chef-deploy or capistrano hooks that might use it to get environment information
40
40
  @configuration = @new_resource.to_hash
41
41
  @configuration[:environment] = @configuration[:environment] && @configuration[:environment]["RAILS_ENV"]
42
42
  end
43
-
43
+
44
44
  def load_current_resource
45
45
  @release_path = @new_resource.deploy_to + "/releases/#{release_slug}"
46
46
  end
47
-
47
+
48
48
  def sudo(command,&block)
49
49
  execute(command, &block)
50
50
  end
51
-
51
+
52
52
  def run(command, &block)
53
53
  exec = execute(command, &block)
54
54
  exec.user(@new_resource.user) if @new_resource.user
55
55
  exec.group(@new_resource.group) if @new_resource.group
56
56
  exec.cwd(release_path) unless exec.cwd
57
- exec.environment(@new_resource.environment) unless exec.environment
57
+ exec.environment(@new_resource.environment) unless exec.environment
58
58
  exec
59
59
  end
60
-
60
+
61
61
  def action_deploy
62
62
  if all_releases.include?(release_path)
63
63
  if all_releases[-1] == release_path
@@ -71,7 +71,7 @@ class Chef
71
71
  @new_resource.updated_by_last_action(true)
72
72
  end
73
73
  end
74
-
74
+
75
75
  def action_force_deploy
76
76
  if all_releases.include?(release_path)
77
77
  Chef::Log.info("Already deployed app at #{release_path}, forcing.")
@@ -80,7 +80,7 @@ class Chef
80
80
  deploy
81
81
  @new_resource.updated_by_last_action(true)
82
82
  end
83
-
83
+
84
84
  def action_rollback
85
85
  if release_path
86
86
  rp_index = all_releases.index(release_path)
@@ -88,7 +88,7 @@ class Chef
88
88
  rp_index += 1
89
89
  releases_to_nuke = all_releases[rp_index..-1]
90
90
  else
91
- @release_path = all_releases[-2]
91
+ @release_path = all_releases[-2]
92
92
  raise RuntimeError, "There is no release to rollback to!" unless @release_path
93
93
  releases_to_nuke = [ all_releases.last ]
94
94
  end
@@ -99,12 +99,12 @@ class Chef
99
99
  restart
100
100
  releases_to_nuke.each do |i|
101
101
  Chef::Log.info "Removing release: #{i}"
102
- FileUtils.rm_rf i
102
+ FileUtils.rm_rf i
103
103
  release_deleted(i)
104
104
  end
105
105
  @new_resource.updated_by_last_action(true)
106
106
  end
107
-
107
+
108
108
  def deploy
109
109
  Chef::Log.info "deploying branch: #{@new_resource.branch}"
110
110
  enforce_ownership
@@ -121,7 +121,7 @@ class Chef
121
121
  callback(:after_restart, @new_resource.after_restart)
122
122
  cleanup!
123
123
  end
124
-
124
+
125
125
  def callback(what, callback_code=nil)
126
126
  @collection = Chef::ResourceCollection.new
127
127
  case callback_code
@@ -140,31 +140,31 @@ class Chef
140
140
  raise RuntimeError, "You gave me a callback I don't know what to do with: #{callback_code.inspect}"
141
141
  end
142
142
  end
143
-
143
+
144
144
  def migrate
145
145
  run_symlinks_before_migrate
146
-
146
+
147
147
  if @new_resource.migrate
148
148
  enforce_ownership
149
-
149
+
150
150
  environment = @new_resource.environment
151
- env_info = environment && environment.map do |key_and_val|
151
+ env_info = environment && environment.map do |key_and_val|
152
152
  "#{key_and_val.first}='#{key_and_val.last}'"
153
153
  end.join(" ")
154
-
154
+
155
155
  Chef::Log.info "Migrating: running #{@new_resource.migration_command} as #{@new_resource.user} " +
156
156
  "with environment #{env_info}"
157
157
  run_command(run_options(:command => @new_resource.migration_command, :cwd=>release_path))
158
158
  end
159
159
  end
160
-
160
+
161
161
  def symlink
162
162
  Chef::Log.info "Symlinking"
163
163
  purge_tempfiles_from_current_release
164
164
  link_tempfiles_to_current_release
165
165
  link_current_release_to_production
166
166
  end
167
-
167
+
168
168
  def restart
169
169
  if restart_cmd = @new_resource.restart_command
170
170
  if restart_cmd.kind_of?(Proc)
@@ -176,7 +176,7 @@ class Chef
176
176
  end
177
177
  end
178
178
  end
179
-
179
+
180
180
  def cleanup!
181
181
  all_releases[0..-6].each do |old_release|
182
182
  Chef::Log.info "Removing old release #{old_release}"
@@ -184,48 +184,49 @@ class Chef
184
184
  release_deleted(old_release)
185
185
  end
186
186
  end
187
-
187
+
188
188
  def all_releases
189
189
  Dir.glob(@new_resource.deploy_to + "/releases/*").sort
190
190
  end
191
-
191
+
192
192
  def update_cached_repo
193
+ @scm_provider.load_current_resource
193
194
  if @new_resource.svn_force_export
194
195
  svn_force_export
195
196
  else
196
197
  run_scm_sync
197
198
  end
198
199
  end
199
-
200
+
200
201
  def run_scm_sync
201
202
  Chef::Log.info "updating the cached checkout"
202
203
  @scm_provider.action_sync
203
204
  end
204
-
205
+
205
206
  def svn_force_export
206
207
  Chef::Log.info "exporting source repository to #{@new_resource.destination}"
207
208
  @scm_provider.action_force_export
208
209
  end
209
-
210
+
210
211
  def copy_cached_repo
211
212
  Chef::Log.info "copying the cached checkout to #{release_path}"
212
213
  FileUtils.mkdir_p(@new_resource.deploy_to + "/releases")
213
214
  run_command(:command => "cp -RPp #{::File.join(@new_resource.destination, ".")} #{release_path}")
214
215
  release_created(release_path)
215
216
  end
216
-
217
+
217
218
  def enforce_ownership
218
219
  Chef::Log.info "ensuring proper ownership"
219
220
  FileUtils.chown_R(@new_resource.user, @new_resource.group, @new_resource.deploy_to)
220
221
  end
221
-
222
+
222
223
  def link_current_release_to_production
223
224
  Chef::Log.info "Linking release #{release_path} into production at #{@new_resource.current_path}"
224
225
  FileUtils.rm_f(@new_resource.current_path)
225
226
  FileUtils.ln_sf(release_path, @new_resource.current_path)
226
227
  enforce_ownership
227
228
  end
228
-
229
+
229
230
  def run_symlinks_before_migrate
230
231
  links_info = @new_resource.symlink_before_migrate.map { |src, dst| "#{src} => #{dst}" }.join(", ")
231
232
  Chef::Log.info "Making pre-migration symlinks: #{links_info}"
@@ -233,12 +234,12 @@ class Chef
233
234
  FileUtils.ln_sf(@new_resource.shared_path + "/#{src}", release_path + "/#{dest}")
234
235
  end
235
236
  end
236
-
237
+
237
238
  def link_tempfiles_to_current_release
238
239
  dirs_info = @new_resource.create_dirs_before_symlink.join(",")
239
240
  Chef::Log.info("creating directories before symlink: #{dirs_info}")
240
241
  @new_resource.create_dirs_before_symlink.each { |dir| FileUtils.mkdir_p(release_path + "/#{dir}") }
241
-
242
+
242
243
  links_info = @new_resource.symlinks.map { |src, dst| "#{src} => #{dst}" }.join(", ")
243
244
  Chef::Log.info("Linking shared paths into current release: #{links_info}")
244
245
  @new_resource.symlinks.each do |src, dest|
@@ -247,32 +248,32 @@ class Chef
247
248
  run_symlinks_before_migrate
248
249
  enforce_ownership
249
250
  end
250
-
251
+
251
252
  def create_dirs_before_symlink
252
253
  end
253
-
254
+
254
255
  def purge_tempfiles_from_current_release
255
256
  log_info = @new_resource.purge_before_symlink.join(", ")
256
257
  Chef::Log.info("Purging directories in checkout #{log_info}")
257
258
  @new_resource.purge_before_symlink.each { |dir| FileUtils.rm_rf(release_path + "/#{dir}") }
258
259
  end
259
-
260
+
260
261
  protected
261
-
262
+
262
263
  # Internal callback, called after copy_cached_repo.
263
264
  # Override if you need to keep state externally.
264
265
  def release_created(release_path)
265
266
  end
266
-
267
+
267
268
  # Internal callback, called during cleanup! for each old release removed.
268
269
  # Override if you need to keep state externally.
269
270
  def release_deleted(release_path)
270
271
  end
271
-
272
+
272
273
  def release_slug
273
274
  raise Chef::Exceptions::Override, "You must override release_slug in #{self.to_s}"
274
275
  end
275
-
276
+
276
277
  def install_gems
277
278
  gem_resource_collection_runner.converge
278
279
  end
@@ -288,7 +289,7 @@ class Chef
288
289
  def gem_packages
289
290
  return [] unless ::File.exist?("#{release_path}/gems.yml")
290
291
  gems = YAML.load(IO.read("#{release_path}/gems.yml"))
291
-
292
+
292
293
  gems.map do |g|
293
294
  r = Chef::Resource::GemPackage.new(g[:name])
294
295
  r.version g[:version]
@@ -297,14 +298,14 @@ class Chef
297
298
  r
298
299
  end
299
300
  end
300
-
301
+
301
302
  def run_options(run_opts={})
302
303
  run_opts[:user] = @new_resource.user if @new_resource.user
303
304
  run_opts[:group] = @new_resource.group if @new_resource.group
304
305
  run_opts[:environment] = @new_resource.environment if @new_resource.environment
305
306
  run_opts
306
307
  end
307
-
308
+
308
309
  def run_callback_from_file(callback_file)
309
310
  if ::File.exist?(callback_file)
310
311
  Dir.chdir(release_path) do
@@ -313,7 +314,7 @@ class Chef
313
314
  end
314
315
  end
315
316
  end
316
-
317
+
317
318
  end
318
319
  end
319
320
  end
@@ -6,9 +6,9 @@
6
6
  # Licensed under the Apache License, Version 2.0 (the "License");
7
7
  # you may not use this file except in compliance with the License.
8
8
  # You may obtain a copy of the License at
9
- #
9
+ #
10
10
  # http://www.apache.org/licenses/LICENSE-2.0
11
- #
11
+ #
12
12
  # Unless required by applicable law or agreed to in writing, software
13
13
  # distributed under the License is distributed on an "AS IS" BASIS,
14
14
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -24,27 +24,27 @@ class Chef
24
24
  class Provider
25
25
  class Deploy
26
26
  class Revision < Chef::Provider::Deploy
27
-
27
+
28
28
  def all_releases
29
29
  sorted_releases
30
30
  end
31
-
31
+
32
32
  protected
33
-
33
+
34
34
  def release_created(release)
35
35
  sorted_releases {|r| r.delete(release); r << release }
36
36
  end
37
-
37
+
38
38
  def release_deleted(release)
39
39
  sorted_releases { |r| r.delete(release)}
40
40
  end
41
-
41
+
42
42
  def release_slug
43
43
  scm_provider.revision_slug
44
44
  end
45
-
45
+
46
46
  private
47
-
47
+
48
48
  def sorted_releases
49
49
  cache = load_cache
50
50
  if block_given?
@@ -53,7 +53,7 @@ class Chef
53
53
  end
54
54
  cache
55
55
  end
56
-
56
+
57
57
  def sorted_releases_from_filesystem
58
58
  Dir.glob(new_resource.deploy_to + "/releases/*").sort_by { |d| ::File.ctime(d) }
59
59
  end
@@ -65,12 +65,12 @@ class Chef
65
65
  sorted_releases_from_filesystem
66
66
  end
67
67
  end
68
-
68
+
69
69
  def save_cache(cache)
70
70
  Chef::FileCache.store("revision-deploys/#{new_resource.name}", cache.to_json)
71
71
  cache
72
72
  end
73
-
73
+
74
74
  end
75
75
  end
76
76
  end
@@ -108,12 +108,25 @@ class Chef
108
108
  if (package_data = @data[package_name])
109
109
  if (available_versions = package_data[:available])
110
110
  if arch
111
- matching_versions = available_versions[arch]
111
+ # arch gets passed like ".x86_64"
112
+ matching_versions = [ available_versions[arch.sub(/^./, '')]]
112
113
  else
113
114
  matching_versions = available_versions.values
114
115
  end
115
116
 
117
+ if matching_versions.nil?
118
+ if arch.empty?
119
+ arch_msg = ""
120
+ else
121
+ arch_msg = "with arch #{arch.sub(/^./, '')} "
122
+ end
123
+
124
+ raise ArgumentError, "#{package_name}: Found no available versions #{arch_msg}to match"
125
+ end
126
+
127
+ # Expect [ { :version => "ver", :release => "rel" }, { :version => "ver", :release => "rel" }, { :version => "ver", :release => "rel" } ] ???
116
128
  matching_versions.each do |ver|
129
+ Chef::Log.debug("#{package_name}: trying to match #{desired_version} to version #{ver[:version]} and release #{ver[:release]}")
117
130
  if (desired_version == "#{ver[:version]}-#{ver[:release]}")
118
131
  return true
119
132
  end
@@ -205,7 +218,7 @@ class Chef
205
218
  :command => "yum -d0 -e0 -y #{@new_resource.options} install #{name}-#{version}#{yum_arch}"
206
219
  )
207
220
  else
208
- raise ArgumentError, "#{new_resource.name}: Version #{version} of #{name} not found. Did you specify both version and release? (version-release, e.g. 1.84-10.fc6)"
221
+ raise ArgumentError, "#{@new_resource.name}: Version #{version} of #{name} not found. Did you specify both version and release? (version-release, e.g. 1.84-10.fc6)"
209
222
  end
210
223
  end
211
224
  @yum.flush
@@ -186,7 +186,7 @@ module Shef
186
186
  @run_status = Chef::RunStatus.new(@node)
187
187
  Chef::Cookbook::FileVendor.on_create { |manifest| Chef::Cookbook::RemoteFileVendor.new(manifest, Chef::REST.new(Chef::Config[:server_url])) }
188
188
  cookbook_hash = @client.sync_cookbooks
189
- run_context = Chef::RunContext.new(node, Chef::CookbookCollection.new(cookbook_hash))
189
+ @run_context = Chef::RunContext.new(node, Chef::CookbookCollection.new(cookbook_hash))
190
190
  @run_status.run_context = run_context
191
191
  end
192
192
 
@@ -6,9 +6,9 @@
6
6
  # Licensed under the Apache License, Version 2.0 (the "License");
7
7
  # you may not use this file except in compliance with the License.
8
8
  # You may obtain a copy of the License at
9
- #
9
+ #
10
10
  # http://www.apache.org/licenses/LICENSE-2.0
11
- #
11
+ #
12
12
  # Unless required by applicable law or agreed to in writing, software
13
13
  # distributed under the License is distributed on an "AS IS" BASIS,
14
14
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -28,9 +28,9 @@ class Chef
28
28
  # Provides a simplified interface to shelling out yet still collecting both
29
29
  # standard out and standard error and providing full control over environment,
30
30
  # working directory, uid, gid, etc.
31
- #
31
+ #
32
32
  # No means for passing input to the subprocess is provided, nor is there any
33
- # way to inspect the output of the command as it is being read. If you need
33
+ # way to inspect the output of the command as it is being read. If you need
34
34
  # to do that, you have to use popen4 (in Chef::Mixin::Command)
35
35
  #
36
36
  # === Platform Support
@@ -41,16 +41,16 @@ class Chef
41
41
  READ_SIZE = 4096
42
42
  DEFAULT_READ_TIMEOUT = 60
43
43
  DEFAULT_ENVIRONMENT = {'LC_ALL' => 'C'}
44
-
44
+
45
45
  attr_accessor :user, :group, :cwd, :valid_exit_codes
46
46
  attr_reader :command, :umask, :environment
47
47
  attr_writer :timeout
48
48
  attr_reader :execution_time
49
-
49
+
50
50
  attr_reader :stdout, :stderr, :status
51
-
51
+
52
52
  attr_reader :stdin_pipe, :stdout_pipe, :stderr_pipe, :process_status_pipe
53
-
53
+
54
54
  # === Arguments:
55
55
  # Takes a single command, or a list of command fragments. These are used
56
56
  # as arguments to Kernel.exec. See the Kernel.exec documentation for more
@@ -97,34 +97,34 @@ class Chef
97
97
  def initialize(*command_args)
98
98
  @stdout, @stderr = '', ''
99
99
  @environment = DEFAULT_ENVIRONMENT
100
- @cwd = Dir.tmpdir
100
+ @cwd = nil
101
101
  @valid_exit_codes = [0]
102
102
 
103
103
  if command_args.last.is_a?(Hash)
104
104
  parse_options(command_args.pop)
105
105
  end
106
-
106
+
107
107
  @command = command_args.size == 1 ? command_args.first : command_args
108
108
  end
109
-
109
+
110
110
  def umask=(new_umask)
111
111
  @umask = (new_umask.respond_to?(:oct) ? new_umask.oct : new_umask.to_i) & 007777
112
112
  end
113
-
113
+
114
114
  def uid
115
115
  return nil unless user
116
116
  user.kind_of?(Integer) ? user : Etc.getpwnam(user.to_s).uid
117
117
  end
118
-
118
+
119
119
  def gid
120
120
  return nil unless group
121
121
  group.kind_of?(Integer) ? group : Etc.getgrnam(group.to_s).gid
122
122
  end
123
-
123
+
124
124
  def timeout
125
125
  @timeout || DEFAULT_READ_TIMEOUT
126
126
  end
127
-
127
+
128
128
  # Creates a String showing the output of the command, including a banner
129
129
  # showing the exact command executed. Used by +invalid!+ to show command
130
130
  # results when the command exited with an unexpected status.
@@ -137,11 +137,11 @@ class Chef
137
137
  msg << "Ran #{command} returned #{status.exitstatus}" if status
138
138
  msg
139
139
  end
140
-
140
+
141
141
  def exitstatus
142
142
  @status && @status.exitstatus
143
143
  end
144
-
144
+
145
145
  # Run the command, writing the command's standard out and standard error
146
146
  # to +stdout+ and +stderr+, and saving its exit status object to +status+
147
147
  # === Returns
@@ -156,13 +156,13 @@ class Chef
156
156
  def run_command
157
157
  Chef::Log.debug("sh(#{@command})")
158
158
  @child_pid = fork_subprocess
159
-
159
+
160
160
  configure_parent_process_file_descriptors
161
161
  propagate_pre_exec_failure
162
-
162
+
163
163
  @result = nil
164
164
  @execution_time = 0
165
-
165
+
166
166
  # Ruby 1.8.7 and 1.8.6 from mid 2009 try to allocate objects during GC
167
167
  # when calling IO.select and IO#read. Some OS Vendors are not interested
168
168
  # in updating their ruby packages (Apple, *cough*) and we *have to*
@@ -176,14 +176,14 @@ class Chef
176
176
  raise Chef::Exceptions::CommandTimeout, "command timed out:\n#{format_for_exception}"
177
177
  end
178
178
  end
179
-
179
+
180
180
  if ready && ready.first.include?(child_stdout)
181
181
  read_stdout_to_buffer
182
182
  end
183
183
  if ready && ready.first.include?(child_stderr)
184
184
  read_stderr_to_buffer
185
185
  end
186
-
186
+
187
187
  unless @status
188
188
  # make one more pass to get the last of the output after the
189
189
  # child process dies
@@ -205,8 +205,8 @@ class Chef
205
205
  GC.enable
206
206
  close_all_pipes
207
207
  end
208
-
209
- # Checks the +exitstatus+ against the set of +valid_exit_codes+. If
208
+
209
+ # Checks the +exitstatus+ against the set of +valid_exit_codes+. If
210
210
  # +exitstatus+ is not in the list of +valid_exit_codes+, calls +invalid!+,
211
211
  # which raises an Exception.
212
212
  # === Returns
@@ -231,15 +231,15 @@ class Chef
231
231
  msg ||= "Command produced unexpected results"
232
232
  raise Chef::Exceptions::ShellCommandFailed, msg + "\n" + format_for_exception
233
233
  end
234
-
234
+
235
235
  def inspect
236
236
  "<#{self.class.name}##{object_id}: command: '#@command' process_status: #{@status.inspect} " +
237
- "stdout: '#{stdout.strip}' stderr: '#{stderr.strip}' child_pid: #{@child_pid.inspect} " +
237
+ "stdout: '#{stdout.strip}' stderr: '#{stderr.strip}' child_pid: #{@child_pid.inspect} " +
238
238
  "environment: #{@environment.inspect} timeout: #{timeout} user: #@user group: #@group working_dir: #@cwd >"
239
239
  end
240
240
 
241
241
  private
242
-
242
+
243
243
  def parse_options(opts)
244
244
  opts.each do |option, setting|
245
245
  case option.to_s
@@ -263,31 +263,31 @@ class Chef
263
263
  end
264
264
  end
265
265
  end
266
-
266
+
267
267
  def set_user
268
268
  if user
269
269
  Process.euid = uid
270
270
  Process.uid = uid
271
271
  end
272
- end
273
-
272
+ end
273
+
274
274
  def set_group
275
275
  if group
276
276
  Process.egid = gid
277
277
  Process.gid = gid
278
278
  end
279
279
  end
280
-
280
+
281
281
  def set_environment
282
282
  environment.each do |env_var,value|
283
283
  ENV[env_var] = value
284
284
  end
285
285
  end
286
-
286
+
287
287
  def set_umask
288
288
  File.umask(umask) if umask
289
289
  end
290
-
290
+
291
291
  def set_cwd
292
292
  Dir.chdir(cwd) if cwd
293
293
  end
@@ -296,31 +296,31 @@ class Chef
296
296
  @stdout_pipe, @stderr_pipe, @process_status_pipe = IO.pipe, IO.pipe, IO.pipe
297
297
  @process_status_pipe.last.fcntl(Fcntl::F_SETFD, Fcntl::FD_CLOEXEC)
298
298
  end
299
-
299
+
300
300
  def child_stdout
301
301
  @stdout_pipe[0]
302
302
  end
303
-
303
+
304
304
  def child_stderr
305
305
  @stderr_pipe[0]
306
306
  end
307
-
307
+
308
308
  def child_process_status
309
309
  @process_status_pipe[0]
310
310
  end
311
-
311
+
312
312
  def close_all_pipes
313
313
  child_stdout.close unless child_stdout.closed?
314
314
  child_stderr.close unless child_stderr.closed?
315
315
  child_process_status.close unless child_process_status.closed?
316
316
  end
317
-
317
+
318
318
  # replace stdout, and stderr with pipes to the parent, and close the
319
319
  # reader side of the error marshaling side channel. Close STDIN so when we
320
320
  # exec, the new program will know it's never getting input ever.
321
321
  def configure_subprocess_file_descriptors
322
322
  process_status_pipe.first.close
323
-
323
+
324
324
  # HACK: for some reason, just STDIN.close isn't good enough when running
325
325
  # under ruby 1.9.2, so make it good enough:
326
326
  stdin_reader, stdin_writer = IO.pipe
@@ -338,7 +338,7 @@ class Chef
338
338
 
339
339
  STDOUT.sync = STDERR.sync = true
340
340
  end
341
-
341
+
342
342
  def configure_parent_process_file_descriptors
343
343
  # Close the sides of the pipes we don't care about
344
344
  stdout_pipe.last.close
@@ -350,7 +350,7 @@ class Chef
350
350
 
351
351
  true
352
352
  end
353
-
353
+
354
354
  # Some patch levels of ruby in wide use (in particular the ruby 1.8.6 on OSX)
355
355
  # segfault when you IO.select a pipe that's reached eof. Weak sauce.
356
356
  def open_pipes
@@ -365,7 +365,7 @@ class Chef
365
365
  rescue EOFError
366
366
  open_pipes.delete_at(0)
367
367
  end
368
-
368
+
369
369
  def read_stderr_to_buffer
370
370
  while chunk = child_stderr.read_nonblock(READ_SIZE)
371
371
  @stderr << chunk
@@ -374,13 +374,13 @@ class Chef
374
374
  rescue EOFError
375
375
  open_pipes.delete_at(1)
376
376
  end
377
-
377
+
378
378
  def fork_subprocess
379
379
  initialize_ipc
380
-
380
+
381
381
  fork do
382
382
  configure_subprocess_file_descriptors
383
-
383
+
384
384
  set_user
385
385
  set_group
386
386
  set_environment
@@ -389,7 +389,7 @@ class Chef
389
389
 
390
390
  begin
391
391
  command.kind_of?(Array) ? exec(*command) : exec(command)
392
-
392
+
393
393
  raise 'forty-two' # Should never get here
394
394
  rescue Exception => e
395
395
  Marshal.dump(e, process_status_pipe.last)
@@ -399,7 +399,7 @@ class Chef
399
399
  exit!
400
400
  end
401
401
  end
402
-
402
+
403
403
  # Attempt to get a Marshaled error from the side-channel.
404
404
  # If it's there, un-marshal it and raise. If it's not there,
405
405
  # assume everything went well.
@@ -413,6 +413,6 @@ class Chef
413
413
  child_process_status.close
414
414
  end
415
415
  end
416
-
416
+
417
417
  end
418
418
  end
@@ -17,5 +17,5 @@
17
17
 
18
18
  class Chef
19
19
  CHEF_ROOT = File.dirname(File.expand_path(File.dirname(__FILE__)))
20
- VERSION = '0.9.14.rc.1'
20
+ VERSION = '0.9.14'
21
21
  end
metadata CHANGED
@@ -1,15 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: chef
3
3
  version: !ruby/object:Gem::Version
4
- hash: 15424247
5
- prerelease: true
4
+ hash: 39
5
+ prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 9
9
9
  - 14
10
- - rc
11
- - 1
12
- version: 0.9.14.rc.1
10
+ version: 0.9.14
13
11
  platform: ruby
14
12
  authors:
15
13
  - Adam Jacob
@@ -17,7 +15,7 @@ autorequire:
17
15
  bindir: bin
18
16
  cert_chain: []
19
17
 
20
- date: 2011-02-25 00:00:00 -08:00
18
+ date: 2011-03-04 00:00:00 -08:00
21
19
  default_executable:
22
20
  dependencies:
23
21
  - !ruby/object:Gem::Dependency
@@ -630,14 +628,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
630
628
  required_rubygems_version: !ruby/object:Gem::Requirement
631
629
  none: false
632
630
  requirements:
633
- - - ">"
631
+ - - ">="
634
632
  - !ruby/object:Gem::Version
635
- hash: 25
633
+ hash: 3
636
634
  segments:
637
- - 1
638
- - 3
639
- - 1
640
- version: 1.3.1
635
+ - 0
636
+ version: "0"
641
637
  requirements: []
642
638
 
643
639
  rubyforge_project: