class FastlaneCore::FastlanePty

Public Class Methods

spawn(command) { |command_stdout, command_stdin, pid| ... } click to toggle source
# File fastlane_core/lib/fastlane_core/fastlane_pty.rb, line 22
def self.spawn(command)
  require 'pty'
  PTY.spawn(command) do |command_stdout, command_stdin, pid|
    begin
      yield(command_stdout, command_stdin, pid)
    rescue Errno::EIO
      # Exception ignored intentionally.
      # https://stackoverflow.com/questions/10238298/ruby-on-linux-pty-goes-away-without-eof-raises-errnoeio
      # This is expected on some linux systems, that indicates that the subcommand finished
      # and we kept trying to read, ignore it
    ensure
      begin
        Process.wait(pid)
      rescue Errno::ECHILD, PTY::ChildExited
        # The process might have exited.
      end
    end
  end
  $?.exitstatus
rescue LoadError
  require 'open3'
  Open3.popen2e(command) do |command_stdin, command_stdout, p| # note the inversion
    yield(command_stdout, command_stdin, p.value.pid)

    command_stdin.close
    command_stdout.close
    p.value.exitstatus
  end
rescue StandardError => e
  # Wrapping any error in FastlanePtyError to allow
  # callers to see and use $?.exitstatus that
  # would usually get returned
  raise FastlanePtyError.new(e, $?.exitstatus)
end