mirror of
https://github.com/ruby/ruby.git
synced 2025-08-23 13:04:13 +02:00
![]() 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.
|
||
---|---|---|
.. | ||
benchmark | ||
bundler | ||
cgi | ||
csv | ||
delegate | ||
did_you_mean | ||
drb | ||
erb | ||
error_highlight | ||
forwardable | ||
getoptlong | ||
irb | ||
logger | ||
net | ||
observer | ||
open3 | ||
optparse | ||
ostruct | ||
pstore | ||
racc | ||
random | ||
rdoc | ||
reline | ||
rinda | ||
ruby_vm/mjit | ||
rubygems | ||
set | ||
singleton | ||
syntax_suggest | ||
timeout | ||
unicode_normalize | ||
uri | ||
weakref | ||
yaml | ||
abbrev.gemspec | ||
abbrev.rb | ||
base64.gemspec | ||
base64.rb | ||
benchmark.rb | ||
bundler.rb | ||
cgi.rb | ||
csv.rb | ||
delegate.rb | ||
did_you_mean.rb | ||
drb.rb | ||
English.gemspec | ||
English.rb | ||
erb.gemspec | ||
erb.rb | ||
error_highlight.rb | ||
fileutils.gemspec | ||
fileutils.rb | ||
find.gemspec | ||
find.rb | ||
forwardable.rb | ||
getoptlong.rb | ||
ipaddr.gemspec | ||
ipaddr.rb | ||
irb.rb | ||
logger.rb | ||
mkmf.rb | ||
mutex_m.gemspec | ||
mutex_m.rb | ||
observer.rb | ||
open-uri.gemspec | ||
open-uri.rb | ||
open3.rb | ||
optionparser.rb | ||
optparse.rb | ||
ostruct.rb | ||
pp.gemspec | ||
pp.rb | ||
prettyprint.gemspec | ||
prettyprint.rb | ||
pstore.rb | ||
racc.rb | ||
rdoc.rb | ||
readline.gemspec | ||
readline.rb | ||
reline.rb | ||
resolv-replace.gemspec | ||
resolv-replace.rb | ||
resolv.gemspec | ||
resolv.rb | ||
ruby2_keywords.gemspec | ||
rubygems.rb | ||
securerandom.gemspec | ||
securerandom.rb | ||
set.rb | ||
shellwords.gemspec | ||
shellwords.rb | ||
singleton.rb | ||
syntax_suggest.rb | ||
tempfile.gemspec | ||
tempfile.rb | ||
time.gemspec | ||
time.rb | ||
timeout.rb | ||
tmpdir.gemspec | ||
tmpdir.rb | ||
tsort.gemspec | ||
tsort.rb | ||
un.gemspec | ||
un.rb | ||
uri.rb | ||
weakref.rb | ||
yaml.rb |