open4 0.8.0 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/README CHANGED
@@ -10,6 +10,47 @@ SYNOPSIS
10
10
 
11
11
  HISTORY
12
12
 
13
+ 0.9.0:
14
+ - added the ability for open4.spawn to take either an array of arguments
15
+ or multiple arguments in order to specify the argv for the command run.
16
+ for example
17
+
18
+ open4.spawn ['touch', 'difficult to "quote"'], :stdout=>STDOUT
19
+
20
+ same thing
21
+
22
+ open4.spawn 'touch', 'difficult to "quote"', :stdout=>STDOUT
23
+
24
+ thanks to jordan breeding for this suggestion
25
+
26
+
27
+ - added 'cwd'/:cwd keyword. usage is pretty obivous
28
+
29
+ open4.spawn 'pwd', 1=>STDOUT, :cwd=>'/tmp' #=> /tmp
30
+
31
+ this one also from jordan
32
+
33
+ 0.8.0:
34
+
35
+ - fixed a critical bug whereby a process producing tons of stdout, but for
36
+ which the stdout was not handled, would cause the child process to
37
+ become blocked/hung writing to the pipe. eg, this command would cause a
38
+ hang
39
+
40
+ include Open4
41
+
42
+ spawn 'ruby -e" puts Array.new(65536){ 42 } "'
43
+
44
+ whereas this one would not
45
+
46
+ include Open4
47
+
48
+ spawn 'ruby -e" puts Array.new(65536){ 42 } "', :stdout=>StringIO.new
49
+
50
+ this version handles the former by spawning a 'null' thread which reads,
51
+ but does not process stdout/stderr. that way commands which generate
52
+ tons of output will never become blocked.
53
+
13
54
  0.7.0:
14
55
  - merged functionality of exitstatus/status keywords:
15
56
 
@@ -4,7 +4,7 @@ require 'thread'
4
4
 
5
5
  module Open4
6
6
  #--{{{
7
- VERSION = '0.8.0'
7
+ VERSION = '0.9.0'
8
8
  def self.version() VERSION end
9
9
 
10
10
  class Error < ::StandardError; end
@@ -235,8 +235,14 @@ module Open4
235
235
  end
236
236
  module_function :relay
237
237
 
238
- def spawn cmd, opts = {}
238
+ def spawn arg, *argv
239
239
  #--{{{
240
+ argv.unshift(arg)
241
+ opts = ((argv.size > 1 and Hash === argv.last) ? argv.pop : {})
242
+ argv.flatten!
243
+ cmd = argv.join(' ')
244
+
245
+
240
246
  getopt = getopts opts
241
247
 
242
248
  ignore_exit_failure = getopt[ 'ignore_exit_failure', getopt['quiet', false] ]
@@ -251,6 +257,7 @@ module Open4
251
257
  stdout_timeout = getopt[ %w( stdout_timeout io_timeout ) ]
252
258
  stderr_timeout = getopt[ %w( stderr_timeout ) ]
253
259
  status = getopt[ %w( status ) ]
260
+ cwd = getopt[ %w( cwd dir ), Dir.pwd ]
254
261
 
255
262
  exitstatus =
256
263
  case exitstatus
@@ -269,30 +276,32 @@ module Open4
269
276
 
270
277
  status =
271
278
  begin
272
- Timeout::timeout(timeout) do
273
- popen4(cmd) do |c, i, o, e|
274
- started = true
279
+ Dir.chdir(cwd) do
280
+ Timeout::timeout(timeout) do
281
+ popen4(*argv) do |c, i, o, e|
282
+ started = true
275
283
 
276
- %w( replace pid= << push update ).each do |msg|
277
- break(pid.send(msg, c)) if pid.respond_to? msg
278
- end
284
+ %w( replace pid= << push update ).each do |msg|
285
+ break(pid.send(msg, c)) if pid.respond_to? msg
286
+ end
279
287
 
280
- te = ThreadEnsemble.new c
288
+ te = ThreadEnsemble.new c
281
289
 
282
- te.add_thread(i, stdin) do |i, stdin|
283
- relay stdin, i, stdin_timeout
284
- i.close rescue nil
285
- end
290
+ te.add_thread(i, stdin) do |i, stdin|
291
+ relay stdin, i, stdin_timeout
292
+ i.close rescue nil
293
+ end
286
294
 
287
- te.add_thread(o, stdout) do |o, stdout|
288
- relay o, stdout, stdout_timeout
289
- end
295
+ te.add_thread(o, stdout) do |o, stdout|
296
+ relay o, stdout, stdout_timeout
297
+ end
290
298
 
291
- te.add_thread(e, stderr) do |o, stderr|
292
- relay e, stderr, stderr_timeout
293
- end
299
+ te.add_thread(e, stderr) do |o, stderr|
300
+ relay e, stderr, stderr_timeout
301
+ end
294
302
 
295
- te.run
303
+ te.run
304
+ end
296
305
  end
297
306
  end
298
307
  rescue
@@ -307,12 +316,12 @@ module Open4
307
316
  end
308
317
  module_function :spawn
309
318
 
310
- def background cmd, opts = {}
319
+ def background arg, *argv
311
320
  #--{{{
312
321
  require 'thread'
313
322
  q = Queue.new
314
323
  opts['pid'] = opts[:pid] = q
315
- thread = Thread.new(cmd, opts){|cmd, opts| spawn cmd, opts}
324
+ thread = Thread.new(arg, argv){|arg, argv| spawn arg, *argv}
316
325
  pid = q.pop
317
326
  sc = class << thread; self; end
318
327
  sc.module_eval {
@@ -4,7 +4,7 @@ require 'thread'
4
4
 
5
5
  module Open4
6
6
  #--{{{
7
- VERSION = '0.8.0'
7
+ VERSION = '0.9.0'
8
8
  def self.version() VERSION end
9
9
 
10
10
  class Error < ::StandardError; end
@@ -235,8 +235,14 @@ module Open4
235
235
  end
236
236
  module_function :relay
237
237
 
238
- def spawn cmd, opts = {}
238
+ def spawn arg, *argv
239
239
  #--{{{
240
+ argv.unshift(arg)
241
+ opts = ((argv.size > 1 and Hash === argv.last) ? argv.pop : {})
242
+ argv.flatten!
243
+ cmd = argv.join(' ')
244
+
245
+
240
246
  getopt = getopts opts
241
247
 
242
248
  ignore_exit_failure = getopt[ 'ignore_exit_failure', getopt['quiet', false] ]
@@ -251,6 +257,7 @@ module Open4
251
257
  stdout_timeout = getopt[ %w( stdout_timeout io_timeout ) ]
252
258
  stderr_timeout = getopt[ %w( stderr_timeout ) ]
253
259
  status = getopt[ %w( status ) ]
260
+ cwd = getopt[ %w( cwd dir ), Dir.pwd ]
254
261
 
255
262
  exitstatus =
256
263
  case exitstatus
@@ -269,30 +276,32 @@ module Open4
269
276
 
270
277
  status =
271
278
  begin
272
- Timeout::timeout(timeout) do
273
- popen4(cmd) do |c, i, o, e|
274
- started = true
279
+ Dir.chdir(cwd) do
280
+ Timeout::timeout(timeout) do
281
+ popen4(*argv) do |c, i, o, e|
282
+ started = true
275
283
 
276
- %w( replace pid= << push update ).each do |msg|
277
- break(pid.send(msg, c)) if pid.respond_to? msg
278
- end
284
+ %w( replace pid= << push update ).each do |msg|
285
+ break(pid.send(msg, c)) if pid.respond_to? msg
286
+ end
279
287
 
280
- te = ThreadEnsemble.new c
288
+ te = ThreadEnsemble.new c
281
289
 
282
- te.add_thread(i, stdin) do |i, stdin|
283
- relay stdin, i, stdin_timeout
284
- i.close rescue nil
285
- end
290
+ te.add_thread(i, stdin) do |i, stdin|
291
+ relay stdin, i, stdin_timeout
292
+ i.close rescue nil
293
+ end
286
294
 
287
- te.add_thread(o, stdout) do |o, stdout|
288
- relay o, stdout, stdout_timeout
289
- end
295
+ te.add_thread(o, stdout) do |o, stdout|
296
+ relay o, stdout, stdout_timeout
297
+ end
290
298
 
291
- te.add_thread(e, stderr) do |o, stderr|
292
- relay e, stderr, stderr_timeout
293
- end
299
+ te.add_thread(e, stderr) do |o, stderr|
300
+ relay e, stderr, stderr_timeout
301
+ end
294
302
 
295
- te.run
303
+ te.run
304
+ end
296
305
  end
297
306
  end
298
307
  rescue
@@ -307,12 +316,12 @@ module Open4
307
316
  end
308
317
  module_function :spawn
309
318
 
310
- def background cmd, opts = {}
319
+ def background arg, *argv
311
320
  #--{{{
312
321
  require 'thread'
313
322
  q = Queue.new
314
323
  opts['pid'] = opts[:pid] = q
315
- thread = Thread.new(cmd, opts){|cmd, opts| spawn cmd, opts}
324
+ thread = Thread.new(arg, argv){|arg, argv| spawn arg, *argv}
316
325
  pid = q.pop
317
326
  sc = class << thread; self; end
318
327
  sc.module_eval {
metadata CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.8.11
3
3
  specification_version: 1
4
4
  name: open4
5
5
  version: !ruby/object:Gem::Version
6
- version: 0.8.0
7
- date: 2006-09-25 00:00:00.000000 -06:00
6
+ version: 0.9.0
7
+ date: 2006-10-17 00:00:00.000000 -06:00
8
8
  summary: open4
9
9
  require_paths:
10
10
  - lib
@@ -34,7 +34,6 @@ files:
34
34
  - lib
35
35
  - README
36
36
  - gemspec.rb
37
- - open4-0.8.0.gem
38
37
  - sample/block.rb
39
38
  - sample/simple.rb
40
39
  - sample/exception.rb
@@ -43,7 +42,7 @@ files:
43
42
  - sample/timeout.rb
44
43
  - sample/stdin_timeout.rb
45
44
  - lib/open4.rb
46
- - lib/open4-0.8.0.rb
45
+ - lib/open4-0.9.0.rb
47
46
  test_files: []
48
47
  rdoc_options: []
49
48
  extra_rdoc_files: []
File without changes