From 5ef1dc036934efe8dcdba042fd3e876b0cce92b1 Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Thu, 7 May 2026 20:43:28 +0900 Subject: [ruby/rubygems] Preserve overrides when SpecSet self-derives a validation set SpecSet#incomplete_specs_for_platform constructed a fresh self.class.new(@specs) for platform validation but never copied @overrides. Platform-validity decisions therefore evaluated strict required_ruby_version / required_rubygems_version metadata even when resolution was running with overrides, so a metadata override could allow a gem everywhere except platform validation, where the platform might be marked incomplete and pruned. Carry @overrides forward via with_overrides on the cloned SpecSet. https://github.com/ruby/rubygems/commit/11b7c58a5a Co-Authored-By: Claude Opus 4.7 (1M context) --- lib/bundler/spec_set.rb | 2 +- spec/bundler/bundler/spec_set_spec.rb | 26 ++++++++++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/lib/bundler/spec_set.rb b/lib/bundler/spec_set.rb index 84f20d90d0..163e16863b 100644 --- a/lib/bundler/spec_set.rb +++ b/lib/bundler/spec_set.rb @@ -155,7 +155,7 @@ module Bundler def incomplete_specs_for_platform(deps, platform) return [] if @specs.empty? - validation_set = self.class.new(@specs) + validation_set = self.class.new(@specs).with_overrides(@overrides) validation_set.for(deps, [platform]) validation_set.incomplete_specs end diff --git a/spec/bundler/bundler/spec_set_spec.rb b/spec/bundler/bundler/spec_set_spec.rb index d69d0bf8fd..dce86793b9 100644 --- a/spec/bundler/bundler/spec_set_spec.rb +++ b/spec/bundler/bundler/spec_set_spec.rb @@ -92,4 +92,30 @@ RSpec.describe Bundler::SpecSet do ] end end + + describe "#with_overrides" do + it "defaults to an empty override list" do + expect(described_class.new([]).overrides).to eq([]) + end + + it "stores the overrides supplied" do + override = Bundler::Override.new("rails", :version, ">= 8.0") + expect(described_class.new([]).with_overrides([override]).overrides).to eq([override]) + end + + it "treats nil as an empty override list" do + set = described_class.new([]) + override = Bundler::Override.new("rails", :version, ">= 8.0") + set.with_overrides([override]) + set.with_overrides(nil) + expect(set.overrides).to eq([]) + end + + it "cascades overrides to contained specs that accept them" do + lazy = Bundler::LazySpecification.new("rails", "8.0", Gem::Platform::RUBY) + override = Bundler::Override.new("rails", :version, ">= 8.0") + described_class.new([lazy]).with_overrides([override]) + expect(lazy.overrides).to eq([override]) + end + end end -- cgit v1.2.3