From fde1614670201e4a7f41522b507c0a3a6a7f8c46 Mon Sep 17 00:00:00 2001 From: Martin Afanasjew Date: Thu, 19 Nov 2015 05:37:07 +0100 Subject: [PATCH] utils: native rewrite of install_gem_setup_path! Setting the environment variable `HOMEBREW_RUBY_PATH` allows one to run Homebrew with a non-standard Ruby, even one that is not in `PATH`. This creates the problem that the `gem` in `PATH` might not be the right one to call, possibly leading to confusing results as the wrong RubyGems installation is queried/manipulated. Closes Homebrew/homebrew#46185. Signed-off-by: Mike McQuaid --- Library/Homebrew/utils.rb | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/Library/Homebrew/utils.rb b/Library/Homebrew/utils.rb index f50239a14f..5700314f28 100644 --- a/Library/Homebrew/utils.rb +++ b/Library/Homebrew/utils.rb @@ -190,12 +190,23 @@ module Homebrew require "rubygems" ENV["PATH"] = "#{Gem.user_dir}/bin:#{ENV["PATH"]}" - args = [gem] - args << "-v" << version if version + if Gem::Specification.find_all_by_name(gem, version).empty? + ohai "Installing or updating '#{gem}' gem" + install_args = %W[--no-ri --no-rdoc --user-install #{gem}] + install_args << "--version" << version if version - unless quiet_system "gem", "list", "--installed", *args - safe_system "gem", "install", "--no-ri", "--no-rdoc", - "--user-install", *args + # Do `gem install [...]` without having to spawn a separate process or + # having to find the right `gem` binary for the running Ruby interpreter. + require "rubygems/commands/install_command" + install_cmd = Gem::Commands::InstallCommand.new + install_cmd.handle_options(install_args) + exit_code = 1 # Should not matter as `install_cmd.execute` always throws. + begin + install_cmd.execute + rescue Gem::SystemExitException => e + exit_code = e.exit_code + end + odie "Failed to install/update the '#{gem}' gem." if exit_code != 0 end unless which executable