Sha256: 5ae121e95039d003e7d4d3d1c3aff77c0d05254fe3728f56436a10acc8918a5b

Contents?: true

Size: 1.64 KB

Versions: 107

Compression:

Stored size: 1.64 KB

Contents

require 'open3'

module RVM
  module Shell
    # Implementation of the abstract wrapper class that opens a new
    # instance of bash when a command is run, only keeping it around
    # for the lifetime of the command. Possibly inefficient but for
    # the moment simplest and hence default implementation.
    class SingleShotWrapper < AbstractWrapper

      attr_accessor :current

      # Runs a given command in the current shell.
      # Defaults the command to true if empty.
      def run_command(command)
        command = "true" if command.to_s.strip.empty?
        with_shell_instance do
          stdin.puts wrapped_command(command)
          stdin.close
          out, err = stdout.read, stderr.read
          out, status, _ = raw_stdout_to_parts(out)
          return status, out, err
        end
      end

      # Runs a command, ensuring no output is collected.
      def run_command_silently(command)
        with_shell_instance do
          stdin.puts silent_command(command)
        end
      end

      protected

      # yields stdio, stderr and stdin for a shell instance.
      # If there isn't a current shell instance, it will create a new one.
      # In said scenario, it will also cleanup once it is done.
      def with_shell_instance(&blk)
        no_current = @current.nil?
        if no_current
          @current = Open3.popen3(self.shell_executable)
          invoke_setup!
        end
        yield
      ensure
        @current = nil if no_current
      end

      # Direct access to each of the named descriptors
      def stdin;  @current[0]; end
      def stdout; @current[1]; end
      def stderr; @current[2]; end

    end
  end
end

Version data entries

107 entries across 107 versions & 2 rubygems

Version Path
rvm-1.6.32 lib/rvm/shell/single_shot_wrapper.rb
rvm-1.6.31 lib/rvm/shell/single_shot_wrapper.rb
rvm-1.6.30 lib/rvm/shell/single_shot_wrapper.rb
rvm-1.6.29 lib/rvm/shell/single_shot_wrapper.rb
rvm-1.6.27 lib/rvm/shell/single_shot_wrapper.rb
rvm-1.6.24 lib/rvm/shell/single_shot_wrapper.rb
rvm-1.6.23 lib/rvm/shell/single_shot_wrapper.rb
rvm-1.6.22 lib/rvm/shell/single_shot_wrapper.rb
rvm-1.6.21 lib/rvm/shell/single_shot_wrapper.rb
rvm-1.6.20 lib/rvm/shell/single_shot_wrapper.rb
rvm-1.6.19 lib/rvm/shell/single_shot_wrapper.rb
rvm-1.6.16 lib/rvm/shell/single_shot_wrapper.rb
rvm-1.6.13 lib/rvm/shell/single_shot_wrapper.rb
rvm-1.6.12 lib/rvm/shell/single_shot_wrapper.rb
rvm-1.6.11 lib/rvm/shell/single_shot_wrapper.rb
rvm-1.6.10 lib/rvm/shell/single_shot_wrapper.rb
rvm-1.6.9 lib/rvm/shell/single_shot_wrapper.rb
rvm-1.6.8 lib/rvm/shell/single_shot_wrapper.rb
rvm-1.6.7 lib/rvm/shell/single_shot_wrapper.rb
rvm-1.6.6 lib/rvm/shell/single_shot_wrapper.rb