59 lines
1.2 KiB
Ruby
59 lines
1.2 KiB
Ruby
# Ruby 1.8.7-compatible backport of Open3::capture3
|
|
#
|
|
# via https://gist.github.com/vasi/8ffc21bc09ac8fe38f76
|
|
module RedmineGitRemote
|
|
module PoorMansCapture3
|
|
|
|
def self.capture3(*cmd)
|
|
# Force no shell expansion, by using a non-plain string. See ruby docs:
|
|
#
|
|
# `If the first argument is a two-element array, the first element is the
|
|
# command to be executed, and the second argument is used as the argv[0]
|
|
# value, which may show up in process listings.'
|
|
cmd[0] = [cmd[0], cmd[0]]
|
|
|
|
rout, wout = IO.pipe
|
|
rerr, werr = IO.pipe
|
|
|
|
pid = fork do
|
|
rerr.close
|
|
rout.close
|
|
STDERR.reopen(werr)
|
|
STDOUT.reopen(wout)
|
|
exec(*cmd)
|
|
end
|
|
|
|
wout.close
|
|
werr.close
|
|
|
|
out = rout.read
|
|
err = rerr.read
|
|
Process.wait(pid)
|
|
rout.close
|
|
rerr.close
|
|
return [out, err, $?]
|
|
end
|
|
|
|
def self.capture2(*cmd)
|
|
out, err, stat = capture3(*cmd)
|
|
STDERR.write err
|
|
return out, stat
|
|
end
|
|
|
|
def self.test(*cmd)
|
|
st, err, out = capture3(*cmd)
|
|
p st
|
|
p err
|
|
p out
|
|
puts
|
|
end
|
|
|
|
def self.run_tests
|
|
test('ls', '/var')
|
|
test('ls', '/foo')
|
|
test('lfhlkhladfla')
|
|
test('ls && ls')
|
|
end
|
|
end
|
|
end
|