Sha256: d01c74deb6c64c05cc02d0844ceffe2f6b9a446b4573fe4b6615509adec6f967

Contents?: true

Size: 1.28 KB

Versions: 4

Compression:

Stored size: 1.28 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}"
            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
      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

4 entries across 4 versions & 1 rubygems

Version Path
packer-config-1.6.0 lib/packer/runner.rb
packer-config-1.5.0 lib/packer/runner.rb
packer-config-1.4.0 lib/packer/runner.rb
packer-config-1.3.1 lib/packer/runner.rb