Skip to content

Commit a120170

Browse files
hsbtclaude
authored andcommitted
Use RubyGems' vendored PubGrub in Bundler
Load Gem::PubGrub from RubyGems' copy, which the gem now ships under lib/rubygems, and point all resolver references at the Gem::PubGrub namespace. Also collapse the DSL's individual subfile requires into a single require of the guarded entrypoint, so a partial direct load can never race with a full load from the other path. Since Bundler always injects its own UI as the solver logger, adopting RubyGems' logger patch also drops the runtime dependency on the logger gem. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
1 parent f6042a7 commit a120170

4 files changed

Lines changed: 27 additions & 27 deletions

File tree

lib/bundler/dsl.rb

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -331,13 +331,10 @@ def add_dependency(name, version = nil, options = {})
331331

332332
gemspec_dep = [dep, current].find(&:gemspec_dev_dep?)
333333
if gemspec_dep
334-
require_relative "vendor/pub_grub/lib/pub_grub/version_range"
335-
require_relative "vendor/pub_grub/lib/pub_grub/version_constraint"
336-
require_relative "vendor/pub_grub/lib/pub_grub/version_union"
337-
require_relative "vendor/pub_grub/lib/pub_grub/rubygems"
334+
require_relative "vendored_pub_grub"
338335

339-
current_gemspec_range = PubGrub::RubyGems.requirement_to_range(current.requirement)
340-
next_gemspec_range = PubGrub::RubyGems.requirement_to_range(dep.requirement)
336+
current_gemspec_range = Gem::PubGrub::RubyGems.requirement_to_range(current.requirement)
337+
next_gemspec_range = Gem::PubGrub::RubyGems.requirement_to_range(dep.requirement)
341338

342339
if current_gemspec_range.intersects?(next_gemspec_range)
343340
dep = Dependency.new(name, current.requirement.as_list + dep.requirement.as_list, options)

lib/bundler/resolver.rb

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -79,12 +79,12 @@ def setup_solver
7979
end
8080

8181
def solve_versions(root:, logger:)
82-
solver = PubGrub::VersionSolver.new(source: self, root: root, strategy: Strategy.new(self), logger: logger)
82+
solver = Gem::PubGrub::VersionSolver.new(source: self, root: root, strategy: Strategy.new(self), logger: logger)
8383
result = solver.solve
8484
resolved_specs = result.flat_map {|package, version| version.to_specs(package, @most_specific_locked_platform) }
8585
Override.attach(resolved_specs, @base.overrides)
8686
SpecSet.new(resolved_specs).specs_with_additional_variants_from(@base.locked_specs)
87-
rescue PubGrub::SolveFailure => e
87+
rescue Gem::PubGrub::SolveFailure => e
8888
incompatibility = e.incompatibility
8989

9090
names_to_unlock, names_to_allow_prereleases_for, names_to_allow_remote_specs_for, extended_explanation = find_names_to_relax(incompatibility)
@@ -164,7 +164,7 @@ def find_names_to_relax(incompatibility)
164164
names_to_allow_remote_specs_for << name
165165
end
166166

167-
no_versions_incompat = [cause.incompatibility, cause.satisfier].find {|incompat| incompat.cause.is_a?(PubGrub::Incompatibility::NoVersions) }
167+
no_versions_incompat = [cause.incompatibility, cause.satisfier].find {|incompat| incompat.cause.is_a?(Gem::PubGrub::Incompatibility::NoVersions) }
168168
next unless no_versions_incompat
169169

170170
extended_explanation = no_versions_incompat.extended_explanation
@@ -176,20 +176,20 @@ def find_names_to_relax(incompatibility)
176176

177177
def parse_dependency(package, dependency)
178178
range = if repository_for(package).is_a?(Source::Gemspec)
179-
PubGrub::VersionRange.any
179+
Gem::PubGrub::VersionRange.any
180180
else
181181
requirement_to_range(dependency)
182182
end
183183

184-
PubGrub::VersionConstraint.new(package, range: range)
184+
Gem::PubGrub::VersionConstraint.new(package, range: range)
185185
end
186186

187187
def versions_for(package, range = VersionRange.any)
188188
range.select_versions(@sorted_versions[package])
189189
end
190190

191191
def no_versions_incompatibility_for(package, unsatisfied_term)
192-
cause = PubGrub::Incompatibility::NoVersions.new(unsatisfied_term)
192+
cause = Gem::PubGrub::Incompatibility::NoVersions.new(unsatisfied_term)
193193
name = package.name
194194
constraint = unsatisfied_term.constraint
195195
constraint_string = constraint.constraint_string
@@ -250,18 +250,18 @@ def incompatibilities_for(package, version)
250250
sorted_versions[high]
251251
end
252252

253-
range = PubGrub::VersionRange.new(min: low, max: high, include_min: !low.nil?)
253+
range = Gem::PubGrub::VersionRange.new(min: low, max: high, include_min: !low.nil?)
254254

255-
self_constraint = PubGrub::VersionConstraint.new(package, range: range)
255+
self_constraint = Gem::PubGrub::VersionConstraint.new(package, range: range)
256256

257-
dep_term = PubGrub::Term.new(dep_constraint, false)
258-
self_term = PubGrub::Term.new(self_constraint, true)
257+
dep_term = Gem::PubGrub::Term.new(dep_constraint, false)
258+
self_term = Gem::PubGrub::Term.new(self_constraint, true)
259259

260260
custom_explanation = if dep_package.meta? && package.root?
261261
"current #{dep_package} version is #{dep_constraint.constraint_string}"
262262
end
263263

264-
PubGrub::Incompatibility.new([self_term, dep_term], cause: :dependency, custom_explanation: custom_explanation)
264+
Gem::PubGrub::Incompatibility.new([self_term, dep_term], cause: :dependency, custom_explanation: custom_explanation)
265265
end
266266
end
267267

@@ -572,19 +572,19 @@ def requirement_to_range(requirement)
572572
when "~>"
573573
name = "~> #{ver}"
574574
bump = Resolver::Candidate.new(version.bump.to_s + ".A")
575-
PubGrub::VersionRange.new(name: name, min: ver, max: bump, include_min: true)
575+
Gem::PubGrub::VersionRange.new(name: name, min: ver, max: bump, include_min: true)
576576
when ">"
577-
PubGrub::VersionRange.new(min: platform_ver)
577+
Gem::PubGrub::VersionRange.new(min: platform_ver)
578578
when ">="
579-
PubGrub::VersionRange.new(min: ver, include_min: true)
579+
Gem::PubGrub::VersionRange.new(min: ver, include_min: true)
580580
when "<"
581-
PubGrub::VersionRange.new(max: ver)
581+
Gem::PubGrub::VersionRange.new(max: ver)
582582
when "<="
583-
PubGrub::VersionRange.new(max: platform_ver, include_max: true)
583+
Gem::PubGrub::VersionRange.new(max: platform_ver, include_max: true)
584584
when "="
585-
PubGrub::VersionRange.new(min: ver, max: platform_ver, include_min: true, include_max: true)
585+
Gem::PubGrub::VersionRange.new(min: ver, max: platform_ver, include_min: true, include_max: true)
586586
when "!="
587-
PubGrub::VersionRange.new(min: ver, max: platform_ver, include_min: true, include_max: true).invert
587+
Gem::PubGrub::VersionRange.new(min: ver, max: platform_ver, include_min: true, include_max: true).invert
588588
else
589589
raise "bad version specifier: #{op}"
590590
end

lib/bundler/resolver/incompatibility.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
module Bundler
44
class Resolver
5-
class Incompatibility < PubGrub::Incompatibility
5+
class Incompatibility < Gem::PubGrub::Incompatibility
66
attr_reader :extended_explanation
77

88
def initialize(terms, cause:, custom_explanation: nil, extended_explanation: nil)

lib/bundler/vendored_pub_grub.rb

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
11
# frozen_string_literal: true
22

3-
module Bundler; end
4-
require_relative "vendor/pub_grub/lib/pub_grub"
3+
# Reuse RubyGems' vendored PubGrub (Gem::PubGrub). The Bundler gem ships a copy
4+
# under lib/rubygems/vendor, so this resolves even on RubyGems versions that
5+
# predate it.
6+
7+
require "rubygems/vendor/pub_grub/lib/pub_grub"

0 commit comments

Comments
 (0)