class Anywhere::Local

Public Instance Methods

do_execute(cmd, stdin_data = nil, stdout_io = nil) click to toggle source
# File lib/anywhere/local.rb, line 8
def do_execute(cmd, stdin_data = nil, stdout_io = nil)
  require "open3"
  result = Result.new(cmd)
  result.started!
  Open3.popen3(cmd) do |stdin, stdout, stderr, wait_thr|
    stdin.print stdin_data if stdin_data
    stdin.close
    while true
      streams, _ = IO.select([stdout, stderr], [], [], 1)
      break if streams.nil? || streams.all? { |s| s.eof? }
      streams.compact.each do |stream|
        stream.each do |line|
          if stream == stdout
            result.add_stdout(line.strip)
            if stdout_io
              stdout_io << line
            else
              logger.debug(line)
            end
          elsif stream == stderr
            result.add_stderr(line.strip)
            logger.error(line)
          end
        end
      end
    end
    result.exit_status = wait_thr.value.exitstatus
  end
  result.finished!
  if !result.success?
    raise ExecutionError.new(result)
  end
  result
end