summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorDavid Rodríguez <deivid.rodriguez@riseup.net>2024-07-04 18:22:03 +0200
committergit <svn-admin@ruby-lang.org>2024-07-09 16:34:09 +0000
commit140d8318dbafe2c7c112651389da0b3ef4fd8424 (patch)
tree5837226084d7954240bf063f76d911fc3f0cbe50 /lib
parente6c7a309d00839ef2b583b736654d9b9bee957d0 (diff)
[rubygems/rubygems] Fix generic platform gems getting incorrectly removed when locked for a specific platform
If they are already in the lockfile as the most specific variant for a platform, we shouldn't change that unless explicitly unlocking. https://github.com/rubygems/rubygems/commit/a901660498
Diffstat (limited to 'lib')
-rw-r--r--lib/bundler/gem_helpers.rb7
-rw-r--r--lib/bundler/resolver.rb2
-rw-r--r--lib/bundler/resolver/package.rb4
3 files changed, 11 insertions, 2 deletions
diff --git a/lib/bundler/gem_helpers.rb b/lib/bundler/gem_helpers.rb
index c27ceb360a..70ccceb491 100644
--- a/lib/bundler/gem_helpers.rb
+++ b/lib/bundler/gem_helpers.rb
@@ -46,13 +46,18 @@ module Bundler
end
module_function :platform_specificity_match
- def select_best_platform_match(specs, platform, force_ruby: false)
+ def select_best_platform_match(specs, platform, force_ruby: false, prefer_locked: false)
matching = if force_ruby
specs.select {|spec| spec.match_platform(Gem::Platform::RUBY) && spec.force_ruby_platform! }
else
specs.select {|spec| spec.match_platform(platform) }
end
+ if prefer_locked
+ locked_originally = matching.select {|spec| spec.is_a?(LazySpecification) }
+ return locked_originally if locked_originally.any?
+ end
+
sort_best_platform_match(matching, platform)
end
module_function :select_best_platform_match
diff --git a/lib/bundler/resolver.rb b/lib/bundler/resolver.rb
index b640eaf81b..2be7af94a2 100644
--- a/lib/bundler/resolver.rb
+++ b/lib/bundler/resolver.rb
@@ -255,7 +255,7 @@ module Bundler
results = filter_matching_specs(results, locked_requirement) if locked_requirement
results.group_by(&:version).reduce([]) do |groups, (version, specs)|
- platform_specs = package.platforms.map {|platform| select_best_platform_match(specs, platform) }
+ platform_specs = package.platform_specs(specs)
# If package is a top-level dependency,
# candidate is only valid if there are matching versions for all resolution platforms.
diff --git a/lib/bundler/resolver/package.rb b/lib/bundler/resolver/package.rb
index 0461328683..16c43d05af 100644
--- a/lib/bundler/resolver/package.rb
+++ b/lib/bundler/resolver/package.rb
@@ -25,6 +25,10 @@ module Bundler
@prerelease = @dependency.prerelease? || @locked_version&.prerelease? || prerelease ? :consider_first : :ignore
end
+ def platform_specs(specs)
+ platforms.map {|platform| GemHelpers.select_best_platform_match(specs, platform, prefer_locked: !unlock?) }
+ end
+
def to_s
@name.delete("\0")
end