You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
64 lines
1.3 KiB
64 lines
1.3 KiB
4 years ago
|
# frozen_string_literal: false
|
||
|
# Fix adapted from https://github.com/thoughtbot/terrapin/pull/5
|
||
|
|
||
|
module Terrapin
|
||
|
module MultiPipeExtensions
|
||
|
def read
|
||
|
read_streams(@stdout_in, @stderr_in)
|
||
|
end
|
||
|
|
||
|
def close_read
|
||
|
begin
|
||
|
@stdout_in.close
|
||
|
rescue IOError
|
||
|
# Do nothing
|
||
|
end
|
||
|
|
||
|
begin
|
||
|
@stderr_in.close
|
||
|
rescue IOError
|
||
|
# Do nothing
|
||
|
end
|
||
|
end
|
||
|
|
||
|
def read_streams(output, error)
|
||
|
@stdout_output = ''
|
||
|
@stderr_output = ''
|
||
|
|
||
|
read_fds = [output, error]
|
||
|
|
||
|
until read_fds.empty?
|
||
|
to_read, = IO.select(read_fds)
|
||
|
|
||
|
if to_read.include?(output)
|
||
|
@stdout_output << read_stream(output)
|
||
|
read_fds.delete(output) if output.closed?
|
||
|
end
|
||
|
|
||
|
if to_read.include?(error)
|
||
|
@stderr_output << read_stream(error)
|
||
|
read_fds.delete(error) if error.closed?
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
def read_stream(io)
|
||
|
result = ''
|
||
|
|
||
|
begin
|
||
|
while (partial_result = io.read_nonblock(8192))
|
||
|
result << partial_result
|
||
|
end
|
||
|
rescue EOFError, Errno::EPIPE
|
||
|
io.close
|
||
|
rescue Errno::EINTR, Errno::EWOULDBLOCK, Errno::EAGAIN
|
||
|
# Do nothing
|
||
|
end
|
||
|
|
||
|
result
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
Terrapin::CommandLine::MultiPipe.prepend(Terrapin::MultiPipeExtensions)
|