diff options
| author | David RodrÃguez <deivid.rodriguez@riseup.net> | 2024-07-04 13:55:52 +0200 |
|---|---|---|
| committer | git <svn-admin@ruby-lang.org> | 2024-07-09 16:34:08 +0000 |
| commit | dd05191bc35e06f82311fc630c3cc917595e2b71 (patch) | |
| tree | 3e446a7a9ad823198f2d5a2665c776cbef696ce2 /lib | |
| parent | 00acc703483021d7bcc0a0bc284c29acec199cd2 (diff) | |
[rubygems/rubygems] Resolve all platforms directly
Instead of having to do a complete pass after resolve.
To do this, we add to the ruby group all the platform specs with the
same dependencies as the ruby specs.
https://github.com/rubygems/rubygems/commit/e50415f2a6
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/bundler/definition.rb | 2 | ||||
| -rw-r--r-- | lib/bundler/resolver.rb | 22 | ||||
| -rw-r--r-- | lib/bundler/resolver/base.rb | 4 | ||||
| -rw-r--r-- | lib/bundler/resolver/candidate.rb | 4 | ||||
| -rw-r--r-- | lib/bundler/resolver/spec_group.rb | 20 | ||||
| -rw-r--r-- | lib/bundler/spec_set.rb | 18 |
6 files changed, 51 insertions, 19 deletions
diff --git a/lib/bundler/definition.rb b/lib/bundler/definition.rb index d332fceb54..da8d374627 100644 --- a/lib/bundler/definition.rb +++ b/lib/bundler/definition.rb @@ -638,8 +638,6 @@ module Bundler @platforms = result.add_extra_platforms!(platforms) if should_add_extra_platforms? - result.complete_platforms!(platforms) - SpecSet.new(result.for(dependencies, false, @platforms)) end diff --git a/lib/bundler/resolver.rb b/lib/bundler/resolver.rb index c546eaa2b3..b640eaf81b 100644 --- a/lib/bundler/resolver.rb +++ b/lib/bundler/resolver.rb @@ -79,7 +79,8 @@ module Bundler def solve_versions(root:, logger:) solver = PubGrub::VersionSolver.new(source: self, root: root, logger: logger) result = solver.solve - result.map {|package, version| version.to_specs(package) }.flatten + resolved_specs = result.map {|package, version| version.to_specs(package) }.flatten + resolved_specs |= @base.specs_compatible_with(SpecSet.new(resolved_specs)) rescue PubGrub::SolveFailure => e incompatibility = e.incompatibility @@ -269,15 +270,22 @@ module Bundler next groups if platform_specs.all?(&:empty?) end - platform_specs.flatten! - platform_specs.uniq! - ruby_specs = select_best_platform_match(specs, Gem::Platform::RUBY) - groups << Resolver::Candidate.new(version, specs: ruby_specs, priority: -1) if ruby_specs.any? + ruby_group = Resolver::SpecGroup.new(ruby_specs) + + unless ruby_group.empty? + platform_specs.each do |specs| + ruby_group.merge(Resolver::SpecGroup.new(specs)) + end + + groups << Resolver::Candidate.new(version, group: ruby_group, priority: -1) + next groups if package.force_ruby_platform? + end - next groups if platform_specs == ruby_specs || package.force_ruby_platform? + platform_group = Resolver::SpecGroup.new(platform_specs.flatten.uniq) + next groups if platform_group == ruby_group - groups << Resolver::Candidate.new(version, specs: platform_specs, priority: 1) + groups << Resolver::Candidate.new(version, group: platform_group, priority: 1) groups end diff --git a/lib/bundler/resolver/base.rb b/lib/bundler/resolver/base.rb index ad19eeb3f4..b0c5c58047 100644 --- a/lib/bundler/resolver/base.rb +++ b/lib/bundler/resolver/base.rb @@ -30,6 +30,10 @@ module Bundler end.compact end + def specs_compatible_with(result) + @base.specs_compatible_with(result) + end + def [](name) @base[name] end diff --git a/lib/bundler/resolver/candidate.rb b/lib/bundler/resolver/candidate.rb index debf73584d..f593fc5d61 100644 --- a/lib/bundler/resolver/candidate.rb +++ b/lib/bundler/resolver/candidate.rb @@ -24,8 +24,8 @@ module Bundler attr_reader :version - def initialize(version, specs: [], priority: -1) - @spec_group = Resolver::SpecGroup.new(specs) + def initialize(version, group: nil, priority: -1) + @spec_group = group || SpecGroup.new([]) @version = Gem::Version.new(version) @priority = priority end diff --git a/lib/bundler/resolver/spec_group.rb b/lib/bundler/resolver/spec_group.rb index 6edff11303..f950df6eda 100644 --- a/lib/bundler/resolver/spec_group.rb +++ b/lib/bundler/resolver/spec_group.rb @@ -3,6 +3,8 @@ module Bundler class Resolver class SpecGroup + attr_reader :specs + def initialize(specs) @specs = specs end @@ -38,7 +40,19 @@ module Bundler def dependencies @dependencies ||= @specs.map do |spec| __dependencies(spec) + metadata_dependencies(spec) - end.flatten.uniq + end.flatten.uniq.sort + end + + def ==(other) + sorted_spec_names == other.sorted_spec_names + end + + def merge(other) + return false unless equivalent?(other) + + @specs |= other.specs + + true end protected @@ -49,6 +63,10 @@ module Bundler private + def equivalent?(other) + name == other.name && version == other.version && source == other.source && dependencies == other.dependencies + end + def exemplary_spec @specs.first end diff --git a/lib/bundler/spec_set.rb b/lib/bundler/spec_set.rb index 2933d28450..644d0f3866 100644 --- a/lib/bundler/spec_set.rb +++ b/lib/bundler/spec_set.rb @@ -71,12 +71,6 @@ module Bundler platforms end - def complete_platforms!(platforms) - platforms.each do |platform| - complete_platform(platform) - end - end - def validate_deps(s) s.runtime_dependencies.each do |dep| next if dep.name == "bundler" @@ -158,6 +152,12 @@ module Bundler @specs.detect {|spec| spec.name == name && spec.match_platform(platform) } end + def specs_compatible_with(other) + select do |spec| + other.valid?(spec) + end + end + def delete_by_name(name) @specs.reject! {|spec| spec.name == name } @@ -195,6 +195,10 @@ module Bundler lookup.keys end + def valid?(s) + s.matches_current_metadata? && valid_dependencies?(s) + end + private def reset! @@ -209,7 +213,7 @@ module Bundler spec = specs.first matching_specs = spec.source.specs.search([spec.name, spec.version]) platform_spec = GemHelpers.select_best_platform_match(matching_specs, platform).find do |s| - s.matches_current_metadata? && valid_dependencies?(s) + valid?(s) end if platform_spec |
