ruby/lib/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.

d73001a21d
2023-02-09 10:29:50 +00:00
..
cli [rubygems/rubygems] Don't warn on bundler binstubs --standalone --all 2023-01-27 21:06:39 +00:00
compact_index_client Merge RubyGems/Bundler master 2022-12-12 10:49:43 +09:00
fetcher Merge RubyGems/Bundler master 2022-12-26 15:09:21 +09:00
installer [rubygems/rubygems] Avoid crashing with a corrupted lockfile 2023-02-09 10:29:50 +00:00
man [rubygems/rubygems] Update bundle-exec man page for with_unbundled_env 2023-01-20 13:06:58 +00:00
plugin Merge RubyGems/Bundler master 2022-12-26 15:09:21 +09:00
resolver Merge RubyGems/Bundler master. 2023-01-31 10:49:08 +09:00
settings
source Merge RubyGems/Bundler master. 2023-01-31 10:49:08 +09:00
templates [rubygems/rubygems] Properly exclude gemspec file itself from gem 2023-02-06 16:19:46 +00:00
ui Merge RubyGems/Bundler master 2022-12-26 15:09:21 +09:00
vendor Merge RubyGems and Bundler master 2023-01-10 15:53:07 +09:00
.document [DOC] Exclude Bundler only [ci skip] 2021-12-13 19:47:52 +09:00
build_metadata.rb Merge rubygems master 1e4eda741d732ca1bd7031aef0a16c7348adf7a5 2022-04-28 19:08:49 +09:00
bundler.gemspec Merge RubyGems/Bundler master 2022-12-12 10:49:43 +09:00
capistrano.rb
cli.rb [rubygems/rubygems] Raise invalid option when bundle open --path is called without a value 2023-01-04 13:13:19 +00:00
compact_index_client.rb Merge rubygems/rubygems HEAD. 2022-01-19 15:01:44 +09:00
constants.rb Merge rubygems/bundler HEAD 2022-08-03 13:14:10 +09:00
current_ruby.rb [rubygems/rubygems] Add Ruby 3.2 and 3.3 platforms to Gemfile DSL 2023-02-07 21:12:18 +00:00
definition.rb Merge RubyGems/Bundler master. 2023-01-31 10:49:08 +09:00
dependency.rb [rubygems/rubygems] Add Ruby 3.2 and 3.3 platforms to Gemfile DSL 2023-02-07 21:12:18 +00:00
deployment.rb
deprecate.rb
digest.rb [rubygems/rubygems] Remove redundant bitwise AND 2022-06-02 22:23:42 +09:00
dsl.rb Merge RubyGems and Bundler master 2023-01-10 15:53:07 +09:00
endpoint_specification.rb Merge RubyGems/Bundler master 2022-10-18 16:33:15 +09:00
env.rb Merge RubyGems/Bundler master 2022-12-26 15:09:21 +09:00
environment_preserver.rb Merge RubyGems and Bundler master 2023-01-10 15:53:07 +09:00
errors.rb Migrate our resolver engine to PubGrub 2022-11-12 07:40:31 +09:00
feature_flag.rb Merge 16c3535413 2022-09-05 14:37:12 +09:00
fetcher.rb Merge RubyGems/Bundler master 2022-12-09 16:36:22 +09:00
force_platform.rb Merge RubyGems-3.4.0 and Bundler-2.4.0 2022-12-24 16:57:07 +09:00
friendly_errors.rb Merge RubyGems/Bundler master 2022-12-26 15:09:21 +09:00
gem_helper.rb Merge RubyGems/Bundler master 2022-12-26 15:09:21 +09:00
gem_helpers.rb [rubygems/rubygems] Remove unnecessary generic 2022-10-18 16:33:15 +09:00
gem_tasks.rb
gem_version_promoter.rb [rubygems/rubygems] Fix tiny typo 2022-12-20 13:15:02 +09:00
graph.rb Resync Bundler & RubyGems 2022-09-08 11:25:03 +09:00
index.rb Merge RubyGems and Bundler master 2023-01-10 15:53:07 +09:00
injector.rb Merge RubyGems and Bundler master 2023-01-10 15:53:07 +09:00
inline.rb Merge RubyGems/Bundler master. 2023-01-31 10:49:08 +09:00
installer.rb Merge RubyGems/Bundler master. 2023-01-31 10:49:08 +09:00
lazy_specification.rb Merge RubyGems/Bundler master. 2023-01-31 10:49:08 +09:00
lockfile_generator.rb Merge RubyGems and Bundler master 2023-01-10 15:53:07 +09:00
lockfile_parser.rb Merge RubyGems and Bundler master 2023-01-10 15:53:07 +09:00
match_metadata.rb Merge rubygems/bundler HEAD 2022-08-23 10:45:57 +09:00
match_platform.rb Merge RubyGems and Bundler master 2022-07-13 14:11:55 +09:00
match_remote_metadata.rb Merge 16c3535413 2022-09-05 14:37:12 +09:00
mirror.rb Merge RubyGems/Bundler master 2022-12-12 10:49:43 +09:00
plugin.rb Merge RubyGems and Bundler master 2023-01-10 15:53:07 +09:00
process_lock.rb [rubygems/rubygems] Ignore Errno::EROFS errors when creating bundler.lock 2022-05-30 00:27:43 +09:00
remote_specification.rb Merge RubyGems/Bundler master 2022-10-18 16:33:15 +09:00
resolver.rb Merge RubyGems/Bundler master. 2023-01-31 10:49:08 +09:00
retry.rb Sync bundler & rubygems 2021-05-11 11:29:41 +09:00
ruby_dsl.rb Merge rubygems/bundler HEAD. 2022-08-09 12:05:19 +09:00
ruby_version.rb Merge RubyGems/Bundler master 2022-12-26 15:09:21 +09:00
rubygems_ext.rb Merge RubyGems-3.4.0 and Bundler-2.4.0 2022-12-24 16:57:07 +09:00
rubygems_gem_installer.rb Merge RubyGems/Bundler master 2022-12-13 12:41:08 +09:00
rubygems_integration.rb Merge RubyGems/Bundler master 2022-12-26 15:09:21 +09:00
runtime.rb [rubygems/rubygems] Move rubygems source specific logic to rubygems source 2022-07-02 19:41:02 +09:00
self_manager.rb Merge rubygems/rubygems HEAD. 2022-01-19 15:01:44 +09:00
settings.rb Merge 16c3535413 2022-09-05 14:37:12 +09:00
setup.rb [rubygems/rubygems] Remove unnecessary escape sequences 2021-08-31 19:06:14 +09:00
shared_helpers.rb Merge RubyGems/Bundler master. 2023-01-31 10:49:08 +09:00
similarity_detector.rb Merge bundler-2.2.0.rc.2 2020-10-15 17:19:02 +09:00
source.rb [rubygems/rubygems] Fix Gemfile.lock versions leaking to bundler/inline install output 2022-05-13 15:23:56 +09:00
source_list.rb Merge RubyGems/Bundler master 2022-12-20 13:15:02 +09:00
source_map.rb [rubygems/rubygems] Fix corrupted lockfile when using gemspec and multiple sources 2022-02-11 18:20:20 +09:00
spec_set.rb Merge RubyGems-3.4.0 and Bundler-2.4.0 2022-12-24 16:57:07 +09:00
stub_specification.rb [rubygems/rubygems] Fix generated standalone script for default gems 2022-06-01 17:07:35 +09:00
ui.rb
uri_credentials_filter.rb Merge prepare version of Bundler 2.2.0 2020-12-08 17:30:02 +09:00
vendored_fileutils.rb
vendored_persistent.rb Remove warning for old TLS version connection 2022-09-15 14:48:47 +09:00
vendored_pub_grub.rb Migrate our resolver engine to PubGrub 2022-11-12 07:40:31 +09:00
vendored_thor.rb
vendored_tsort.rb Support gemification of tsort 2021-10-29 17:32:52 +09:00
vendored_uri.rb
version.rb Merge RubyGems/Bundler master 2022-12-26 15:09:21 +09:00
vlad.rb
worker.rb Merge RubyGems/Bundler master 2022-12-12 10:49:43 +09:00
yaml_serializer.rb Merge bundler-2.2.0.rc.2 2020-10-15 17:19:02 +09:00