Sha256: fbe74ce84a9e02b0f25d13be5e1dc4e122789a0cca77e8b3be115471ab3b33fd

Contents?: true

Size: 1.82 KB

Versions: 4

Compression:

Stored size: 1.82 KB

Contents

require 'singleton'
require 'fileutils'
require 'shellwords'

module Specinfra::Backend
  class Exec < Base
    def run_command(cmd, opts={})
      cmd = build_command(cmd)
      cmd = add_pre_command(cmd)
      stdout = with_env do
        `#{build_command(cmd)} 2>&1`
      end
      # In ruby 1.9, it is possible to use Open3.capture3, but not in 1.8
      # stdout, stderr, status = Open3.capture3(cmd)

      if @example
        @example.metadata[:command] = cmd
        @example.metadata[:stdout]  = stdout
      end

      CommandResult.new :stdout => stdout, :exit_status => $?.exitstatus
    end

    def copy_file(from, to)
      FileUtils.cp(from, to)
    end

    private
    def with_env
      keys = %w[BUNDLER_EDITOR BUNDLE_BIN_PATH BUNDLE_GEMFILE
          RUBYOPT GEM_HOME GEM_PATH GEM_CACHE]

      keys.each { |key| ENV["_SPECINFRA_#{key}"] = ENV[key] ; ENV.delete(key) }

      env = Specinfra.configuration.env || {}
      env[:LANG] ||= 'C'

      env.each do |key, value|
        key = key.to_s
        ENV["_SPECINFRA_#{key}"] = ENV[key];
        ENV[key] = value
      end

      yield
    ensure
      keys.each { |key| ENV[key] = ENV.delete("_SPECINFRA_#{key}") }
      env.each do |key, value|
        key = key.to_s
        ENV[key] = ENV.delete("_SPECINFRA_#{key}");
      end
    end

    def build_command(cmd)
      shell = Specinfra.configuration.shell || '/bin/sh'
      cmd = cmd.shelljoin if cmd.is_a?(Array)
      cmd = "#{shell.shellescape} -c #{cmd.shellescape}"

      path = Specinfra.configuration.path
      if path
        cmd = %Q{env PATH="#{path}" #{cmd}}
      end

      cmd
    end

    def add_pre_command(cmd)
      if Specinfra.configuration.pre_command
        pre_cmd = build_command(Specinfra.configuration.pre_command)
        "#{pre_cmd} && #{cmd}"
      else
        cmd
      end
    end
  end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
specinfra-2.0.0.beta36 lib/specinfra/backend/exec.rb
specinfra-2.0.0.beta35 lib/specinfra/backend/exec.rb
specinfra-2.0.0.beta34 lib/specinfra/backend/exec.rb
specinfra-2.0.0.beta33 lib/specinfra/backend/exec.rb