diff options
| author | David RodrÃguez <deivid.rodriguez@riseup.net> | 2024-07-04 18:22:03 +0200 |
|---|---|---|
| committer | git <svn-admin@ruby-lang.org> | 2024-07-09 16:34:09 +0000 |
| commit | 140d8318dbafe2c7c112651389da0b3ef4fd8424 (patch) | |
| tree | 5837226084d7954240bf063f76d911fc3f0cbe50 /lib | |
| parent | e6c7a309d00839ef2b583b736654d9b9bee957d0 (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.rb | 7 | ||||
| -rw-r--r-- | lib/bundler/resolver.rb | 2 | ||||
| -rw-r--r-- | lib/bundler/resolver/package.rb | 4 |
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 |
