Skip to content

Commit

Permalink
Remove gem install hint when installing a gem fails
Browse files Browse the repository at this point in the history
A fresh `gem install` might not reproduce the exact `bundle install`
environment that originally caused the error. It also makes it harder
for the user to troubleshoot the error since she needs to run a separate
command.

Instead, show the original error and backtrace directly.
  • Loading branch information
deivid-rodriguez committed Jul 23, 2021
1 parent adbe55b commit 49c2abf
Show file tree
Hide file tree
Showing 3 changed files with 4 additions and 109 deletions.
14 changes: 1 addition & 13 deletions bundler/lib/bundler/installer/gem_installer.rb
Original file line number Diff line number Diff line change
Expand Up @@ -37,25 +37,13 @@ def specific_failure_message(e)
end

def failure_message
return install_error_message if spec.source.options["git"]
"#{install_error_message}\n#{gem_install_message}"
install_error_message
end

def install_error_message
"An error occurred while installing #{spec.name} (#{spec.version}), and Bundler cannot continue."
end

def gem_install_message
source = spec.source
return unless source.respond_to?(:remotes)

if source.remotes.size == 1
"Make sure that `gem install #{spec.name} -v '#{spec.version}' --source '#{source.remotes.first}'` succeeds before bundling."
else
"Make sure that `gem install #{spec.name} -v '#{spec.version}'` succeeds before bundling."
end
end

def spec_settings
# Fetch the build settings, if there are any
if settings = Bundler.settings["build.#{spec.name}"]
Expand Down
2 changes: 1 addition & 1 deletion bundler/spec/commands/install_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -448,7 +448,7 @@

expect(last_command.stdboth).not_to match(/Error Report/i)
expect(err).to include("An error occurred while installing ajp-rails (0.0.0), and Bundler cannot continue.").
and include("Make sure that `gem install ajp-rails -v '0.0.0' --source '#{file_uri_for(gem_repo2)}/'` succeeds before bundling.")
and include("Bundler::APIResponseInvalidDependenciesError")
end

it "doesn't blow up when the local .bundle/config is empty" do
Expand Down
97 changes: 2 additions & 95 deletions bundler/spec/install/failure_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

RSpec.describe "bundle install" do
context "installing a gem fails" do
it "prints out why that gem was being installed" do
it "prints out why that gem was being installed and the underlying error" do
build_repo2 do
build_gem "activesupport", "2.3.2" do |s|
s.extensions << "Rakefile"
Expand All @@ -18,102 +18,9 @@
source "#{file_uri_for(gem_repo2)}"
gem "rails"
G
expect(err).to start_with("Gem::Ext::BuildError: ERROR: Failed to build gem native extension.")
expect(err).to end_with(<<-M.strip)
An error occurred while installing activesupport (2.3.2), and Bundler cannot continue.
Make sure that `gem install activesupport -v '2.3.2' --source '#{file_uri_for(gem_repo2)}/'` succeeds before bundling.
In Gemfile:
rails was resolved to 2.3.2, which depends on
actionmailer was resolved to 2.3.2, which depends on
activesupport
M
end

context "when installing a git gem" do
it "does not tell the user to run 'gem install'" do
build_git "activesupport", "2.3.2", :path => lib_path("activesupport") do |s|
s.extensions << "Rakefile"
s.write "Rakefile", <<-RUBY
task :default do
abort "make installing activesupport-2.3.2 fail"
end
RUBY
end

install_gemfile <<-G, :raise_on_error => false
source "#{file_uri_for(gem_repo1)}"
gem "rails"
gem "activesupport", :git => "#{lib_path("activesupport")}"
G

expect(err).to end_with(<<-M.strip)
An error occurred while installing activesupport (2.3.2), and Bundler cannot continue.
In Gemfile:
rails was resolved to 2.3.2, which depends on
actionmailer was resolved to 2.3.2, which depends on
activesupport
M
end
end

context "when installing a gem using a git block" do
it "does not tell the user to run 'gem install'" do
build_git "activesupport", "2.3.2", :path => lib_path("activesupport") do |s|
s.extensions << "Rakefile"
s.write "Rakefile", <<-RUBY
task :default do
abort "make installing activesupport-2.3.2 fail"
end
RUBY
end

install_gemfile <<-G, :raise_on_error => false
source "#{file_uri_for(gem_repo1)}"
gem "rails"
git "#{lib_path("activesupport")}" do
gem "activesupport"
end
G

expect(err).to end_with(<<-M.strip)
An error occurred while installing activesupport (2.3.2), and Bundler cannot continue.
In Gemfile:
rails was resolved to 2.3.2, which depends on
actionmailer was resolved to 2.3.2, which depends on
activesupport
M
end
end

it "prints out the hint for the remote source when available" do
build_repo2 do
build_gem "activesupport", "2.3.2" do |s|
s.extensions << "Rakefile"
s.write "Rakefile", <<-RUBY
task :default do
abort "make installing activesupport-2.3.2 fail"
end
RUBY
end
end

build_repo4 do
build_gem "a"
end

install_gemfile <<-G, :raise_on_error => false
source "#{file_uri_for(gem_repo4)}"
source "#{file_uri_for(gem_repo2)}" do
gem "rails"
end
G
expect(err).to end_with(<<-M.strip)
An error occurred while installing activesupport (2.3.2), and Bundler cannot continue.
Make sure that `gem install activesupport -v '2.3.2' --source '#{file_uri_for(gem_repo2)}/'` succeeds before bundling.
In Gemfile:
rails was resolved to 2.3.2, which depends on
Expand Down

0 comments on commit 49c2abf

Please sign in to comment.