1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

[ruby/open3] Update to match JRuby 9.4

This allows the wrapper functions in the main open3 to be defined
while using our ProcessBuilder logic for the internal popen
implementation.

Note this adds logic to reject redirects from a numeric fd to a
live IO object (or not a String or to_path object) since we cannot
support direct IO redirects with ProcesBuilder.

This patch allows tests to complete with the ProcessBuilder impl.
Only three tests fail:

* test_numeric_file_descriptor2 and test_numeric_file_descriptor2
  fail due to redirecting streams to a pipe IO.
* test_pid fails expecting a real PID which we cannot provide via
  ProcessBuilder.

https://github.com/ruby/open3/commit/73f986c233
This commit is contained in:
Charles Oliver Nutter 2021-09-30 10:38:25 -05:00 committed by Hiroshi SHIBATA
parent 01febcab3e
commit eb06b37c46
No known key found for this signature in database
GPG key ID: F9CF13417264FAC2
2 changed files with 13 additions and 5 deletions

View file

@ -31,12 +31,8 @@
require 'open3/version' require 'open3/version'
if RUBY_ENGINE == 'jruby' && JRuby::Util::ON_WINDOWS
require_relative 'open3/jruby_windows'
return
end
module Open3 module Open3
# Open stdin, stdout, and stderr streams and start external executable. # Open stdin, stdout, and stderr streams and start external executable.
# In addition, a thread to wait for the started process is created. # In addition, a thread to wait for the started process is created.
# The thread has a pid method and a thread variable :pid which is the pid of # The thread has a pid method and a thread variable :pid which is the pid of
@ -763,3 +759,6 @@ module Open3
end end
end end
# JRuby uses different popen logic on Windows, require it here to reuse wrapper methods above.
require 'open3/jruby_windows' if RUBY_ENGINE == 'jruby' && JRuby::Util::ON_WINDOWS

View file

@ -57,6 +57,15 @@ module Open3
module_function :popen2e module_function :popen2e
def processbuilder_run(cmd, opts, build: nil, io:) def processbuilder_run(cmd, opts, build: nil, io:)
opts.each do |k, v|
if Integer === k
if IO == v || !(String === v || v.respond_to?(:to_path))
# target is an open IO or a non-pathable object, bail out
raise NotImplementedError.new("redirect to an open IO is not implemented on this platform")
end
end
end
if Hash === cmd[0] if Hash === cmd[0]
env = cmd.shift; env = cmd.shift;
else else