rexec 1.4.0 → 1.4.1

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.
@@ -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