Sha256: d5a7517aa0c0e2ff7781dfc4b9f6d4f5ba4bf4e9f02259ea2ae1ccee3264bcfe

Contents?: true

Size: 1.33 KB

Versions: 1

Compression:

Stored size: 1.33 KB

Contents

require 'open3'
require 'shellwords'

module Packer
  class Runner
    class CommandExecutionError < StandardError
    end

    def self.run!(*args, quiet: false)
      cmd = Shellwords.shelljoin(args.flatten)
      status = 0
      stdout = ''
      stderr = ''
      if quiet
        # Run without streaming std* to any screen
        stdout, stderr, status = Open3.capture3(cmd)
      else
        # Run but stream as well as capture stdout to the screen
        # see: http://stackoverflow.com/a/1162850/83386
        Open3.popen3(cmd) do |_std_in, std_out, std_err, thread|
          # read each stream from a new thread
          Thread.new do
            until (raw = std_out.getc).nil? do
              stdout << raw
              $stdout.write raw.to_s
            end
          end
          Thread.new do
            until (raw_line = std_err.gets).nil? do
              stderr << raw_line
            end
          end

          thread.join # don't exit until the external process is done
          status = thread.value
        end
      end
      # rubocop:disable Style/NumericPredicate
      raise CommandExecutionError.new(stderr) unless status == 0
      stdout
    end

    def self.exec!(*args)
      cmd = Shellwords.shelljoin(args.flatten)
      logger.debug "Exec'ing: #{cmd}, in: #{Dir.pwd}"
      Kernel.exec cmd
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
packer-config-1.6.1 lib/packer/runner.rb