aboutsummaryrefslogtreecommitdiffstats
path: root/Library
diff options
context:
space:
mode:
authorMartin Afanasjew2015-11-19 05:37:07 +0100
committerMike McQuaid2015-11-20 14:00:45 +0000
commitfde1614670201e4a7f41522b507c0a3a6a7f8c46 (patch)
treea7191cee66581557b1093794485b930429dcecb6 /Library
parentaeb8aad1e046ad63886a77af3c3b234c83fae50c (diff)
downloadbrew-fde1614670201e4a7f41522b507c0a3a6a7f8c46.tar.bz2
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 <mike@mikemcquaid.com>
Diffstat (limited to 'Library')
-rw-r--r--Library/Homebrew/utils.rb23
1 files changed, 17 insertions, 6 deletions
diff --git a/Library/Homebrew/utils.rb b/Library/Homebrew/utils.rb
index f50239a14..5700314f2 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
-
- unless quiet_system "gem", "list", "--installed", *args
- safe_system "gem", "install", "--no-ri", "--no-rdoc",
- "--user-install", *args
+ 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
+
+ # 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