summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorDavid Rodríguez <deivid.rodriguez@riseup.net>2023-03-16 17:45:54 +0100
committerHiroshi SHIBATA <hsbt@ruby-lang.org>2023-04-06 13:07:16 +0900
commitf3d69bed626e3326959dd62dbcc9ac4510e42b2f (patch)
treef7d1ff117d67bcb4d0e2c14f5844c5fe0d9e2241 /lib
parentc257380965bcf93c9bef330faa6762ed0be494b5 (diff)
[rubygems/rubygems] Fix resolver hangs when dealing with an incomplete lockfile
While working on locking multiple platforms by default, I got an infinite resolution loop in one of our resolver specs. The culprit ended up being that when dealing with lockfile specs with incomplete dependencies (spec appears in lockfile, but its dependencies don't), those specs were not being properly expired and that tripped up resolution. The issue for some reason only manifests when dealing with multiple lockfile platforms, that's why it only manifested when working on locking multiple platforms by default. https://github.com/rubygems/rubygems/commit/4ca72913bb
Diffstat (limited to 'lib')
-rw-r--r--lib/bundler/definition.rb10
-rw-r--r--lib/bundler/resolver/base.rb4
-rw-r--r--lib/bundler/spec_set.rb4
3 files changed, 12 insertions, 6 deletions
diff --git a/lib/bundler/definition.rb b/lib/bundler/definition.rb
index 9467d312fa..3249fb09dc 100644
--- a/lib/bundler/definition.rb
+++ b/lib/bundler/definition.rb
@@ -668,9 +668,17 @@ module Bundler
def check_missing_lockfile_specs
all_locked_specs = @locked_specs.map(&:name) << "bundler"
- @locked_specs.any? do |s|
+ missing = @locked_specs.select do |s|
s.dependencies.any? {|dep| !all_locked_specs.include?(dep.name) }
end
+
+ if missing.any?
+ @locked_specs.delete(missing)
+
+ true
+ else
+ false
+ end
end
def converge_paths
diff --git a/lib/bundler/resolver/base.rb b/lib/bundler/resolver/base.rb
index c6afa82056..e5c3763c3f 100644
--- a/lib/bundler/resolver/base.rb
+++ b/lib/bundler/resolver/base.rb
@@ -35,9 +35,7 @@ module Bundler
end
def delete(specs)
- specs.each do |spec|
- @base.delete(spec)
- end
+ @base.delete(specs)
end
def get_package(name)
diff --git a/lib/bundler/spec_set.rb b/lib/bundler/spec_set.rb
index cf63c16a70..21630e3a3e 100644
--- a/lib/bundler/spec_set.rb
+++ b/lib/bundler/spec_set.rb
@@ -63,8 +63,8 @@ module Bundler
@sorted = nil
end
- def delete(spec)
- @specs.delete(spec)
+ def delete(specs)
+ specs.each {|spec| @specs.delete(spec) }
@lookup = nil
@sorted = nil
end