ruby/lib/bundler/setup.rb
David Rodríguez 299eb8d117 [rubygems/rubygems] Improve command suggestion when gems are missing
Previous attempt to use a full path when the running version is
different than the one that would be activated by default are different
was not correct.

This is because if this error happens in a `bundle exec` context, the
`Gem.loaded_specs` is cleared because we're in an exec'd process, so
will be always using a full path in these cases.

This alternative approach should do what I was expecting.

e0bb8bf51b
2023-12-16 10:06:07 +08:00

33 lines
1.2 KiB
Ruby

# frozen_string_literal: true
require_relative "shared_helpers"
if Bundler::SharedHelpers.in_bundle?
require_relative "../bundler"
if STDOUT.tty? || ENV["BUNDLER_FORCE_TTY"]
begin
Bundler.ui.silence { Bundler.setup }
rescue Bundler::BundlerError => e
Bundler.ui.error e.message
Bundler.ui.warn e.backtrace.join("\n") if ENV["DEBUG"]
if e.is_a?(Bundler::GemNotFound)
default_bundle = Gem.bin_path("bundler", "bundle")
current_bundle = Bundler::SharedHelpers.bundle_bin_path
suggested_bundle = default_bundle == current_bundle ? "bundle" : current_bundle
suggested_cmd = "#{suggested_bundle} install"
original_gemfile = Bundler.original_env["BUNDLE_GEMFILE"]
suggested_cmd += " --gemfile #{original_gemfile}" if original_gemfile
Bundler.ui.warn "Run `#{suggested_cmd}` to install missing gems."
end
exit e.status_code
end
else
Bundler.ui.silence { Bundler.setup }
end
# We might be in the middle of shelling out to rubygems
# (RUBYOPT=-rbundler/setup), so we need to give rubygems the opportunity of
# not being silent.
Gem::DefaultUserInteraction.ui = nil
end