summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorDavid Rodriguez <deivid.rodriguez@riseup.net>2024-03-27 17:20:52 +0100
committergit <svn-admin@ruby-lang.org>2024-04-29 10:29:29 +0000
commit435f449b4e909b2a480b0c83e7cc4b0dac22bea3 (patch)
tree6eb1e562a0f9d411264d1f456238bad45ed15eb2 /lib
parent491195af0279537805d714ba437965ba38d44c29 (diff)
[rubygems/rubygems] Make sure to force latest resolvable version explicitly
To make sure we can always update to the latest resolvable version for each gem explicitly requested for update, we first run a full update, and then add explicit exact requirements to the resolved versions. This may lead into conflicts, but our resolver already automatically parses those and unlocks additional gems to fix them. https://github.com/rubygems/rubygems/commit/01c0bf34f0
Diffstat (limited to 'lib')
-rw-r--r--lib/bundler/definition.rb28
1 files changed, 26 insertions, 2 deletions
diff --git a/lib/bundler/definition.rb b/lib/bundler/definition.rb
index 3fe783acb5..22070b6b17 100644
--- a/lib/bundler/definition.rb
+++ b/lib/bundler/definition.rb
@@ -570,7 +570,9 @@ module Bundler
last_resolve = converge_locked_specs
remove_invalid_platforms!(current_dependencies)
packages = Resolver::Base.new(source_requirements, expanded_dependencies, last_resolve, @platforms, locked_specs: @originally_locked_specs, unlock: @gems_to_unlock, prerelease: gem_version_promoter.pre?)
- additional_base_requirements_for_resolve(packages, last_resolve)
+ packages = additional_base_requirements_to_prevent_downgrades(packages, last_resolve)
+ packages = additional_base_requirements_to_force_updates(packages)
+ packages
end
end
@@ -1015,7 +1017,7 @@ module Bundler
current == proposed
end
- def additional_base_requirements_for_resolve(resolution_packages, last_resolve)
+ def additional_base_requirements_to_prevent_downgrades(resolution_packages, last_resolve)
return resolution_packages unless @locked_gems && !sources.expired_sources?(@locked_gems.sources)
converge_specs(@originally_locked_specs - last_resolve).each do |locked_spec|
next if locked_spec.source.is_a?(Source::Path)
@@ -1024,6 +1026,28 @@ module Bundler
resolution_packages
end
+ def additional_base_requirements_to_force_updates(resolution_packages)
+ return resolution_packages if @explicit_unlocks.empty?
+ full_update = dup_for_full_unlock.resolve
+ @explicit_unlocks.each do |name|
+ version = full_update[name].first&.version
+ resolution_packages.base_requirements[name] = Gem::Requirement.new("= #{version}") if version
+ end
+ resolution_packages
+ end
+
+ def dup_for_full_unlock
+ unlocked_definition = self.class.new(@lockfile, @dependencies, @sources, true, @ruby_version, @optional_groups, @gemfiles)
+ unlocked_definition.resolution_mode = { "local" => !@remote }
+ unlocked_definition.setup_sources_for_resolve
+ unlocked_definition.gem_version_promoter.tap do |gvp|
+ gvp.level = gem_version_promoter.level
+ gvp.strict = gem_version_promoter.strict
+ gvp.pre = gem_version_promoter.pre
+ end
+ unlocked_definition
+ end
+
def remove_invalid_platforms!(dependencies)
return if Bundler.frozen_bundle?