From ac6b6c15e95ec08d2736bb86e32ba221c850dd4b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Rodr=C3=ADguez?= Date: Wed, 10 Jan 2024 22:45:29 +0100 Subject: [PATCH] Fix `bundle lock` edge case Bring lockfile up to date when `bundle lock --update foo --patch --strict` is given with an out of date lockfile. --- bundler/lib/bundler/resolver/package.rb | 13 +++++++-- bundler/spec/commands/lock_spec.rb | 36 +++++++++++++++++++++++++ 2 files changed, 47 insertions(+), 2 deletions(-) diff --git a/bundler/lib/bundler/resolver/package.rb b/bundler/lib/bundler/resolver/package.rb index 046132868359..5bcbccea0346 100644 --- a/bundler/lib/bundler/resolver/package.rb +++ b/bundler/lib/bundler/resolver/package.rb @@ -18,10 +18,19 @@ class Package def initialize(name, platforms, locked_specs:, unlock:, prerelease: false, dependency: nil) @name = name @platforms = platforms - @locked_version = locked_specs[name].first&.version @unlock = unlock - @dependency = dependency || Dependency.new(name, @locked_version) @top_level = !dependency.nil? + + locked_spec = locked_specs[name].first + + if @top_level + @locked_version = locked_spec.version if locked_spec && dependency.matches_spec?(locked_spec) + @dependency = dependency + else + @locked_version = locked_spec&.version + @dependency = Dependency.new(name, @locked_version) + end + @prerelease = @dependency.prerelease? || @locked_version&.prerelease? || prerelease ? :consider_first : :ignore end diff --git a/bundler/spec/commands/lock_spec.rb b/bundler/spec/commands/lock_spec.rb index 45582fc7cee4..ab987501728b 100644 --- a/bundler/spec/commands/lock_spec.rb +++ b/bundler/spec/commands/lock_spec.rb @@ -135,6 +135,42 @@ expect(read_lockfile).to eq(@lockfile) end + it "writes a lockfile when there is an outdated lockfile and --patch is used with a specific dependency" do + build_repo4 do + build_gem "playbook_ui", "13.14.0" + build_gem "playbook_ui", "13.15.0" + end + + gemfile <<-G + source "#{file_uri_for(gem_repo4)}" + gem "playbook_ui", "13.15.0" + G + + original_lockfile = <<~L + GEM + remote: #{file_uri_for(gem_repo4)}/ + specs: + playbook_ui (13.14.0) + + PLATFORMS + arm64-darwin-23 + + DEPENDENCIES + playbook_ui (= 13.14.0) + + BUNDLED WITH + #{Bundler::VERSION} + L + + lockfile original_lockfile + + simulate_platform "arm64-darwin-23" do + bundle "lock --update playbook_ui --patch --strict" + end + + expect(read_lockfile).to eq(original_lockfile.gsub("13.14.0", "13.15.0")) + end + it "does not fetch remote specs when using the --local option" do bundle "lock --update --local", raise_on_error: false