1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00
ruby--ruby/test/rubygems
David Rodríguez 18ac783ea6 [rubygems/rubygems] Revert adding loaded specs to Gem::Specification.stubs and Gem::Specification.stubs_for
The rationale is that:

* The change has caused realworld issues. See for example
https://github.com/ruby/did_you_mean/issues/117 and specifically [this
comment](https://github.com/ruby/did_you_mean/issues/117#issuecomment-482733159)
for a great explanation of the issue it caused for `did_you_mean`.

* The change also causes problems for our development workflows. For
example, because of it, our `bundler` specs cannot currently be run with
`bin/rake` and we have to use `bin/rspec` or `bin/parallel_spec`
directly. The explanation for this is:

  - Our specs install test dependencies to `tmp` before running specs.
  - `rake` is one of these test dependencies.
  - Before installing each test dependency, we check whether it has
  matching installed specs: 2bbcdcde08/bundler/spec/support/rubygems_ext.rb (L109-L114).

  - Normally, if `rake` has not yet been installed to `tmp`, this check
  fails and `rake` is installed, but since the loaded specs are now
  added to `Gem::Specification.stubs` and `rake`'s specification _is_
  loaded because we're running through `bin/rake`, the check incorrectly
  assumes that `rake` is already installed to `tmp` and skips
  installation.
  - At a later point the specs check whether `rake` is actually
  installed and fail if it's not: 2bbcdcde08/bundler/spec/support/builders.rb (L372-L383)

Essentially, both of the issues are the same. If at runtime we change
the location of gems, we'll _want_ to not consider loaded specifications
when dealing with the new gem location, because the loaded
specifications have not been loaded from there. Loaded specifications is
something different from installed stub specifications and those should
not be mixed.

The PR still seemed to have fixed an issue, so I did my archaeology job
and investigated the original issue to double check if reverting is ok.
The logs for the original error can be found here:
https://ci.appveyor.com/project/rubygems/rubygems/build/1172/job/ogubyucpljcv22ux.

So I installed ruby 2.4.4, checked out the commit reference before the
offending PR, and the exact error reproduced. 🎉

```
$ rake test
/home/deivid/Code/rubygems/lib/rubygems/resolver.rb:231:in `search_for': Unable to resolve dependency: user requested 'bundler (= 1.16.2)' (Gem::UnsatisfiableDependencyError)
  from /home/deivid/Code/rubygems/lib/rubygems/resolver.rb:283:in `block in sort_dependencies'
  from /home/deivid/Code/rubygems/lib/rubygems/resolver.rb:277:in `each'
  from /home/deivid/Code/rubygems/lib/rubygems/resolver.rb:277:in `sort_by'
  from /home/deivid/Code/rubygems/lib/rubygems/resolver.rb:277:in `with_index'
  from /home/deivid/Code/rubygems/lib/rubygems/resolver.rb:277:in `sort_dependencies'
  from /home/deivid/Code/rubygems/lib/rubygems/resolver/molinillo/lib/molinillo/delegates/specification_provider.rb:52:in `block in sort_dependencies'
  from /home/deivid/Code/rubygems/lib/rubygems/resolver/molinillo/lib/molinillo/delegates/specification_provider.rb:69:in `with_no_such_dependency_error_handling'
  from /home/deivid/Code/rubygems/lib/rubygems/resolver/molinillo/lib/molinillo/delegates/specification_provider.rb:51:in `sort_dependencies'
  from /home/deivid/Code/rubygems/lib/rubygems/resolver/molinillo/lib/molinillo/resolution.rb:165:in `initial_state'
  from /home/deivid/Code/rubygems/lib/rubygems/resolver/molinillo/lib/molinillo/resolution.rb:106:in `start_resolution'
  from /home/deivid/Code/rubygems/lib/rubygems/resolver/molinillo/lib/molinillo/resolution.rb:64:in `resolve'
  from /home/deivid/Code/rubygems/lib/rubygems/resolver/molinillo/lib/molinillo/resolver.rb:42:in `resolve'
  from /home/deivid/Code/rubygems/lib/rubygems/resolver.rb:188:in `resolve'
  from /home/deivid/Code/rubygems/lib/rubygems/request_set.rb:396:in `resolve'
  from /home/deivid/Code/rubygems/lib/rubygems/request_set.rb:408:in `resolve_current'
  from /home/deivid/Code/rubygems/lib/rubygems.rb:243:in `finish_resolve'
  from /home/deivid/Code/rubygems/lib/rubygems/rdoc.rb:13:in `<top (required)>'
  from /home/deivid/Code/rubygems/lib/rubygems/core_ext/kernel_require.rb:54:in `require'
  from /home/deivid/Code/rubygems/lib/rubygems/core_ext/kernel_require.rb:54:in `require'
  from /home/deivid/Code/rubygems/lib/rubygems/test_case.rb:1563:in `<top (required)>'
  from /home/deivid/Code/rubygems/test/rubygems/test_bundled_ca.rb:2:in `require'
  from /home/deivid/Code/rubygems/test/rubygems/test_bundled_ca.rb:2:in `<top (required)>'
  from /home/deivid/.rbenv/versions/2.4.4/lib/ruby/gems/2.4.0/gems/rake-12.0.0/lib/rake/rake_test_loader.rb:15:in `require'
  from /home/deivid/.rbenv/versions/2.4.4/lib/ruby/gems/2.4.0/gems/rake-12.0.0/lib/rake/rake_test_loader.rb:15:in `block in <main>'
  from /home/deivid/.rbenv/versions/2.4.4/lib/ruby/gems/2.4.0/gems/rake-12.0.0/lib/rake/rake_test_loader.rb:4:in `select'
  from /home/deivid/.rbenv/versions/2.4.4/lib/ruby/gems/2.4.0/gems/rake-12.0.0/lib/rake/rake_test_loader.rb:4:in `<main>'
rake aborted!
Command failed with status (1)

Tasks: TOP => test
```

Now the explanation of the error:

* Rubygems base `TestCase` class requires `bundler` because some tests
use `bundler`:
2bbcdcde08/lib/rubygems/test_case.rb (L26)

* That `require` (our custom rubygems require) would activate the
default bundler spec (1.16.1 for ruby 2.4.4) but then overwrite it with
a 1.16.2 version (the locally provided bundler those days) due to [this
old
hack](9f7bf0ac3a/lib/bundler/version.rb (L7-L23)).

* Rubygems base `TestCase` class requires `rubygems/rdoc`:
2bbcdcde08/lib/rubygems/test_case.rb (L1536)

* And that file ends up calling `Gem.finish_resolve`:
2bbcdcde08/lib/rubygems/rdoc.rb (L13)

* `Gem.finish_resolve` adds the currently loaded specs to the
resolution:
2bbcdcde08/lib/rubygems.rb (L235)

* That means it would try to resolve bundler 1.16.2, but no
specification for that version was installed since the default was
1.16.1. That explains why upgrading to rubygems 2.7.7 fixed the issue,
since it provided bundler 1.16.2 by default so there was not bundler
version discrepancy.

After understanding the error, I conclude that:

* Only this part of the original patch was actually needed to resolve
the error, not any of the changes in `Gem::Specification.stubs` and
`Gem::Specification.stubs_for`:

```diff
diff --git a/lib/rubygems/test_case.rb b/lib/rubygems/test_case.rb
index f1cd3d274c..92c848e870 100644
--- a/lib/rubygems/test_case.rb
+++ b/lib/rubygems/test_case.rb
@@ -13,6 +13,15 @@ else
   require 'rubygems'
 end

+# If bundler gemspec exists, add to stubs
+bundler_gemspec = File.expand_path("../../../bundler/bundler.gemspec", __FILE__)
+if File.exist?(bundler_gemspec)
+  Gem::Specification.dirs.unshift File.dirname(bundler_gemspec)
+  Gem::Specification.class_variable_set :@@stubs, nil
+  Gem::Specification.stubs
+  Gem::Specification.dirs.shift
+end
+
 begin
   gem 'minitest'
 rescue Gem::LoadError
```

So, I propose to revert adding loaded specification to
`Gem::Specification.stubs` and `Gem::Specification.stubs_for` because I
think it's safe, it fixes the issues caused by their addition, and it
simplifies `Gem::Specification` code, which is already complicated
enough.

https://github.com/rubygems/rubygems/commit/5269cd617c
2020-05-08 14:13:29 +09:00
..
data
fake_certlib
foo
plugin
rubygems/commands
sff
specifications [rubygems/rubygems] Add gem build test to check for removed methods. 2020-05-08 07:38:50 +09:00
alternate_cert.pem
alternate_cert_32.pem
alternate_key.pem
bad_rake.rb
bogussources.rb
ca_cert.pem
child_cert.pem
child_cert_32.pem
child_key.pem
client.pem
encrypted_private_key.pem
expired_cert.pem
future_cert.pem
future_cert_32.pem
good_rake.rb
grandchild_cert.pem
grandchild_cert_32.pem
grandchild_key.pem
invalid_client.pem
invalid_issuer_cert.pem
invalid_issuer_cert_32.pem
invalid_key.pem
invalid_signer_cert.pem
invalid_signer_cert_32.pem
invalidchild_cert.pem
invalidchild_cert_32.pem
invalidchild_key.pem
private3072_key.pem
private_key.pem
public3072_cert.pem
public_cert.pem
public_cert_32.pem
public_key.pem
rubygems_plugin.rb
simple_gem.rb
ssl_cert.pem
ssl_key.pem
test_bundled_ca.rb [rubygems/rubygems] Remove minitest compatibility code 2020-05-08 07:38:50 +09:00
test_config.rb
test_deprecate.rb [rubygems/rubygems] Revert deprecation of deprecate method for now. 2020-05-08 07:38:50 +09:00
test_gem.rb [rubygems/rubygems] Require open3 before using it 2020-05-08 14:13:29 +09:00
test_gem_available_set.rb
test_gem_bundler_version_finder.rb Skip a test that attempts to remove the current directory on Solaris 2020-03-24 17:43:33 +09:00
test_gem_command.rb [rubygems/rubygems] Specify explicit separator not to be affected by $; 2020-05-08 14:13:29 +09:00
test_gem_command_manager.rb [rubygems/rubygems] Rename version horizon deprecation methods 2020-05-08 07:38:50 +09:00
test_gem_commands_build_command.rb [rubygems/rubygems] Add gem build test to check for removed methods. 2020-05-08 07:38:50 +09:00
test_gem_commands_cert_command.rb Support XDG_* (#2174) 2020-04-23 19:16:06 +09:00
test_gem_commands_check_command.rb
test_gem_commands_cleanup_command.rb [rubygems/rubygems] Enable Style/PercentLiteralDelimiters cop in rubygems 2020-03-30 12:42:10 +09:00
test_gem_commands_contents_command.rb [rubygems/rubygems] Enable Style/PercentLiteralDelimiters cop in rubygems 2020-03-30 12:42:10 +09:00
test_gem_commands_dependency_command.rb
test_gem_commands_environment_command.rb [rubygems/rubygems] Enable Style/PercentLiteralDelimiters cop in rubygems 2020-03-30 12:42:10 +09:00
test_gem_commands_fetch_command.rb
test_gem_commands_generate_index_command.rb Remove builder gem requirement for gem regenerate_index 2020-05-08 14:13:29 +09:00
test_gem_commands_help_command.rb Prepare to release RubyGems 3.1.0 final version. 2019-12-13 20:19:33 +09:00
test_gem_commands_info_command.rb [rubygems/rubygems] Enable Style/PercentLiteralDelimiters cop in rubygems 2020-03-30 12:42:10 +09:00
test_gem_commands_install_command.rb [rubygems/rubygems] Enable Style/PercentLiteralDelimiters cop in rubygems 2020-03-30 12:42:10 +09:00
test_gem_commands_list_command.rb
test_gem_commands_lock_command.rb
test_gem_commands_mirror.rb [rubygems/rubygems] Enable Style/PercentLiteralDelimiters cop in rubygems 2020-03-30 12:42:10 +09:00
test_gem_commands_open_command.rb [rubygems/rubygems] Use newer module Minitest name 2020-05-08 07:38:50 +09:00
test_gem_commands_outdated_command.rb
test_gem_commands_owner_command.rb [rubygems/rubygems] Enable Style/PercentLiteralDelimiters cop in rubygems 2020-03-30 12:42:10 +09:00
test_gem_commands_pristine_command.rb [rubygems/rubygems] Enable Style/PercentLiteralDelimiters cop in rubygems 2020-03-30 12:42:10 +09:00
test_gem_commands_push_command.rb [rubygems/rubygems] Enable Style/PercentLiteralDelimiters cop in rubygems 2020-03-30 12:42:10 +09:00
test_gem_commands_query_command.rb [rubygems/rubygems] Enable Style/PercentLiteralDelimiters cop in rubygems 2020-03-30 12:42:10 +09:00
test_gem_commands_search_command.rb
test_gem_commands_server_command.rb Prepare to release rubygems-3.1.0 2019-12-15 16:48:52 +09:00
test_gem_commands_setup_command.rb [rubygems/rubygems] Remove old gauntlet_rubygems file on rubygems upgrade 2020-05-08 14:13:29 +09:00
test_gem_commands_signin_command.rb [rubygems/rubygems] Enable Style/ExtraSpacing and auto-correct 2020-03-30 12:48:23 +09:00
test_gem_commands_signout_command.rb Support XDG_* (#2174) 2020-04-23 19:16:06 +09:00
test_gem_commands_sources_command.rb Merge the current master branch of rubygems/rubygems. 2020-02-01 11:14:57 +09:00
test_gem_commands_specification_command.rb [rubygems/rubygems] Enable Style/PercentLiteralDelimiters cop in rubygems 2020-03-30 12:42:10 +09:00
test_gem_commands_stale_command.rb
test_gem_commands_uninstall_command.rb [rubygems/rubygems] Fix incorrect gem uninstall --all message 2020-05-08 14:13:29 +09:00
test_gem_commands_unpack_command.rb
test_gem_commands_update_command.rb Sync rubygems with current master (#2889) 2020-03-24 15:39:24 +09:00
test_gem_commands_which_command.rb [rubygems/rubygems] Enable Style/PercentLiteralDelimiters cop in rubygems 2020-03-30 12:42:10 +09:00
test_gem_commands_yank_command.rb [rubygems/rubygems] Enable Style/ExtraSpacing and auto-correct 2020-03-30 12:48:23 +09:00
test_gem_config_file.rb Support XDG_* (#2174) 2020-04-23 19:16:06 +09:00
test_gem_dependency.rb [rubygems/rubygems] Add Gem::Dependency#identity method 2019-10-05 10:50:02 +09:00
test_gem_dependency_installer.rb [rubygems/rubygems] Revert "Remove Gem::DependencyInstaller#find_gems_with_sources" 2020-03-30 12:54:58 +09:00
test_gem_dependency_list.rb [rubygems/rubygems] Enable Style/ExtraSpacing and auto-correct 2020-03-30 12:48:23 +09:00
test_gem_dependency_resolution_error.rb [rubygems/rubygems] Enable Style/PercentLiteralDelimiters cop in rubygems 2020-03-30 12:42:10 +09:00
test_gem_doctor.rb Sync rubygems with current master (#2889) 2020-03-24 15:39:24 +09:00
test_gem_ext_builder.rb [rubygems/rubygems] Condense some artificially broken lines 2020-05-08 14:13:29 +09:00
test_gem_ext_cmake_builder.rb [rubygems/rubygems] Make cmake tests less verbose on jruby 2020-05-08 14:13:29 +09:00
test_gem_ext_configure_builder.rb [rubygems/rubygems] These specs seem to work just fine on jruby 2020-05-08 07:38:50 +09:00
test_gem_ext_ext_conf_builder.rb Merge RubyGems 3.1.0.pre3 2019-11-11 16:59:49 +09:00
test_gem_ext_rake_builder.rb [rubygems/rubygems] Remove unnecessary @@ruby variable 2020-05-08 14:13:29 +09:00
test_gem_gem_runner.rb [rubygems/rubygems] Avoid "ambiguous first argument" warning 2020-05-08 07:38:50 +09:00
test_gem_gemcutter_utilities.rb
test_gem_impossible_dependencies_error.rb
test_gem_indexer.rb Remove builder gem requirement for gem regenerate_index 2020-05-08 14:13:29 +09:00
test_gem_install_update_options.rb
test_gem_installer.rb [rubygems/rubygems] Fix ruby warnings about a shadowed variable 2020-05-08 14:13:29 +09:00
test_gem_local_remote_options.rb
test_gem_name_tuple.rb
test_gem_package.rb [rubygems/rubygems] Enable Style/ExtraSpacing and auto-correct 2020-03-30 12:48:23 +09:00
test_gem_package_old.rb
test_gem_package_tar_header.rb [rubygems/rubygems] Allow spaces in file headers during octal check 2020-05-08 14:13:29 +09:00
test_gem_package_tar_reader.rb
test_gem_package_tar_reader_entry.rb
test_gem_package_tar_writer.rb Sync rubygems with current master (#2889) 2020-03-24 15:39:24 +09:00
test_gem_package_task.rb [rubygems/rubygems] Enable Style/ExtraSpacing and auto-correct 2020-03-30 12:48:23 +09:00
test_gem_path_support.rb
test_gem_platform.rb [rubygems/rubygems] add tests 2019-09-26 17:48:01 +09:00
test_gem_rdoc.rb
test_gem_remote_fetcher.rb [rubygems/rubygems] Skip flaky tests on jruby 2020-05-08 14:13:29 +09:00
test_gem_request.rb [rubygems/rubygems] Enable Style/PercentLiteralDelimiters cop in rubygems 2020-03-30 12:42:10 +09:00
test_gem_request_connection_pools.rb
test_gem_request_set.rb Normalize heredoc case in rubygems code base 2020-05-08 07:38:50 +09:00
test_gem_request_set_gem_dependency_api.rb [rubygems/rubygems] Enable Style/PercentLiteralDelimiters cop in rubygems 2020-03-30 12:42:10 +09:00
test_gem_request_set_lockfile.rb
test_gem_request_set_lockfile_parser.rb
test_gem_request_set_lockfile_tokenizer.rb [rubygems/rubygems] Consistently left align tokenizer test columns 2020-03-30 12:48:06 +09:00
test_gem_requirement.rb
test_gem_resolver.rb [rubygems/rubygems] Enable Style/PercentLiteralDelimiters cop in rubygems 2020-03-30 12:42:10 +09:00
test_gem_resolver_activation_request.rb
test_gem_resolver_api_set.rb [rubygems/rubygems] Enable Style/ExtraSpacing and auto-correct 2020-03-30 12:48:23 +09:00
test_gem_resolver_api_specification.rb
test_gem_resolver_best_set.rb
test_gem_resolver_composed_set.rb
test_gem_resolver_conflict.rb
test_gem_resolver_dependency_request.rb
test_gem_resolver_git_set.rb
test_gem_resolver_git_specification.rb
test_gem_resolver_index_set.rb
test_gem_resolver_index_specification.rb
test_gem_resolver_installed_specification.rb
test_gem_resolver_installer_set.rb
test_gem_resolver_local_specification.rb
test_gem_resolver_lock_set.rb
test_gem_resolver_lock_specification.rb
test_gem_resolver_requirement_list.rb
test_gem_resolver_specification.rb
test_gem_resolver_vendor_set.rb
test_gem_resolver_vendor_specification.rb
test_gem_security.rb
test_gem_security_policy.rb
test_gem_security_signer.rb [rubygems/rubygems] Enable Style/PercentLiteralDelimiters cop in rubygems 2020-03-30 12:42:10 +09:00
test_gem_security_trust_dir.rb
test_gem_server.rb [rubygems/rubygems] Enable Style/PercentLiteralDelimiters cop in rubygems 2020-03-30 12:42:10 +09:00
test_gem_silent_ui.rb
test_gem_source.rb Remove builder gem requirement for gem regenerate_index 2020-05-08 14:13:29 +09:00
test_gem_source_fetch_problem.rb
test_gem_source_git.rb [rubygems/rubygems] Enable Style/ExtraSpacing and auto-correct 2020-03-30 12:48:23 +09:00
test_gem_source_installed.rb [rubygems/rubygems] Enable Style/ExtraSpacing and auto-correct 2020-03-30 12:48:23 +09:00
test_gem_source_list.rb
test_gem_source_local.rb [rubygems/rubygems] Enable Style/ExtraSpacing and auto-correct 2020-03-30 12:48:23 +09:00
test_gem_source_lock.rb [rubygems/rubygems] Enable Style/ExtraSpacing and auto-correct 2020-03-30 12:48:23 +09:00
test_gem_source_specific_file.rb [rubygems/rubygems] Enable Style/ExtraSpacing and auto-correct 2020-03-30 12:48:23 +09:00
test_gem_source_vendor.rb [rubygems/rubygems] Enable Style/ExtraSpacing and auto-correct 2020-03-30 12:48:23 +09:00
test_gem_spec_fetcher.rb [rubygems/rubygems] Fix ruby warning about unused local variables 2020-05-08 14:13:29 +09:00
test_gem_specification.rb [rubygems/rubygems] Revert adding loaded specs to Gem::Specification.stubs and Gem::Specification.stubs_for 2020-05-08 14:13:29 +09:00
test_gem_stream_ui.rb
test_gem_stub_specification.rb [rubygems/rubygems] Add gem build test to check for removed methods. 2020-05-08 07:38:50 +09:00
test_gem_text.rb [rubygems/rubygems] Enable Style/ExtraSpacing and auto-correct 2020-03-30 12:48:23 +09:00
test_gem_uninstaller.rb [rubygems/rubygems] Fix symlink RubyGems test problems for non-admin user. 2020-05-08 14:13:29 +09:00
test_gem_unsatisfiable_dependency_error.rb
test_gem_uri_formatter.rb
test_gem_util.rb [rubygems/rubygems] Refactor ruby command line building for tests 2020-05-08 14:13:29 +09:00
test_gem_validator.rb
test_gem_version.rb Merge the current master branch of rubygems/rubygems. 2020-02-01 11:14:57 +09:00
test_gem_version_option.rb
test_kernel.rb [rubygems/rubygems] Refactor ruby command line building for tests 2020-05-08 14:13:29 +09:00
test_project_sanity.rb Prepare to release rubygems-3.1.0 2019-12-15 16:48:52 +09:00
test_remote_fetch_error.rb Prepare to release RubyGems 3.1.0 final version. 2019-12-13 20:19:33 +09:00
test_require.rb [rubygems/rubygems] Refactor ruby command line building for tests 2020-05-08 14:13:29 +09:00
wrong_key_cert.pem
wrong_key_cert_32.pem