Sha256: 1a2c0d389732a0ac1e07f13158e6321f6c359d60a270b57a128316a6843151ad

Contents?: true

Size: 1.29 KB

Versions: 4

Compression:

Stored size: 1.29 KB

Contents

require "open3"
require_relative "capture"

module Vectory
  class SystemCall
    TIMEOUT = 60

    attr_reader :status, :stdout, :stderr, :cmd

    def initialize(cmd, timeout = TIMEOUT)
      @cmd = cmd
      @timeout = timeout
    end

    def call
      log_cmd(@cmd)

      execute(@cmd)

      log_result

      raise_error unless @status.success?

      self
    end

    private

    def log_cmd(cmd)
      Vectory.ui.debug("Cmd: '#{cmd}'")
    end

    def execute(cmd)
      result = Capture.with_timeout(cmd,
                                    timeout: @timeout,
                                    signal: :KILL, # only KILL works on Windows
                                    kill_after: @timeout)
      @stdout = result[:stdout]
      @stderr = result[:stderr]
      @status = result[:status]
    rescue Errno::ENOENT => e
      raise SystemCallError, e.inspect
    end

    def log_result
      Vectory.ui.debug("Status: #{@status.inspect}")
      Vectory.ui.debug("Stdout: '#{@stdout.strip}'")
      Vectory.ui.debug("Stderr: '#{@stderr.strip}'")
    end

    def raise_error
      raise SystemCallError,
            "Failed to run #{@cmd},\n  " \
            "status: #{@status.exitstatus},\n  " \
            "stdout: '#{@stdout.strip}',\n  " \
            "stderr: '#{@stderr.strip}'"
    end
  end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
vectory-0.7.7 lib/vectory/system_call.rb
vectory-0.7.5 lib/vectory/system_call.rb
vectory-0.7.4 lib/vectory/system_call.rb
vectory-0.7.3 lib/vectory/system_call.rb