diff --git a/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/static_package_source.rb b/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/static_package_source.rb index e895812beda6..4bf61461b269 100644 --- a/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/static_package_source.rb +++ b/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/static_package_source.rb @@ -19,7 +19,14 @@ def add(name, version, deps: {}) version = Gem::Version.new(version) @packages[name] ||= {} raise ArgumentError, "#{name} #{version} declared twice" if @packages[name].key?(version) - @packages[name][version] = deps + @packages[name][version] = clean_deps(name, version, deps) + end + + private + + # Exclude redundant self-referencing dependencies + def clean_deps(name, version, deps) + deps.reject {|dep_name, req| name == dep_name && Bundler::PubGrub::RubyGems.parse_range(req).include?(version) } end end diff --git a/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/version_constraint.rb b/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/version_constraint.rb index 9133332d0156..b71f3eaf53b4 100644 --- a/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/version_constraint.rb +++ b/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/version_constraint.rb @@ -15,15 +15,16 @@ def hash package.hash ^ range.hash end + def ==(other) + package == other.package && + range == other.range + end + def eql?(other) package.eql?(other.package) && range.eql?(other.range) end - def ==(other) - package == other.package && range == other.range - end - class << self def exact(package, version) range = VersionRange.new(min: version, max: version, include_min: true, include_max: true) diff --git a/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/version_solver.rb b/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/version_solver.rb index ea5e455968bb..2cb8412cf328 100644 --- a/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/version_solver.rb +++ b/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/version_solver.rb @@ -125,6 +125,7 @@ def choose_package_version package = next_package_to_try unsatisfied_term = solution.unsatisfied.find { |t| t.package == package } version = source.versions_for(package, unsatisfied_term.constraint.range).first + logger.debug { "attempting #{package} #{version}" } if version.nil? add_incompatibility source.no_versions_incompatibility_for(package, unsatisfied_term) @@ -148,9 +149,11 @@ def choose_package_version end unless conflict - logger.info { "selecting #{package} #{version}" } + logger.info { "selected #{package} #{version}" } solution.decide(package, version) + else + logger.info { "conflict: #{conflict.inspect}" } end package diff --git a/bundler/spec/install/gems/resolving_spec.rb b/bundler/spec/install/gems/resolving_spec.rb index 279d3422c131..fb6dda2f886a 100644 --- a/bundler/spec/install/gems/resolving_spec.rb +++ b/bundler/spec/install/gems/resolving_spec.rb @@ -190,7 +190,7 @@ expect(out).to include(" net_b"). and include("Resolving dependencies..."). and include("Solution found after 1 attempts:"). - and include("selecting net_b 1.0") + and include("selected net_b 1.0") end end end