Skip to content

Commit

Permalink
[rubygems/rubygems] Give better conflict resolution advice
Browse files Browse the repository at this point in the history
This alternative really uses only the Gemfile, and can never end up
being absurd, because it will never be suggested when there's no
lockfile, and it suggests deleting the lockfile.

rubygems/rubygems@5d154dd50e
  • Loading branch information
deivid-rodriguez authored and matzbot committed May 31, 2022
1 parent 9241d75 commit e2b421d
Show file tree
Hide file tree
Showing 2 changed files with 65 additions and 4 deletions.
2 changes: 1 addition & 1 deletion lib/bundler/resolver.rb
Expand Up @@ -395,7 +395,7 @@ def version_conflict_message(e)
o << %(\n Current #{name} version:\n #{SharedHelpers.pretty_dependency(@metadata_requirements.find {|req| req.name == name })}\n\n)
elsif conflict.locked_requirement
o << "\n"
o << %(Running `bundle update` will rebuild your snapshot from scratch, using only\n)
o << %(Deleting your #{name_for_locking_dependency_source} file and running `bundle install` will rebuild your snapshot from scratch, using only\n)
o << %(the gems in your Gemfile, which may resolve the conflict.\n)
elsif !conflict.existing
o << "\n"
Expand Down
67 changes: 64 additions & 3 deletions spec/bundler/install/gems/flex_spec.rb
Expand Up @@ -156,7 +156,7 @@
end
end

describe "when Gemfile conflicts with lockfile" do
describe "when running bundle install and Gemfile conflicts with lockfile" do
before(:each) do
build_repo2
install_gemfile <<-G
Expand Down Expand Up @@ -190,7 +190,7 @@
expect(err).to match(/could not find gem 'rack-obama/i)
end

it "suggests bundle update when the Gemfile requires different versions than the lock" do
it "suggests deleting the Gemfile.lock file when the Gemfile requires different versions than the lock" do
bundle "config set force_ruby_platform true"

nice_error = <<-E.strip.gsub(/^ {8}/, "")
Expand All @@ -205,7 +205,7 @@
rack_middleware was resolved to 1.0, which depends on
rack (= 0.9.1)
Running `bundle update` will rebuild your snapshot from scratch, using only
Deleting your Gemfile.lock file and running `bundle install` will rebuild your snapshot from scratch, using only
the gems in your Gemfile, which may resolve the conflict.
E

Expand All @@ -214,6 +214,67 @@
end
end

describe "when running bundle update and Gemfile conflicts with lockfile" do
before(:each) do
build_repo4 do
build_gem "jekyll-feed", "0.16.0"
build_gem "jekyll-feed", "0.15.1"

build_gem "github-pages", "226" do |s|
s.add_dependency "jekyll-feed", "0.15.1"
end
end

install_gemfile <<-G
source "#{file_uri_for(gem_repo4)}"
gem "jekyll-feed", "~> 0.12"
G

puts lockfile
lockfile <<-L
GEM
remote: #{file_uri_for(gem_repo4)}/
specs:
jekyll-feed (0.16.0)
PLATFORMS
#{lockfile_platforms}
DEPENDENCIES
jekyll-feed
BUNDLED WITH
#{Bundler::VERSION}
L

gemfile <<-G
source "#{file_uri_for(gem_repo4)}"
gem "github-pages", "~> 226"
gem "jekyll-feed", "~> 0.12"
G
end

it "suggests deleting the Gemfile.lock file when the Gemfile requires different versions than the lock" do
nice_error = <<-E.strip.gsub(/^ {8}/, "")
Bundler could not find compatible versions for gem "jekyll-feed":
In snapshot (Gemfile.lock):
jekyll-feed (>= 0.16.0)
In Gemfile:
jekyll-feed (~> 0.12)
github-pages (~> 226) was resolved to 226, which depends on
jekyll-feed (= 0.15.1)
Deleting your Gemfile.lock file and running `bundle install` will rebuild your snapshot from scratch, using only
the gems in your Gemfile, which may resolve the conflict.
E

bundle :update, :raise_on_error => false
expect(err).to end_with(nice_error)
end
end

describe "subtler cases" do
before :each do
install_gemfile <<-G
Expand Down

0 comments on commit e2b421d

Please sign in to comment.