Sha256: c270d8a97b21429aec84f0e7f57dace926e49075e16c65c356daeb6ae5c9335c

Contents?: true

Size: 1.91 KB

Versions: 3

Compression:

Stored size: 1.91 KB

Contents

module RunLoop
  class Xcrun

    DEFAULT_OPTIONS =
          {
                :timeout => 10,
                :log_cmd => false
          }

    DEFAULT_TIMEOUT = 10

    # Raised when Xcrun fails.
    class XcrunError < RuntimeError; end

    attr_reader :stdin, :stdout, :stderr, :pid

    def exec(args, options={})
      merged_options = DEFAULT_OPTIONS.merge(options)

      timeout = merged_options[:timeout]

      unless args.is_a?(Array)
        raise ArgumentError,
              "Expected args '#{args}' to be an Array, but found '#{args.class}'"
      end

      @stdin, @stdout, out, @stderr, err, process_status, @pid, exit_status = nil

      cmd = "xcrun #{args.join(' ')}"

      # Don't see your log?
      # Commands are only logged when debugging.
      RunLoop.log_unix_cmd(cmd) if merged_options[:log_cmd]

      begin
        Timeout.timeout(timeout, TimeoutError) do
          @stdin, @stdout, @stderr, process_status = Open3.popen3('xcrun', *args)

          @pid = process_status.pid
          exit_status = process_status.value.exitstatus

          err = @stderr.read.force_encoding('utf-8').chomp
          err = nil if err == ''

          out = @stdout.read.force_encoding('utf-8').chomp
        end

        {
              :err => err,
              :out => out,
              :pid => pid,
              :exit_status => exit_status
        }
      rescue StandardError => e
        raise XcrunError, e
      ensure
        stdin.close if stdin && !stdin.closed?
        stdout.close if stdout && !stdout.closed?
        stderr.close if stderr && !stderr.closed?

        if pid
          terminator = RunLoop::ProcessTerminator.new(pid, 'TERM', cmd)
          unless terminator.kill_process
            terminator = RunLoop::ProcessTerminator.new(pid, 'KILL', cmd)
            terminator.kill_process
          end
        end

        if process_status
          process_status.join
        end
      end
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
run_loop-1.5.4 lib/run_loop/xcrun.rb
run_loop-1.5.3 lib/run_loop/xcrun.rb
run_loop-1.5.2 lib/run_loop/xcrun.rb