diff options
author | David RodrÃguez <deivid.rodriguez@riseup.net> | 2023-10-04 20:08:49 +0200 |
---|---|---|
committer | Hiroshi SHIBATA <hsbt@ruby-lang.org> | 2023-10-16 13:52:57 +0900 |
commit | 77ffa1a7c3af797078b2a8e84bfc6f2b0ba67820 (patch) | |
tree | b0c00647d046bb56d3c9ead6e73493a71b6708b1 /lib/bundler/resolver.rb | |
parent | 73ba4b76c20931ad5c786de3ae3ad92523bc1443 (diff) |
[rubygems/rubygems] Raise an error when top level dependency does not resolve under all locked platforms
https://github.com/rubygems/rubygems/commit/25304f3e8d
Diffstat (limited to 'lib/bundler/resolver.rb')
-rw-r--r-- | lib/bundler/resolver.rb | 18 |
1 files changed, 16 insertions, 2 deletions
diff --git a/lib/bundler/resolver.rb b/lib/bundler/resolver.rb index 82e08291a7..9ec39d5a35 100644 --- a/lib/bundler/resolver.rb +++ b/lib/bundler/resolver.rb @@ -248,8 +248,22 @@ module Bundler results = filter_matching_specs(results, locked_requirement) if locked_requirement versions = results.group_by(&:version).reduce([]) do |groups, (version, specs)| - platform_specs = package.platforms.flat_map {|platform| select_best_platform_match(specs, platform) } - next groups if platform_specs.empty? + platform_specs = package.platforms.map {|platform| select_best_platform_match(specs, platform) } + + # If package is a top-level dependency, + # candidate is only valid if there are matching versions for all resolution platforms. + # + # If package is not a top-level deependency, + # then it's not necessary that it has matching versions for all platforms, since it may have been introduced only as + # a dependency for a platform specific variant, so it will only need to have a valid version for that platform. + # + if package.top_level? + next groups if platform_specs.any?(&:empty?) + else + next groups if platform_specs.all?(&:empty?) + end + + platform_specs.flatten! ruby_specs = select_best_platform_match(specs, Gem::Platform::RUBY) groups << Resolver::Candidate.new(version, :specs => ruby_specs) if ruby_specs.any? |