mixlib-shellout 1.0.0.rc.1-x86-mingw32 → 1.0.0-x86-mingw32

Sign up to get free protection for your applications and to get access to all the features.
@@ -185,7 +185,7 @@ module Mixlib
185
185
  end
186
186
  rescue Errno::EAGAIN
187
187
  rescue EOFError
188
- open_pipes.delete_at(0)
188
+ open_pipes.delete(child_stdout)
189
189
  end
190
190
 
191
191
  def read_stderr_to_buffer
@@ -194,7 +194,7 @@ module Mixlib
194
194
  end
195
195
  rescue Errno::EAGAIN
196
196
  rescue EOFError
197
- open_pipes.delete_at(1)
197
+ open_pipes.delete(child_stderr)
198
198
  end
199
199
 
200
200
  def fork_subprocess
@@ -1,5 +1,5 @@
1
1
  module Mixlib
2
2
  class ShellOut
3
- VERSION = "1.0.0.rc.1"
3
+ VERSION = "1.0.0"
4
4
  end
5
5
  end
@@ -42,6 +42,7 @@ module Mixlib
42
42
  #
43
43
  stdout_read, stdout_write = IO.pipe
44
44
  stderr_read, stderr_write = IO.pipe
45
+ stdin_read, stdin_write = IO.pipe
45
46
  open_streams = [ stdout_read, stderr_read ]
46
47
 
47
48
  begin
@@ -55,7 +56,8 @@ module Mixlib
55
56
  :command_line => command_line,
56
57
  :startup_info => {
57
58
  :stdout => stdout_write,
58
- :stderr => stderr_write
59
+ :stderr => stderr_write,
60
+ :stdin => stdin_read
59
61
  },
60
62
  :environment => inherit_environment.map { |k,v| "#{k}=#{v}" },
61
63
  :close_handles => false
@@ -88,7 +90,7 @@ module Mixlib
88
90
  when WAIT_TIMEOUT
89
91
  # Kill the process
90
92
  if (Time.now - start_wait) > timeout
91
- raise Mixlib::ShellOut::CommandTimeout, "command timed out:\n#{format_for_exception}"
93
+ raise Mixlib::ShellOut::Exceptions::CommandTimeout, "command timed out:\n#{format_for_exception}"
92
94
  end
93
95
 
94
96
  consume_output(open_streams, stdout_read, stderr_read)
@@ -119,6 +121,9 @@ module Mixlib
119
121
 
120
122
  class ThingThatLooksSortOfLikeAProcessStatus
121
123
  attr_accessor :exitstatus
124
+ def success?
125
+ exitstatus == 0
126
+ end
122
127
  end
123
128
 
124
129
  def consume_output(open_streams, stdout_read, stderr_read)
@@ -149,13 +154,33 @@ module Mixlib
149
154
  return true
150
155
  end
151
156
 
152
- SHOULD_USE_CMD = /['"<>|&%]|\b(?:assoc|break|call|cd|chcp|chdir|cls|color|copy|ctty|date|del|dir|echo|endlocal|erase|exit|for|ftype|goto|if|lfnfor|lh|lock|md|mkdir|move|path|pause|popd|prompt|pushd|rd|rem|ren|rename|rmdir|set|setlocal|shift|start|time|title|truename|type|unlock|ver|verify|vol)\b/
157
+ IS_BATCH_FILE = /\.bat|\.cmd$/i
153
158
 
154
159
  def command_to_run
155
- if command =~ SHOULD_USE_CMD
160
+ if command =~ /^\s*"(.*)"/
161
+ # If we have quotes, do an exact match
162
+ candidate = $1
163
+ else
164
+ # Otherwise check everything up to the first space
165
+ candidate = command[0,command.index(/\s/) || command.length].strip
166
+ end
167
+
168
+ # Don't do searching for empty commands. Let it fail when it runs.
169
+ if candidate.length == 0
170
+ return [ nil, command ]
171
+ end
172
+
173
+ # Check if the exe exists directly. Otherwise, search PATH.
174
+ exe = find_exe_at_location(candidate)
175
+ if exe.nil? && exe !~ /[\\\/]/
176
+ exe = which(command[0,command.index(/\s/) || command.length])
177
+ end
178
+
179
+ if exe.nil? || exe =~ IS_BATCH_FILE
180
+ # Batch files MUST use cmd; and if we couldn't find the command we're looking for, we assume it must be a cmd builtin.
156
181
  [ ENV['COMSPEC'], "cmd /c #{command}" ]
157
182
  else
158
- [ which(command[0,command.index(/\s/) || command.length]), command ]
183
+ [ exe, command ]
159
184
  end
160
185
  end
161
186
 
@@ -175,14 +200,23 @@ module Mixlib
175
200
  result
176
201
  end
177
202
 
203
+ def pathext
204
+ @pathext ||= ENV['PATHEXT'] ? ENV['PATHEXT'].split(';') + [''] : ['']
205
+ end
206
+
178
207
  def which(cmd)
179
- return cmd if File.executable? cmd
180
- exts = ENV['PATHEXT'] ? ENV['PATHEXT'].split(';') + [''] : ['']
181
208
  ENV['PATH'].split(File::PATH_SEPARATOR).each do |path|
182
- exts.each { |ext|
183
- exe = "#{path}/#{cmd}#{ext}"
184
- return exe if File.executable? exe
185
- }
209
+ exe = find_exe_at_location("#{path}/${cmd}")
210
+ return exe if exe
211
+ end
212
+ return nil
213
+ end
214
+
215
+ def find_exe_at_location(path)
216
+ return path if File.executable? path
217
+ pathext.each do |ext|
218
+ exe = "#{path}#{ext}"
219
+ return exe if File.executable? exe
186
220
  end
187
221
  return nil
188
222
  end
metadata CHANGED
@@ -1,46 +1,49 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: mixlib-shellout
3
- version: !ruby/object:Gem::Version
4
- version: 1.0.0.rc.1
5
- prerelease: 6
3
+ version: !ruby/object:Gem::Version
4
+ prerelease:
5
+ version: 1.0.0
6
6
  platform: x86-mingw32
7
- authors:
7
+ authors:
8
8
  - Opscode
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-12-06 00:00:00.000000000Z
13
- dependencies:
14
- - !ruby/object:Gem::Dependency
12
+
13
+ date: 2012-02-28 00:00:00 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
15
16
  name: rspec
16
- requirement: &70226436348680 !ruby/object:Gem::Requirement
17
+ prerelease: false
18
+ requirement: &id001 !ruby/object:Gem::Requirement
17
19
  none: false
18
- requirements:
19
- - - ! '>='
20
- - !ruby/object:Gem::Version
21
- version: '0'
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: "0"
22
24
  type: :development
23
- prerelease: false
24
- version_requirements: *70226436348680
25
- - !ruby/object:Gem::Dependency
25
+ version_requirements: *id001
26
+ - !ruby/object:Gem::Dependency
26
27
  name: win32-process
27
- requirement: &70226436346120 !ruby/object:Gem::Requirement
28
+ prerelease: false
29
+ requirement: &id002 !ruby/object:Gem::Requirement
28
30
  none: false
29
- requirements:
31
+ requirements:
30
32
  - - ~>
31
- - !ruby/object:Gem::Version
33
+ - !ruby/object:Gem::Version
32
34
  version: 0.6.5
33
35
  type: :runtime
34
- prerelease: false
35
- version_requirements: *70226436346120
36
+ version_requirements: *id002
36
37
  description: Run external commands on Unix or Windows
37
38
  email: info@opscode.com
38
39
  executables: []
40
+
39
41
  extensions: []
40
- extra_rdoc_files:
42
+
43
+ extra_rdoc_files:
41
44
  - README.md
42
45
  - LICENSE
43
- files:
46
+ files:
44
47
  - LICENSE
45
48
  - README.md
46
49
  - lib/mixlib/shellout/exceptions.rb
@@ -50,26 +53,30 @@ files:
50
53
  - lib/mixlib/shellout.rb
51
54
  homepage: http://wiki.opscode.com/
52
55
  licenses: []
56
+
53
57
  post_install_message:
54
58
  rdoc_options: []
55
- require_paths:
59
+
60
+ require_paths:
56
61
  - lib
57
- required_ruby_version: !ruby/object:Gem::Requirement
62
+ required_ruby_version: !ruby/object:Gem::Requirement
58
63
  none: false
59
- requirements:
60
- - - ! '>='
61
- - !ruby/object:Gem::Version
62
- version: '0'
63
- required_rubygems_version: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: "0"
68
+ required_rubygems_version: !ruby/object:Gem::Requirement
64
69
  none: false
65
- requirements:
66
- - - ! '>'
67
- - !ruby/object:Gem::Version
68
- version: 1.3.1
70
+ requirements:
71
+ - - ">="
72
+ - !ruby/object:Gem::Version
73
+ version: "0"
69
74
  requirements: []
75
+
70
76
  rubyforge_project:
71
77
  rubygems_version: 1.8.10
72
78
  signing_key:
73
79
  specification_version: 3
74
80
  summary: Run external commands on Unix or Windows
75
81
  test_files: []
82
+