Project

General

Profile

« Previous | Next » 

Revision 8c74eaa0

Added by deivid (David Rodríguez) almost 3 years ago

[rubygems/rubygems] Fix gem update --system crash while regenerating binstubs

Since a few commits ago, we no longer call Gem::Specification.reset
after each invocation of Gem::Installer#install. This means we don't
call it when the default Bundler is installed during gem update --system. This causes no issues until the end of the upgrade process
when:

  • The previous default Bundler spec is removed from disk.

  • All specification stubs are turned into real specifications by loading
    them from disk. But the one for Bundler no longer exists so
    materializes to nil and regenerating binstubs crashes like this:

    Bundler 2.4.0.dev installed
    RubyGems 3.4.0.dev installed
    Regenerating binstubs
    ERROR:  While executing gem ... (NoMethodError)
        undefined method `platform' for nil:NilClass
      /Users/deivid/Code/rubygems/rubygems/lib/rubygems/commands/pristine_command.rb:116:in `block in execute'
      /Users/deivid/Code/rubygems/rubygems/lib/rubygems/specification.rb:981:in `block in each'
      /Users/deivid/Code/rubygems/rubygems/lib/rubygems/specification.rb:980:in `each'
      /Users/deivid/Code/rubygems/rubygems/lib/rubygems/specification.rb:980:in `each'
      /Users/deivid/Code/rubygems/rubygems/lib/rubygems/commands/pristine_command.rb:116:in `map'
      /Users/deivid/Code/rubygems/rubygems/lib/rubygems/commands/pristine_command.rb:116:in `each'
      /Users/deivid/Code/rubygems/rubygems/lib/rubygems/commands/pristine_command.rb:116:in `select'
      /Users/deivid/Code/rubygems/rubygems/lib/rubygems/commands/pristine_command.rb:116:in `execute'
      /Users/deivid/Code/rubygems/rubygems/lib/rubygems/command.rb:323:in `invoke_with_build_args'
      /Users/deivid/Code/rubygems/rubygems/lib/rubygems/command.rb:301:in `invoke'
      /Users/deivid/Code/rubygems/rubygems/lib/rubygems/commands/setup_command.rb:604:in `regenerate_binstubs'
      /Users/deivid/Code/rubygems/rubygems/lib/rubygems/commands/setup_command.rb:183:in `execute'
      /Users/deivid/Code/rubygems/rubygems/lib/rubygems/command.rb:323:in `invoke_with_build_args'
      /Users/deivid/Code/rubygems/rubygems/lib/rubygems/command_manager.rb:185:in `process_args'
      /Users/deivid/Code/rubygems/rubygems/lib/rubygems/command_manager.rb:149:in `run'
      /Users/deivid/Code/rubygems/rubygems/lib/rubygems/gem_runner.rb:51:in `run'
    setup.rb:33:in `<main>'
    

We fix it by more carefully managing the removal of the previous default
Bundler gem.

https://github.com/rubygems/rubygems/commit/9989f6d5af