summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSamuel Giddins <segiddins@segiddins.me>2016-08-11 15:07:40 -0500
committerSamuel Giddins <segiddins@segiddins.me>2016-08-12 11:30:39 -0500
commit21d8b78d744f18393bed07a3b631b31c3e055d74 (patch)
treebf7f782852ddfbe4129bf50c477e0391f647c4c2
parent1a1e21b2826ac47ac4089a82202bbddac7ac62df (diff)
downloadbundler-seg-ruby-1-8-open3.tar.gz
Re-implement Open3 for Ruby 1.8.7 to avoid segfaultsseg-ruby-1-8-open3
-rw-r--r--spec/support/open3.rb48
1 files changed, 48 insertions, 0 deletions
diff --git a/spec/support/open3.rb b/spec/support/open3.rb
new file mode 100644
index 0000000000..0fd0649cf8
--- /dev/null
+++ b/spec/support/open3.rb
@@ -0,0 +1,48 @@
+# frozen_string_literal: true
+module Spec
+ if RUBY_VERSION > "1.9"
+ require "open3"
+ Open3 = ::Open3
+ else
+ module Open3
+ def popen3(*cmd, &block)
+ opts = {}
+ opts = cmd.pop if cmd.last.is_a?(Hash)
+
+ in_r, in_w = IO.pipe
+ opts[:in] = in_r
+ in_w.sync = true
+
+ out_r, out_w = IO.pipe
+ opts[:out] = out_w
+
+ err_r, err_w = IO.pipe
+ opts[:err] = err_w
+
+ child_io = [in_r, out_w, err_w]
+ parent_io = [in_w, out_r, err_r]
+
+ pid = fork do
+ STDIN.reopen(in_r)
+ STDOUT.reopen(out_w)
+ STDERR.reopen(err_w)
+ exec(*cmd)
+ end
+
+ wait_thr = Process.detach(pid)
+ child_io.each(&:close)
+ result = parent_io + [wait_thr]
+ if block_given?
+ begin
+ return yield(*result)
+ ensure
+ parent_io.each {|io| io.close unless io.closed? }
+ wait_thr.join
+ end
+ end
+ result
+ end
+ module_function :popen3
+ end
+ end
+end