From 086cde1651902abb758184f1eadbbfb367b2fedf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Rodr=C3=ADguez?= Date: Wed, 3 Jul 2024 20:17:59 +0200 Subject: [PATCH] [rubygems/rubygems] Instantiate `Resolver::SpecGroup` with explicit priority https://github.com/rubygems/rubygems/commit/e2c1bc1b6c --- lib/bundler/resolver.rb | 8 ++++---- lib/bundler/resolver/candidate.rb | 18 +++--------------- .../bundler/resolver/candidate_spec.rb | 19 +++++++++---------- 3 files changed, 16 insertions(+), 29 deletions(-) diff --git a/lib/bundler/resolver.rb b/lib/bundler/resolver.rb index ba52712d15..c546eaa2b3 100644 --- a/lib/bundler/resolver.rb +++ b/lib/bundler/resolver.rb @@ -273,11 +273,11 @@ module Bundler platform_specs.uniq! ruby_specs = select_best_platform_match(specs, Gem::Platform::RUBY) - groups << Resolver::Candidate.new(version, specs: ruby_specs) if ruby_specs.any? + groups << Resolver::Candidate.new(version, specs: ruby_specs, priority: -1) if ruby_specs.any? next groups if platform_specs == ruby_specs || package.force_ruby_platform? - groups << Resolver::Candidate.new(version, specs: platform_specs) + groups << Resolver::Candidate.new(version, specs: platform_specs, priority: 1) groups end @@ -432,8 +432,8 @@ module Bundler def requirement_to_range(requirement) ranges = requirement.requirements.map do |(op, version)| - ver = Resolver::Candidate.new(version).generic! - platform_ver = Resolver::Candidate.new(version).platform_specific! + ver = Resolver::Candidate.new(version, priority: -1) + platform_ver = Resolver::Candidate.new(version, priority: 1) case op when "~>" diff --git a/lib/bundler/resolver/candidate.rb b/lib/bundler/resolver/candidate.rb index 9e8b913335..debf73584d 100644 --- a/lib/bundler/resolver/candidate.rb +++ b/lib/bundler/resolver/candidate.rb @@ -24,10 +24,10 @@ module Bundler attr_reader :version - def initialize(version, specs: []) + def initialize(version, specs: [], priority: -1) @spec_group = Resolver::SpecGroup.new(specs) @version = Gem::Version.new(version) - @ruby_only = specs.map(&:platform).uniq == [Gem::Platform::RUBY] + @priority = priority end def dependencies @@ -40,18 +40,6 @@ module Bundler @spec_group.to_specs(package.force_ruby_platform?) end - def generic! - @ruby_only = true - - self - end - - def platform_specific! - @ruby_only = false - - self - end - def prerelease? @version.prerelease? end @@ -61,7 +49,7 @@ module Bundler end def sort_obj - [@version, @ruby_only ? -1 : 1] + [@version, @priority] end def <=>(other) diff --git a/spec/bundler/bundler/resolver/candidate_spec.rb b/spec/bundler/bundler/resolver/candidate_spec.rb index f7b378d32b..aefad3316e 100644 --- a/spec/bundler/bundler/resolver/candidate_spec.rb +++ b/spec/bundler/bundler/resolver/candidate_spec.rb @@ -2,20 +2,19 @@ RSpec.describe Bundler::Resolver::Candidate do it "compares fine" do - version1 = described_class.new("1.12.5", specs: [Gem::Specification.new("foo", "1.12.5") {|s| s.platform = Gem::Platform::RUBY }]) - version2 = described_class.new("1.12.5") # passing no specs creates a platform specific candidate, so sorts higher + version1 = described_class.new("1.12.5", priority: -1) + version2 = described_class.new("1.12.5", priority: 1) - expect(version2 >= version1).to be true + expect(version2 > version1).to be true - expect(version1.generic! == version2.generic!).to be true - expect(version1.platform_specific! == version2.platform_specific!).to be true + version1 = described_class.new("1.12.5") + version2 = described_class.new("1.12.5") - expect(version1.platform_specific! >= version2.generic!).to be true - expect(version2.platform_specific! >= version1.generic!).to be true + expect(version2 == version1).to be true - version1 = described_class.new("1.12.5", specs: [Gem::Specification.new("foo", "1.12.5") {|s| s.platform = Gem::Platform::RUBY }]) - version2 = described_class.new("1.12.5", specs: [Gem::Specification.new("foo", "1.12.5") {|s| s.platform = Gem::Platform::X64_LINUX }]) + version1 = described_class.new("1.12.5", priority: 1) + version2 = described_class.new("1.12.5", priority: -1) - expect(version2 >= version1).to be true + expect(version2 < version1).to be true end end