ruby/spec/bundler
Daniel Colson 8edd350bda [rubygems/rubygems] Avoid crashing with a corrupted lockfile
I did a bad thing (script that edits the Gemfile.lock directly) and
ended up with a Gemfile.lock that was completely missing some indirect
dependencies. While this is my fault and an error is reasonable, I
noticed that the error got progressively less friendly in recent
versions of bundler.

Something similar came up in https://github.com/rubygems/rubygems/issues/6210,
and this commit would have helped with that case as well
(although we've already handled this a different way with #6219).

Details:
---

Back on Bundler 2.2.23, a corrupt lockfile like this would cause a helpful error:

```
Unable to find a spec satisfying minitest (>= 5.1) in the set. Perhaps the lockfile is corrupted?
```

Bundler 2.3.26 gave a helpful warning:

```
Warning:
Your lockfile was created by an old Bundler that left some things out.
Because of the missing DEPENDENCIES, we can only install gems one at a time,
instead of installing 16 at a time.
You can fix this by adding the missing gems to your Gemfile, running bundle
install, and then removing the gems from your Gemfile.
The missing gems are:
* minitest depended upon by activesupport
```

But then continued on and crashed while trying to report the unmet
dependency:

```
--- ERROR REPORT TEMPLATE -------------------------------------------------------

NoMethodError: undefined method `full_name' for nil:NilClass
lib/bundler/installer/parallel_installer.rb:127:in `block (2 levels) in check_for_unmet_dependencies'

...
```

Bundler 2.4.0 and up crash as above when jobs=1, but crash
even harder when run in parallel:

```
--- ERROR REPORT TEMPLATE -------------------------------------------------------

fatal: No live threads left. Deadlock?
3 threads, 3 sleeps current:0x00007fa6b6704660 main thread:0x00007fa6b6704660
* #<Thread:0x000000010833b130 sleep_forever>
   rb_thread_t:0x00007fa6b6704660 native:0x0000000108985600 int:0

* #<Thread:0x0000000108dea630@Parallel Installer Worker #0 tmp/1/gems/system/gems/bundler-2.5.0.dev/lib/bundler/worker.rb:90 sleep_forever>
   rb_thread_t:0x00007fa6b67f67c0 native:0x0000700009a62000 int:0

* #<Thread:0x0000000108dea4a0@Parallel Installer Worker #1 tmp/1/gems/system/gems/bundler-2.5.0.dev/lib/bundler/worker.rb:90 sleep_forever>
   rb_thread_t:0x00007fa6b67f63c0 native:0x0000700009c65000 int:0

<internal:thread_sync>:18:in `pop'
tmp/1/gems/system/gems/bundler-2.5.0.dev/lib/bundler/worker.rb:42:in `deq'

...
```

Changes
---

This commit fixes the confusing thread deadlock crash by detecting if
dependencies are missing such that we'll never be able to enqueue. When
that happens we treat it as a failure so the install can finish.

That gets us back to the `NoMethodError`, which this commit fixes by
using a different warning in the case where no spec is found.

https://github.com/rubygems/rubygems/commit/d73001a21d
2023-02-09 10:29:50 +00:00
..
bundler [rubygems/rubygems] Improve wording of unmet dependencies warning 2023-02-08 22:20:24 +00:00
cache Merge RubyGems/Bundler master 2022-12-09 16:36:22 +09:00
commands [rubygems/rubygems] Properly load the generated gemspec 2023-02-06 16:19:46 +00:00
install Merge RubyGems/Bundler master. 2023-01-31 10:49:08 +09:00
lock [rubygems/rubygems] Avoid crashing with a corrupted lockfile 2023-02-09 10:29:50 +00:00
other Merge RubyGems and Bundler master 2023-01-10 15:53:07 +09:00
plugins Merge 16c3535413 2022-09-05 14:37:12 +09:00
realworld Merge RubyGems/Bundler master. 2023-01-31 10:49:08 +09:00
resolver Merge RubyGems and Bundler master 2023-01-10 15:53:07 +09:00
runtime Merge RubyGems/Bundler master. 2023-01-31 10:49:08 +09:00
support [rubygems/rubygems] Avoid crashing with a corrupted lockfile 2023-02-09 10:29:50 +00:00
update Merge RubyGems/Bundler master 2022-12-09 16:36:22 +09:00
quality_es_spec.rb Merge RubyGems/Bundler master 2022-12-12 10:49:43 +09:00
quality_spec.rb [rubygems/rubygems] Use better matcher 2022-12-13 12:41:08 +09:00
spec_helper.rb Merge RubyGems/Bundler master 2022-12-12 10:49:43 +09:00