diff options
| author | David RodrÃguez <deivid.rodriguez@riseup.net> | 2023-03-16 17:45:54 +0100 |
|---|---|---|
| committer | Hiroshi SHIBATA <hsbt@ruby-lang.org> | 2023-04-06 13:07:16 +0900 |
| commit | f3d69bed626e3326959dd62dbcc9ac4510e42b2f (patch) | |
| tree | f7d1ff117d67bcb4d0e2c14f5844c5fe0d9e2241 /lib | |
| parent | c257380965bcf93c9bef330faa6762ed0be494b5 (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.rb | 10 | ||||
| -rw-r--r-- | lib/bundler/resolver/base.rb | 4 | ||||
| -rw-r--r-- | lib/bundler/spec_set.rb | 4 |
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 |
