rexec 1.4.0 → 1.4.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -39,7 +39,9 @@ module RExec
39
39
  def initialize(input, output, error = nil)
40
40
  @input = input
41
41
  @output = output
42
+
42
43
  @running = true
44
+ @exceptions = :send
43
45
 
44
46
  @error = error
45
47
 
@@ -50,6 +52,9 @@ module RExec
50
52
  # The object that will handle remote proxy invocations.
51
53
  attr :handler, true
52
54
 
55
+ # Whether to send exceptions across the wire, or handle normally (e.g. print to stdout):
56
+ attr :exceptions, true
57
+
53
58
  # The proxy object that will dispatch RPCs.
54
59
  attr :proxy
55
60
 
@@ -98,7 +103,11 @@ module RExec
98
103
  begin
99
104
  yield object
100
105
  rescue Exception => ex
101
- send_object(ex)
106
+ if @exceptions == :send
107
+ send_object(ex)
108
+ else
109
+ raise
110
+ end
102
111
  end
103
112
  end
104
113
  end
data/lib/rexec/server.rb CHANGED
@@ -84,11 +84,11 @@ module RExec
84
84
  Task.open(command, options) do |task|
85
85
  conn = Connection.build(task, options, &send_code)
86
86
 
87
- yield conn, task
88
-
89
- conn.stop
90
- task.stop
91
- task.wait
87
+ begin
88
+ yield conn, task
89
+ ensure
90
+ conn.stop
91
+ end
92
92
  end
93
93
  else
94
94
  task = Task.open(command, options)
data/lib/rexec/task.rb CHANGED
@@ -287,12 +287,17 @@ module RExec
287
287
  if command.respond_to? :call
288
288
  command.call
289
289
  elsif Array === command
290
+ command = command.dup
291
+
290
292
  # If command is a Pathname, we need to convert it to an absolute path if possible,
291
293
  # otherwise if it is relative it might cause problems.
292
294
  if command[0].respond_to? :realpath
293
295
  command[0] = command[0].realpath
294
296
  end
295
297
 
298
+ # exec expects an array of Strings:
299
+ command.collect! { |item| item.to_s }
300
+
296
301
  exec *command
297
302
  else
298
303
  if command.respond_to? :realpath
@@ -310,9 +315,17 @@ module RExec
310
315
  if block_given?
311
316
  begin
312
317
  yield task
318
+
319
+ # Close all input pipes if not done already.
313
320
  task.close_input
321
+
322
+ # The task has stopped if task.wait returns correctly.
314
323
  return task.wait
324
+ rescue Interrupt
325
+ # If task.wait is interrupted, we should also interrupt the child process
326
+ task.kill
315
327
  ensure
328
+ # Print out any remaining data from @output or @error
316
329
  task.close
317
330
  end
318
331
  else
@@ -320,7 +333,7 @@ module RExec
320
333
  end
321
334
  end
322
335
 
323
- def initialize(input, output, error, pid) # :nodoc:
336
+ def initialize(input, output, error, pid)
324
337
  @input = input
325
338
  @output = output
326
339
  @error = error
data/lib/rexec/version.rb CHANGED
@@ -22,7 +22,7 @@ module RExec
22
22
  module VERSION
23
23
  MAJOR = 1
24
24
  MINOR = 4
25
- TINY = 0
25
+ TINY = 1
26
26
 
27
27
  STRING = [MAJOR, MINOR, TINY].join('.')
28
28
  end
data/test/interrupt.rb ADDED
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ begin
4
+ sleep 100
5
+ rescue Interrupt
6
+ puts "Caught Interrupt"
7
+ end
data/test/server_test.rb CHANGED
@@ -35,7 +35,7 @@ class ServerTest < Test::Unit::TestCase
35
35
  connection_started = false
36
36
  object_received = false
37
37
 
38
- RExec::start_server(code.read, "ruby", :passthrough => []) do |conn, pid|
38
+ RExec::start_server(code.read, "ruby", :passthrough => []) do |conn, task|
39
39
  connection_started = true
40
40
  conn.send_object([:bounce, sobj])
41
41
 
@@ -66,7 +66,7 @@ class ServerTest < Test::Unit::TestCase
66
66
 
67
67
  test_obj = [1, 2, 3, 4, "five"]
68
68
 
69
- RExec::start_server(code.read, "/bin/sh -c ruby", :passthrough => []) do |conn, pid|
69
+ RExec::start_server(code.read, "/bin/sh -c ruby", :passthrough => []) do |conn, task|
70
70
  connection_started = true
71
71
  conn.send_object([:bounce, test_obj])
72
72
 
@@ -84,7 +84,7 @@ class ServerTest < Test::Unit::TestCase
84
84
 
85
85
  test_obj = [1, 2, 3, 4, "five"]
86
86
 
87
- conn, pid = RExec::start_server(code.read, "/bin/sh -c ruby", :passthrough => [])
87
+ conn, task = RExec::start_server(code.read, "/bin/sh -c ruby", :passthrough => [])
88
88
  conn.send_object([:bounce, test_obj])
89
89
 
90
90
  assert_equal test_obj, conn.receive_object
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rexec
3
3
  version: !ruby/object:Gem::Version
4
- hash: 7
4
+ hash: 5
5
5
  prerelease:
6
6
  segments:
7
7
  - 1
8
8
  - 4
9
- - 0
10
- version: 1.4.0
9
+ - 1
10
+ version: 1.4.1
11
11
  platform: ruby
12
12
  authors:
13
13
  - Samuel Williams
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-08-08 00:00:00 Z
18
+ date: 2011-08-09 00:00:00 Z
19
19
  dependencies: []
20
20
 
21
21
  description:
@@ -45,6 +45,7 @@ files:
45
45
  - test/client.rb
46
46
  - test/daemon.rb
47
47
  - test/daemon_test.rb
48
+ - test/interrupt.rb
48
49
  - test/listing_example.rb
49
50
  - test/remote_server_test.rb
50
51
  - test/server_test.rb