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
|