diff --git a/ChangeLog b/ChangeLog index e913ff96ed..94f7c0b8e8 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +Sat Mar 1 19:51:42 2014 Tanaka Akira + + * lib/open3.rb (Open3.capture3): Ignore Errno::EPIPE for writing + stdin_data. + (Open3.capture2): Ditto. + (Open3.capture2e): Ditto. + Sat Mar 1 19:06:47 2014 Eric Wong * gc.c (ruby_gc_set_params): simplify condition diff --git a/lib/open3.rb b/lib/open3.rb index a54e1b3886..7595265a93 100644 --- a/lib/open3.rb +++ b/lib/open3.rb @@ -257,7 +257,10 @@ module Open3 end out_reader = Thread.new { o.read } err_reader = Thread.new { e.read } - i.write stdin_data + begin + i.write stdin_data + rescue Errno::EPIPE + end i.close [out_reader.value, err_reader.value, t.value] } @@ -300,7 +303,10 @@ module Open3 o.binmode end out_reader = Thread.new { o.read } - i.write stdin_data + begin + i.write stdin_data + rescue Errno::EPIPE + end i.close [out_reader.value, t.value] } @@ -330,7 +336,10 @@ module Open3 oe.binmode end outerr_reader = Thread.new { oe.read } - i.write stdin_data + begin + i.write stdin_data + rescue Errno::EPIPE + end i.close [outerr_reader.value, t.value] } diff --git a/test/test_open3.rb b/test/test_open3.rb index 20e91c702a..cd63034f1e 100644 --- a/test/test_open3.rb +++ b/test/test_open3.rb @@ -149,6 +149,25 @@ class TestOpen3 < Test::Unit::TestCase assert(s.success?) end + def test_capture3_stdin_data + o, e, s = Open3.capture3(RUBY, '-e', '', :stdin_data=>"z"*(1024*1024)) + assert_equal("", o) + assert_equal("", e) + assert(s.success?) + end + + def test_capture2_stdin_data + o, s = Open3.capture2(RUBY, '-e', '', :stdin_data=>"z"*(1024*1024)) + assert_equal("", o) + assert(s.success?) + end + + def test_capture2e_stdin_data + oe, s = Open3.capture2e(RUBY, '-e', '', :stdin_data=>"z"*(1024*1024)) + assert_equal("", oe) + assert(s.success?) + end + def test_pipeline_rw Open3.pipeline_rw([RUBY, '-e', 'print STDIN.read + "1"'], [RUBY, '-e', 'print STDIN.read + "2"']) {|i,o,ts|