Skip to content

Commit 853e00f

Browse files
hsbtclaude
andcommitted
Apply per-gem metadata overrides in Resolver
When a spec's runtime dependencies are gathered for the resolver, its required_ruby_version / required_rubygems_version metadata flow as synthetic Ruby\0 / RubyGems\0 dependencies. Rewrite those before they reach the dependency hash so per-gem overrides on those fields take effect during resolution. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent f9e4d7b commit 853e00f

1 file changed

Lines changed: 20 additions & 1 deletion

File tree

bundler/lib/bundler/resolver.rb

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,9 @@ def setup_solver
6464

6565
@cached_dependencies = Hash.new do |dependencies, package|
6666
dependencies[package] = Hash.new do |versions, version|
67-
versions[version] = to_dependency_hash(version.dependencies.reject {|d| d.name == package.name }, @packages)
67+
deps = version.dependencies.reject {|d| d.name == package.name }
68+
deps = apply_metadata_overrides(deps, package.name)
69+
versions[version] = to_dependency_hash(deps, @packages)
6870
end
6971
end
7072

@@ -536,6 +538,23 @@ def apply_overrides(dependencies)
536538
end
537539
end
538540

541+
METADATA_DEP_FIELD = {
542+
"Ruby\0" => :required_ruby_version,
543+
"RubyGems\0" => :required_rubygems_version,
544+
}.freeze
545+
546+
def apply_metadata_overrides(dependencies, name)
547+
return dependencies if @base.overrides.empty?
548+
549+
dependencies.map do |dep|
550+
field = METADATA_DEP_FIELD[dep.name]
551+
next dep unless field
552+
override = Override.find_for(@base.overrides, name, field)
553+
next dep unless override
554+
Gem::Dependency.new(dep.name, override.apply_to(dep.requirement))
555+
end
556+
end
557+
539558
def bundler_not_found_message(conflict_dependencies)
540559
candidate_specs = filter_matching_specs(default_bundler_source.specs.search("bundler"), conflict_dependencies)
541560

0 commit comments

Comments
 (0)