The subprocess namespace implements an interface similar to childprocess. The interface has been simplified to make it easier to use and does not depend on native code.
@api private
@!attribute [r] argv
@return [Array<String>] The command to be executed
@!attribute [rw] cwd
@return [String] The directory to be used as the cwd when executing the command.
@!attribute [w] logger
Allow calling processes to take ownership of execution logs by passing their own logger to the command being executed.
@!attribute [rw] #raise_on_fail
Determine whether #execute raises an error when the command exits with a non-zero exit status. @return [true, false]
Prepare the subprocess invocation.
@param argv [Array<String>] The argument vector to execute
# File lib/r10k/util/subprocess.rb, line 53 def initialize(argv) @argv = argv @raise_on_fail = false end
@return [Class < R10K::Util::Subprocess::Runner]
# File lib/r10k/util/subprocess.rb, line 18 def self.runner if R10K::Util::Platform.windows? R10K::Util::Subprocess::Runner::Windows elsif R10K::Util::Platform.jruby? R10K::Util::Subprocess::Runner::JRuby else R10K::Util::Subprocess::Runner::POSIX end end
Execute the given command and return the result of evaluation.
@api public @raise [R10K::Util::Subprocess::SubprocessError] if #raise_on_fail is
true and the command exited with a non-zero status.
@return [R10K::Util::Subprocess::Result]
# File lib/r10k/util/subprocess.rb, line 65 def execute subprocess = self.class.runner.new(@argv) subprocess.cwd = @cwd if @cwd logmsg = _("Starting process: %{args}") % {args: @argv.inspect} logmsg << "(cwd: #{@cwd})" if @cwd logger.debug2(logmsg) result = subprocess.run logger.debug2(_("Finished process:\n%{result}") % {result: result.format}) if @raise_on_fail && result.failed? raise SubprocessError.new(_("Command exited with non-zero exit code"), :result => result) end result end