rubygems-update 3.4.22 → 3.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +99 -2
- data/Manifest.txt +34 -221
- data/README.md +1 -3
- data/bundler/CHANGELOG.md +53 -0
- data/bundler/bundler.gemspec +4 -2
- data/bundler/exe/bundle +1 -10
- data/bundler/lib/bundler/build_metadata.rb +3 -3
- data/bundler/lib/bundler/capistrano.rb +1 -1
- data/bundler/lib/bundler/checksum.rb +245 -0
- data/bundler/lib/bundler/ci_detector.rb +75 -0
- data/bundler/lib/bundler/cli/add.rb +3 -3
- data/bundler/lib/bundler/cli/binstubs.rb +4 -4
- data/bundler/lib/bundler/cli/cache.rb +1 -1
- data/bundler/lib/bundler/cli/check.rb +1 -1
- data/bundler/lib/bundler/cli/common.rb +9 -1
- data/bundler/lib/bundler/cli/config.rb +8 -7
- data/bundler/lib/bundler/cli/console.rb +3 -2
- data/bundler/lib/bundler/cli/doctor.rb +2 -2
- data/bundler/lib/bundler/cli/exec.rb +1 -1
- data/bundler/lib/bundler/cli/gem.rb +28 -23
- data/bundler/lib/bundler/cli/info.rb +2 -13
- data/bundler/lib/bundler/cli/install.rb +5 -4
- data/bundler/lib/bundler/cli/issue.rb +1 -1
- data/bundler/lib/bundler/cli/lock.rb +4 -4
- data/bundler/lib/bundler/cli/open.rb +1 -1
- data/bundler/lib/bundler/cli/outdated.rb +6 -6
- data/bundler/lib/bundler/cli/plugin.rb +7 -14
- data/bundler/lib/bundler/cli/pristine.rb +38 -30
- data/bundler/lib/bundler/cli/show.rb +2 -2
- data/bundler/lib/bundler/cli/update.rb +5 -5
- data/bundler/lib/bundler/cli.rb +215 -263
- data/bundler/lib/bundler/compact_index_client/cache.rb +29 -9
- data/bundler/lib/bundler/compact_index_client/cache_file.rb +153 -0
- data/bundler/lib/bundler/compact_index_client/gem_parser.rb +7 -3
- data/bundler/lib/bundler/compact_index_client/updater.rb +79 -81
- data/bundler/lib/bundler/compact_index_client.rb +14 -7
- data/bundler/lib/bundler/constants.rb +1 -1
- data/bundler/lib/bundler/current_ruby.rb +5 -21
- data/bundler/lib/bundler/definition.rb +42 -15
- data/bundler/lib/bundler/dependency.rb +16 -12
- data/bundler/lib/bundler/digest.rb +2 -2
- data/bundler/lib/bundler/dsl.rb +43 -25
- data/bundler/lib/bundler/endpoint_specification.rb +5 -1
- data/bundler/lib/bundler/env.rb +1 -3
- data/bundler/lib/bundler/errors.rb +43 -0
- data/bundler/lib/bundler/fetcher/base.rb +3 -1
- data/bundler/lib/bundler/fetcher/compact_index.rb +4 -4
- data/bundler/lib/bundler/fetcher/downloader.rb +13 -11
- data/bundler/lib/bundler/fetcher/gem_remote_fetcher.rb +16 -0
- data/bundler/lib/bundler/fetcher/index.rb +1 -1
- data/bundler/lib/bundler/fetcher.rb +28 -25
- data/bundler/lib/bundler/friendly_errors.rb +5 -5
- data/bundler/lib/bundler/gem_helper.rb +1 -1
- data/bundler/lib/bundler/gem_helpers.rb +5 -2
- data/bundler/lib/bundler/graph.rb +9 -9
- data/bundler/lib/bundler/index.rb +1 -2
- data/bundler/lib/bundler/injector.rb +1 -1
- data/bundler/lib/bundler/inline.rb +3 -3
- data/bundler/lib/bundler/installer/gem_installer.rb +5 -5
- data/bundler/lib/bundler/installer/parallel_installer.rb +16 -8
- data/bundler/lib/bundler/installer/standalone.rb +2 -3
- data/bundler/lib/bundler/installer.rb +9 -9
- data/bundler/lib/bundler/lazy_specification.rb +24 -17
- data/bundler/lib/bundler/lockfile_generator.rb +9 -0
- data/bundler/lib/bundler/lockfile_parser.rb +81 -10
- data/bundler/lib/bundler/man/bundle-add.1 +3 -26
- data/bundler/lib/bundler/man/bundle-binstubs.1 +4 -16
- data/bundler/lib/bundler/man/bundle-cache.1 +3 -24
- data/bundler/lib/bundler/man/bundle-check.1 +3 -12
- data/bundler/lib/bundler/man/bundle-clean.1 +3 -10
- data/bundler/lib/bundler/man/bundle-config.1 +20 -211
- data/bundler/lib/bundler/man/bundle-config.1.ronn +6 -0
- data/bundler/lib/bundler/man/bundle-console.1 +4 -22
- data/bundler/lib/bundler/man/bundle-doctor.1 +4 -18
- data/bundler/lib/bundler/man/bundle-exec.1 +12 -73
- data/bundler/lib/bundler/man/bundle-gem.1 +13 -49
- data/bundler/lib/bundler/man/bundle-help.1 +3 -7
- data/bundler/lib/bundler/man/bundle-info.1 +3 -9
- data/bundler/lib/bundler/man/bundle-init.1 +3 -12
- data/bundler/lib/bundler/man/bundle-inject.1 +6 -19
- data/bundler/lib/bundler/man/bundle-install.1 +27 -125
- data/bundler/lib/bundler/man/bundle-install.1.ronn +1 -0
- data/bundler/lib/bundler/man/bundle-list.1 +4 -19
- data/bundler/lib/bundler/man/bundle-lock.1 +5 -29
- data/bundler/lib/bundler/man/bundle-open.1 +7 -27
- data/bundler/lib/bundler/man/bundle-outdated.1 +3 -55
- data/bundler/lib/bundler/man/bundle-outdated.1.ronn +1 -0
- data/bundler/lib/bundler/man/bundle-platform.1 +5 -27
- data/bundler/lib/bundler/man/bundle-plugin.1 +3 -29
- data/bundler/lib/bundler/man/bundle-pristine.1 +5 -16
- data/bundler/lib/bundler/man/bundle-remove.1 +4 -14
- data/bundler/lib/bundler/man/bundle-show.1 +3 -10
- data/bundler/lib/bundler/man/bundle-update.1 +18 -137
- data/bundler/lib/bundler/man/bundle-version.1 +3 -16
- data/bundler/lib/bundler/man/bundle-viz.1 +4 -16
- data/bundler/lib/bundler/man/bundle.1 +5 -44
- data/bundler/lib/bundler/man/gemfile.5 +24 -301
- data/bundler/lib/bundler/man/gemfile.5.ronn +4 -0
- data/bundler/lib/bundler/match_metadata.rb +4 -0
- data/bundler/lib/bundler/match_platform.rb +1 -1
- data/bundler/lib/bundler/plugin/api/source.rb +3 -2
- data/bundler/lib/bundler/plugin/installer.rb +1 -1
- data/bundler/lib/bundler/plugin.rb +3 -3
- data/bundler/lib/bundler/resolver/base.rb +1 -1
- data/bundler/lib/bundler/resolver/incompatibility.rb +1 -1
- data/bundler/lib/bundler/resolver/spec_group.rb +1 -4
- data/bundler/lib/bundler/resolver.rb +16 -16
- data/bundler/lib/bundler/ruby_dsl.rb +20 -12
- data/bundler/lib/bundler/ruby_version.rb +1 -1
- data/bundler/lib/bundler/rubygems_ext.rb +24 -50
- data/bundler/lib/bundler/rubygems_gem_installer.rb +6 -56
- data/bundler/lib/bundler/rubygems_integration.rb +25 -94
- data/bundler/lib/bundler/runtime.rb +2 -2
- data/bundler/lib/bundler/self_manager.rb +23 -7
- data/bundler/lib/bundler/settings.rb +27 -7
- data/bundler/lib/bundler/setup.rb +4 -1
- data/bundler/lib/bundler/shared_helpers.rb +35 -13
- data/bundler/lib/bundler/source/git/git_proxy.rb +15 -15
- data/bundler/lib/bundler/source/git.rb +4 -3
- data/bundler/lib/bundler/source/metadata.rb +15 -15
- data/bundler/lib/bundler/source/path.rb +7 -6
- data/bundler/lib/bundler/source/rubygems.rb +21 -14
- data/bundler/lib/bundler/source.rb +2 -0
- data/bundler/lib/bundler/spec_set.rb +38 -10
- data/bundler/lib/bundler/stub_specification.rb +1 -0
- data/bundler/lib/bundler/templates/Executable.bundler +1 -1
- data/bundler/lib/bundler/templates/newgem/README.md.tt +3 -3
- data/bundler/lib/bundler/templates/newgem/Rakefile.tt +2 -6
- data/bundler/lib/bundler/templates/newgem/ext/newgem/Cargo.toml.tt +1 -1
- data/bundler/lib/bundler/templates/newgem/standard.yml.tt +1 -1
- data/bundler/lib/bundler/ui/shell.rb +1 -1
- data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool/version.rb +1 -1
- data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool.rb +53 -6
- data/bundler/lib/bundler/vendor/fileutils/lib/fileutils.rb +8 -20
- data/bundler/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/connection.rb +3 -3
- data/bundler/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/pool.rb +2 -2
- data/bundler/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/timed_stack_multi.rb +1 -1
- data/bundler/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb +35 -35
- data/bundler/lib/bundler/vendor/tsort/lib/tsort.rb +3 -0
- data/bundler/lib/bundler/vendor/uri/lib/uri/common.rb +256 -132
- data/bundler/lib/bundler/vendor/uri/lib/uri/generic.rb +1 -0
- data/bundler/lib/bundler/vendor/uri/lib/uri/rfc3986_parser.rb +95 -31
- data/bundler/lib/bundler/vendor/uri/lib/uri/version.rb +1 -1
- data/bundler/lib/bundler/vendored_net_http.rb +8 -0
- data/bundler/lib/bundler/vendored_persistent.rb +0 -4
- data/bundler/lib/bundler/vendored_timeout.rb +8 -0
- data/bundler/lib/bundler/version.rb +1 -1
- data/bundler/lib/bundler/vlad.rb +1 -1
- data/bundler/lib/bundler/yaml_serializer.rb +3 -3
- data/bundler/lib/bundler.rb +38 -27
- data/lib/rubygems/available_set.rb +4 -4
- data/lib/rubygems/basic_specification.rb +35 -37
- data/lib/rubygems/bundler_version_finder.rb +4 -4
- data/lib/rubygems/ci_detector.rb +75 -0
- data/lib/rubygems/command.rb +13 -15
- data/lib/rubygems/command_manager.rb +5 -4
- data/lib/rubygems/commands/build_command.rb +2 -2
- data/lib/rubygems/commands/cert_command.rb +1 -2
- data/lib/rubygems/commands/check_command.rb +4 -4
- data/lib/rubygems/commands/cleanup_command.rb +12 -14
- data/lib/rubygems/commands/contents_command.rb +4 -4
- data/lib/rubygems/commands/dependency_command.rb +4 -5
- data/lib/rubygems/commands/environment_command.rb +1 -3
- data/lib/rubygems/commands/exec_command.rb +1 -1
- data/lib/rubygems/commands/fetch_command.rb +2 -2
- data/lib/rubygems/commands/generate_index_command.rb +39 -74
- data/lib/rubygems/commands/help_command.rb +3 -3
- data/lib/rubygems/commands/info_command.rb +2 -2
- data/lib/rubygems/commands/install_command.rb +8 -16
- data/lib/rubygems/commands/list_command.rb +2 -2
- data/lib/rubygems/commands/lock_command.rb +1 -1
- data/lib/rubygems/commands/open_command.rb +1 -1
- data/lib/rubygems/commands/owner_command.rb +1 -1
- data/lib/rubygems/commands/pristine_command.rb +13 -15
- data/lib/rubygems/commands/push_command.rb +2 -2
- data/lib/rubygems/commands/query_command.rb +4 -5
- data/lib/rubygems/commands/rdoc_command.rb +2 -2
- data/lib/rubygems/commands/search_command.rb +2 -2
- data/lib/rubygems/commands/setup_command.rb +31 -34
- data/lib/rubygems/commands/sources_command.rb +12 -12
- data/lib/rubygems/commands/specification_command.rb +10 -10
- data/lib/rubygems/commands/stale_command.rb +1 -1
- data/lib/rubygems/commands/uninstall_command.rb +9 -10
- data/lib/rubygems/commands/unpack_command.rb +4 -4
- data/lib/rubygems/commands/update_command.rb +10 -12
- data/lib/rubygems/commands/which_command.rb +1 -1
- data/lib/rubygems/commands/yank_command.rb +1 -1
- data/lib/rubygems/compatibility.rb +5 -6
- data/lib/rubygems/config_file.rb +4 -4
- data/lib/rubygems/core_ext/kernel_gem.rb +0 -2
- data/lib/rubygems/core_ext/kernel_require.rb +19 -48
- data/lib/rubygems/core_ext/kernel_warn.rb +1 -1
- data/lib/rubygems/core_ext/tcpsocket_init.rb +1 -1
- data/lib/rubygems/defaults.rb +15 -3
- data/lib/rubygems/dependency.rb +12 -14
- data/lib/rubygems/dependency_installer.rb +29 -30
- data/lib/rubygems/dependency_list.rb +1 -1
- data/lib/rubygems/deprecate.rb +16 -15
- data/lib/rubygems/doctor.rb +5 -5
- data/lib/rubygems/errors.rb +2 -6
- data/lib/rubygems/exceptions.rb +2 -1
- data/lib/rubygems/ext/builder.rb +15 -10
- data/lib/rubygems/ext/cargo_builder.rb +5 -5
- data/lib/rubygems/ext/ext_conf_builder.rb +1 -3
- data/lib/rubygems/gem_runner.rb +4 -4
- data/lib/rubygems/gemcutter_utilities/webauthn_listener/response.rb +3 -3
- data/lib/rubygems/gemcutter_utilities/webauthn_poller.rb +3 -3
- data/lib/rubygems/gemcutter_utilities.rb +18 -19
- data/lib/rubygems/install_update_options.rb +18 -19
- data/lib/rubygems/installer.rb +59 -33
- data/lib/rubygems/installer_uninstaller_utils.rb +0 -2
- data/lib/rubygems/local_remote_options.rb +7 -10
- data/lib/rubygems/name_tuple.rb +7 -9
- data/lib/rubygems/net/http.rb +3 -0
- data/lib/rubygems/net-http/LICENSE.txt +22 -0
- data/lib/rubygems/net-http/lib/net/http/backward.rb +40 -0
- data/lib/rubygems/net-http/lib/net/http/exceptions.rb +34 -0
- data/lib/rubygems/net-http/lib/net/http/generic_request.rb +414 -0
- data/lib/rubygems/net-http/lib/net/http/header.rb +981 -0
- data/lib/rubygems/net-http/lib/net/http/proxy_delta.rb +17 -0
- data/lib/rubygems/net-http/lib/net/http/request.rb +88 -0
- data/lib/rubygems/net-http/lib/net/http/requests.rb +425 -0
- data/lib/rubygems/net-http/lib/net/http/response.rb +738 -0
- data/lib/rubygems/net-http/lib/net/http/responses.rb +1174 -0
- data/lib/rubygems/net-http/lib/net/http/status.rb +84 -0
- data/lib/rubygems/net-http/lib/net/http.rb +2496 -0
- data/lib/rubygems/net-http/lib/net/https.rb +23 -0
- data/lib/rubygems/net-protocol/LICENSE.txt +22 -0
- data/lib/rubygems/net-protocol/lib/net/protocol.rb +544 -0
- data/lib/rubygems/optparse/lib/optparse.rb +39 -17
- data/lib/rubygems/package/old.rb +2 -2
- data/lib/rubygems/package/tar_header.rb +45 -39
- data/lib/rubygems/package/tar_reader/entry.rb +5 -4
- data/lib/rubygems/package/tar_reader.rb +5 -3
- data/lib/rubygems/package/tar_writer.rb +19 -17
- data/lib/rubygems/package.rb +27 -26
- data/lib/rubygems/package_task.rb +2 -2
- data/lib/rubygems/path_support.rb +9 -10
- data/lib/rubygems/platform.rb +60 -45
- data/lib/rubygems/query_utils.rb +7 -9
- data/lib/rubygems/remote_fetcher.rb +15 -15
- data/lib/rubygems/request/connection_pools.rb +3 -3
- data/lib/rubygems/request.rb +20 -17
- data/lib/rubygems/request_set/gem_dependency_api.rb +119 -122
- data/lib/rubygems/request_set/lockfile/parser.rb +9 -9
- data/lib/rubygems/request_set/lockfile/tokenizer.rb +20 -12
- data/lib/rubygems/request_set/lockfile.rb +6 -11
- data/lib/rubygems/request_set.rb +5 -5
- data/lib/rubygems/requirement.rb +7 -7
- data/lib/rubygems/resolv/LICENSE.txt +22 -0
- data/lib/rubygems/resolv/lib/resolv.rb +3387 -0
- data/lib/rubygems/resolver/activation_request.rb +1 -3
- data/lib/rubygems/resolver/api_set/gem_parser.rb +7 -3
- data/lib/rubygems/resolver/best_set.rb +1 -1
- data/lib/rubygems/resolver/composed_set.rb +1 -1
- data/lib/rubygems/resolver/conflict.rb +4 -12
- data/lib/rubygems/resolver/index_set.rb +4 -4
- data/lib/rubygems/resolver/index_specification.rb +2 -2
- data/lib/rubygems/resolver/installer_set.rb +5 -6
- data/lib/rubygems/resolver/lock_set.rb +1 -1
- data/lib/rubygems/resolver.rb +3 -10
- data/lib/rubygems/s3_uri_signer.rb +6 -6
- data/lib/rubygems/safe_marshal/elements.rb +138 -0
- data/lib/rubygems/safe_marshal/reader.rb +306 -0
- data/lib/rubygems/safe_marshal/visitors/stream_printer.rb +31 -0
- data/lib/rubygems/safe_marshal/visitors/to_ruby.rb +385 -0
- data/lib/rubygems/safe_marshal/visitors/visitor.rb +74 -0
- data/lib/rubygems/safe_marshal.rb +74 -0
- data/lib/rubygems/safe_yaml.rb +5 -28
- data/lib/rubygems/security/policies.rb +36 -38
- data/lib/rubygems/security/policy.rb +7 -11
- data/lib/rubygems/security/signer.rb +1 -1
- data/lib/rubygems/security/trust_dir.rb +3 -3
- data/lib/rubygems/security.rb +8 -22
- data/lib/rubygems/source/git.rb +1 -3
- data/lib/rubygems/source/installed.rb +0 -2
- data/lib/rubygems/source/local.rb +5 -8
- data/lib/rubygems/source/lock.rb +1 -3
- data/lib/rubygems/source/specific_file.rb +0 -1
- data/lib/rubygems/source/vendor.rb +0 -2
- data/lib/rubygems/source.rb +12 -12
- data/lib/rubygems/source_list.rb +4 -4
- data/lib/rubygems/spec_fetcher.rb +29 -29
- data/lib/rubygems/specification.rb +125 -138
- data/lib/rubygems/specification_policy.rb +55 -25
- data/lib/rubygems/stub_specification.rb +4 -5
- data/lib/rubygems/text.rb +1 -2
- data/lib/rubygems/timeout/LICENSE.txt +22 -0
- data/lib/rubygems/timeout/lib/timeout.rb +199 -0
- data/lib/rubygems/timeout.rb +3 -0
- data/lib/rubygems/tsort/lib/tsort.rb +3 -0
- data/lib/rubygems/uninstaller.rb +7 -9
- data/lib/rubygems/update_suggestion.rb +5 -18
- data/lib/rubygems/uri_formatter.rb +1 -1
- data/lib/rubygems/user_interaction.rb +15 -21
- data/lib/rubygems/util/licenses.rb +65 -35
- data/lib/rubygems/util/list.rb +3 -1
- data/lib/rubygems/util.rb +2 -4
- data/lib/rubygems/validator.rb +5 -3
- data/lib/rubygems/version.rb +34 -28
- data/lib/rubygems/version_option.rb +2 -5
- data/lib/rubygems/yaml_serializer.rb +3 -3
- data/lib/rubygems.rb +37 -37
- data/rubygems-update.gemspec +4 -4
- data/setup.rb +2 -2
- metadata +38 -225
- data/lib/rubygems/indexer.rb +0 -428
- data/lib/rubygems/mock_gem_ui.rb +0 -86
- data/test/rubygems/alternate_cert.pem +0 -19
- data/test/rubygems/alternate_cert_32.pem +0 -19
- data/test/rubygems/alternate_key.pem +0 -27
- data/test/rubygems/bad_rake.rb +0 -3
- data/test/rubygems/bundler_test_gem.rb +0 -424
- data/test/rubygems/ca_cert.pem +0 -77
- data/test/rubygems/child_cert.pem +0 -19
- data/test/rubygems/child_cert_32.pem +0 -19
- data/test/rubygems/child_key.pem +0 -27
- data/test/rubygems/client.pem +0 -107
- data/test/rubygems/data/excon-0.7.7.gemspec.rz +0 -0
- data/test/rubygems/data/gem-private_key.pem +0 -27
- data/test/rubygems/data/gem-public_cert.pem +0 -20
- data/test/rubygems/data/null-required-ruby-version.gemspec.rz +0 -0
- data/test/rubygems/data/null-required-rubygems-version.gemspec.rz +0 -0
- data/test/rubygems/data/pry-0.4.7.gemspec.rz +0 -0
- data/test/rubygems/encrypted_private_key.pem +0 -30
- data/test/rubygems/expired_cert.pem +0 -19
- data/test/rubygems/fake_certlib/openssl.rb +0 -9
- data/test/rubygems/foo/discover.rb +0 -1
- data/test/rubygems/future_cert.pem +0 -19
- data/test/rubygems/future_cert_32.pem +0 -19
- data/test/rubygems/good_rake.rb +0 -3
- data/test/rubygems/grandchild_cert.pem +0 -19
- data/test/rubygems/grandchild_cert_32.pem +0 -19
- data/test/rubygems/grandchild_key.pem +0 -27
- data/test/rubygems/helper.rb +0 -1649
- data/test/rubygems/installer_test_case.rb +0 -248
- data/test/rubygems/invalid_client.pem +0 -49
- data/test/rubygems/invalid_issuer_cert.pem +0 -20
- data/test/rubygems/invalid_issuer_cert_32.pem +0 -20
- data/test/rubygems/invalid_key.pem +0 -27
- data/test/rubygems/invalid_signer_cert.pem +0 -19
- data/test/rubygems/invalid_signer_cert_32.pem +0 -19
- data/test/rubygems/invalidchild_cert.pem +0 -19
- data/test/rubygems/invalidchild_cert_32.pem +0 -19
- data/test/rubygems/invalidchild_key.pem +0 -27
- data/test/rubygems/multifactor_auth_utilities.rb +0 -111
- data/test/rubygems/package/tar_test_case.rb +0 -175
- data/test/rubygems/packages/Bluebie-legs-0.6.2.gem +0 -0
- data/test/rubygems/packages/ascii_binder-0.1.10.1.gem +0 -0
- data/test/rubygems/packages/ill-formatted-platform-1.0.0.10.gem +0 -0
- data/test/rubygems/plugin/exception/rubygems_plugin.rb +0 -4
- data/test/rubygems/plugin/load/rubygems_plugin.rb +0 -5
- data/test/rubygems/plugin/standarderror/rubygems_plugin.rb +0 -4
- data/test/rubygems/private3072_key.pem +0 -40
- data/test/rubygems/private_ec_key.pem +0 -9
- data/test/rubygems/private_key.pem +0 -27
- data/test/rubygems/public3072_cert.pem +0 -25
- data/test/rubygems/public_cert.pem +0 -20
- data/test/rubygems/public_cert_32.pem +0 -19
- data/test/rubygems/public_key.pem +0 -9
- data/test/rubygems/rubygems/commands/crash_command.rb +0 -5
- data/test/rubygems/rubygems_plugin.rb +0 -24
- data/test/rubygems/sff/discover.rb +0 -1
- data/test/rubygems/simple_gem.rb +0 -68
- data/test/rubygems/specifications/bar-0.0.2.gemspec +0 -9
- data/test/rubygems/specifications/foo-0.0.1-x86-mswin32.gemspec +0 -0
- data/test/rubygems/specifications/rubyforge-0.0.1.gemspec +0 -14
- data/test/rubygems/ssl_cert.pem +0 -80
- data/test/rubygems/ssl_key.pem +0 -27
- data/test/rubygems/test_bundled_ca.rb +0 -61
- data/test/rubygems/test_config.rb +0 -28
- data/test/rubygems/test_deprecate.rb +0 -158
- data/test/rubygems/test_exit.rb +0 -17
- data/test/rubygems/test_gem.rb +0 -1799
- data/test/rubygems/test_gem_available_set.rb +0 -130
- data/test/rubygems/test_gem_bundler_version_finder.rb +0 -127
- data/test/rubygems/test_gem_command.rb +0 -403
- data/test/rubygems/test_gem_command_manager.rb +0 -400
- data/test/rubygems/test_gem_commands_build_command.rb +0 -739
- data/test/rubygems/test_gem_commands_cert_command.rb +0 -866
- data/test/rubygems/test_gem_commands_check_command.rb +0 -68
- data/test/rubygems/test_gem_commands_cleanup_command.rb +0 -292
- data/test/rubygems/test_gem_commands_contents_command.rb +0 -271
- data/test/rubygems/test_gem_commands_dependency_command.rb +0 -228
- data/test/rubygems/test_gem_commands_environment_command.rb +0 -169
- data/test/rubygems/test_gem_commands_exec_command.rb +0 -857
- data/test/rubygems/test_gem_commands_fetch_command.rb +0 -258
- data/test/rubygems/test_gem_commands_generate_index_command.rb +0 -81
- data/test/rubygems/test_gem_commands_help_command.rb +0 -94
- data/test/rubygems/test_gem_commands_info_command.rb +0 -70
- data/test/rubygems/test_gem_commands_install_command.rb +0 -1573
- data/test/rubygems/test_gem_commands_list_command.rb +0 -33
- data/test/rubygems/test_gem_commands_lock_command.rb +0 -67
- data/test/rubygems/test_gem_commands_mirror.rb +0 -20
- data/test/rubygems/test_gem_commands_open_command.rb +0 -101
- data/test/rubygems/test_gem_commands_outdated_command.rb +0 -50
- data/test/rubygems/test_gem_commands_owner_command.rb +0 -503
- data/test/rubygems/test_gem_commands_pristine_command.rb +0 -708
- data/test/rubygems/test_gem_commands_push_command.rb +0 -603
- data/test/rubygems/test_gem_commands_query_command.rb +0 -858
- data/test/rubygems/test_gem_commands_search_command.rb +0 -16
- data/test/rubygems/test_gem_commands_server_command.rb +0 -20
- data/test/rubygems/test_gem_commands_setup_command.rb +0 -474
- data/test/rubygems/test_gem_commands_signin_command.rb +0 -259
- data/test/rubygems/test_gem_commands_signout_command.rb +0 -30
- data/test/rubygems/test_gem_commands_sources_command.rb +0 -534
- data/test/rubygems/test_gem_commands_specification_command.rb +0 -277
- data/test/rubygems/test_gem_commands_stale_command.rb +0 -43
- data/test/rubygems/test_gem_commands_uninstall_command.rb +0 -542
- data/test/rubygems/test_gem_commands_unpack_command.rb +0 -224
- data/test/rubygems/test_gem_commands_update_command.rb +0 -836
- data/test/rubygems/test_gem_commands_which_command.rb +0 -85
- data/test/rubygems/test_gem_commands_yank_command.rb +0 -299
- data/test/rubygems/test_gem_config_file.rb +0 -551
- data/test/rubygems/test_gem_dependency.rb +0 -398
- data/test/rubygems/test_gem_dependency_installer.rb +0 -1190
- data/test/rubygems/test_gem_dependency_list.rb +0 -265
- data/test/rubygems/test_gem_dependency_resolution_error.rb +0 -27
- data/test/rubygems/test_gem_doctor.rb +0 -195
- data/test/rubygems/test_gem_ext_builder.rb +0 -337
- data/test/rubygems/test_gem_ext_cargo_builder/custom_name/.gitignore +0 -1
- data/test/rubygems/test_gem_ext_cargo_builder/custom_name/custom_name.gemspec +0 -10
- data/test/rubygems/test_gem_ext_cargo_builder/custom_name/ext/custom_name_lib/Cargo.lock +0 -249
- data/test/rubygems/test_gem_ext_cargo_builder/custom_name/ext/custom_name_lib/Cargo.toml +0 -10
- data/test/rubygems/test_gem_ext_cargo_builder/custom_name/ext/custom_name_lib/src/lib.rs +0 -27
- data/test/rubygems/test_gem_ext_cargo_builder/custom_name/lib/custom_name.rb +0 -3
- data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/.gitignore +0 -1
- data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/Cargo.lock +0 -249
- data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/Cargo.toml +0 -10
- data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/rust_ruby_example.gemspec +0 -10
- data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/src/lib.rs +0 -51
- data/test/rubygems/test_gem_ext_cargo_builder.rb +0 -167
- data/test/rubygems/test_gem_ext_cargo_builder_link_flag_converter.rb +0 -34
- data/test/rubygems/test_gem_ext_cargo_builder_unit.rb +0 -60
- data/test/rubygems/test_gem_ext_cmake_builder.rb +0 -84
- data/test/rubygems/test_gem_ext_configure_builder.rb +0 -80
- data/test/rubygems/test_gem_ext_ext_conf_builder.rb +0 -229
- data/test/rubygems/test_gem_ext_rake_builder.rb +0 -113
- data/test/rubygems/test_gem_gem_runner.rb +0 -119
- data/test/rubygems/test_gem_gemcutter_utilities.rb +0 -361
- data/test/rubygems/test_gem_impossible_dependencies_error.rb +0 -60
- data/test/rubygems/test_gem_indexer.rb +0 -381
- data/test/rubygems/test_gem_install_update_options.rb +0 -208
- data/test/rubygems/test_gem_installer.rb +0 -2512
- data/test/rubygems/test_gem_local_remote_options.rb +0 -133
- data/test/rubygems/test_gem_name_tuple.rb +0 -43
- data/test/rubygems/test_gem_package.rb +0 -1306
- data/test/rubygems/test_gem_package_old.rb +0 -91
- data/test/rubygems/test_gem_package_tar_header.rb +0 -226
- data/test/rubygems/test_gem_package_tar_reader.rb +0 -150
- data/test/rubygems/test_gem_package_tar_reader_entry.rb +0 -350
- data/test/rubygems/test_gem_package_tar_writer.rb +0 -331
- data/test/rubygems/test_gem_package_task.rb +0 -118
- data/test/rubygems/test_gem_path_support.rb +0 -139
- data/test/rubygems/test_gem_platform.rb +0 -497
- data/test/rubygems/test_gem_rdoc.rb +0 -137
- data/test/rubygems/test_gem_remote_fetcher.rb +0 -1227
- data/test/rubygems/test_gem_request.rb +0 -547
- data/test/rubygems/test_gem_request_connection_pools.rb +0 -152
- data/test/rubygems/test_gem_request_set.rb +0 -672
- data/test/rubygems/test_gem_request_set_gem_dependency_api.rb +0 -853
- data/test/rubygems/test_gem_request_set_lockfile.rb +0 -469
- data/test/rubygems/test_gem_request_set_lockfile_parser.rb +0 -544
- data/test/rubygems/test_gem_request_set_lockfile_tokenizer.rb +0 -307
- data/test/rubygems/test_gem_requirement.rb +0 -505
- data/test/rubygems/test_gem_resolver.rb +0 -859
- data/test/rubygems/test_gem_resolver_activation_request.rb +0 -43
- data/test/rubygems/test_gem_resolver_api_set.rb +0 -210
- data/test/rubygems/test_gem_resolver_api_specification.rb +0 -167
- data/test/rubygems/test_gem_resolver_best_set.rb +0 -159
- data/test/rubygems/test_gem_resolver_composed_set.rb +0 -44
- data/test/rubygems/test_gem_resolver_conflict.rb +0 -82
- data/test/rubygems/test_gem_resolver_dependency_request.rb +0 -83
- data/test/rubygems/test_gem_resolver_git_set.rb +0 -188
- data/test/rubygems/test_gem_resolver_git_specification.rb +0 -114
- data/test/rubygems/test_gem_resolver_index_set.rb +0 -88
- data/test/rubygems/test_gem_resolver_index_specification.rb +0 -93
- data/test/rubygems/test_gem_resolver_installed_specification.rb +0 -47
- data/test/rubygems/test_gem_resolver_installer_set.rb +0 -320
- data/test/rubygems/test_gem_resolver_local_specification.rb +0 -44
- data/test/rubygems/test_gem_resolver_lock_set.rb +0 -62
- data/test/rubygems/test_gem_resolver_lock_specification.rb +0 -98
- data/test/rubygems/test_gem_resolver_requirement_list.rb +0 -19
- data/test/rubygems/test_gem_resolver_specification.rb +0 -63
- data/test/rubygems/test_gem_resolver_vendor_set.rb +0 -82
- data/test/rubygems/test_gem_resolver_vendor_specification.rb +0 -82
- data/test/rubygems/test_gem_security.rb +0 -341
- data/test/rubygems/test_gem_security_policy.rb +0 -535
- data/test/rubygems/test_gem_security_signer.rb +0 -218
- data/test/rubygems/test_gem_security_trust_dir.rb +0 -99
- data/test/rubygems/test_gem_silent_ui.rb +0 -123
- data/test/rubygems/test_gem_source.rb +0 -254
- data/test/rubygems/test_gem_source_fetch_problem.rb +0 -37
- data/test/rubygems/test_gem_source_git.rb +0 -310
- data/test/rubygems/test_gem_source_installed.rb +0 -35
- data/test/rubygems/test_gem_source_list.rb +0 -119
- data/test/rubygems/test_gem_source_local.rb +0 -107
- data/test/rubygems/test_gem_source_lock.rb +0 -113
- data/test/rubygems/test_gem_source_specific_file.rb +0 -76
- data/test/rubygems/test_gem_source_subpath_problem.rb +0 -50
- data/test/rubygems/test_gem_source_vendor.rb +0 -30
- data/test/rubygems/test_gem_spec_fetcher.rb +0 -338
- data/test/rubygems/test_gem_specification.rb +0 -3856
- data/test/rubygems/test_gem_stream_ui.rb +0 -255
- data/test/rubygems/test_gem_stub_specification.rb +0 -278
- data/test/rubygems/test_gem_text.rb +0 -103
- data/test/rubygems/test_gem_uninstaller.rb +0 -675
- data/test/rubygems/test_gem_unsatisfiable_dependency_error.rb +0 -31
- data/test/rubygems/test_gem_update_suggestion.rb +0 -209
- data/test/rubygems/test_gem_uri.rb +0 -41
- data/test/rubygems/test_gem_uri_formatter.rb +0 -27
- data/test/rubygems/test_gem_util.rb +0 -91
- data/test/rubygems/test_gem_validator.rb +0 -42
- data/test/rubygems/test_gem_version.rb +0 -305
- data/test/rubygems/test_gem_version_option.rb +0 -165
- data/test/rubygems/test_kernel.rb +0 -124
- data/test/rubygems/test_project_sanity.rb +0 -49
- data/test/rubygems/test_remote_fetch_error.rb +0 -20
- data/test/rubygems/test_require.rb +0 -732
- data/test/rubygems/test_rubygems.rb +0 -76
- data/test/rubygems/test_webauthn_listener.rb +0 -143
- data/test/rubygems/test_webauthn_listener_response.rb +0 -93
- data/test/rubygems/test_webauthn_poller.rb +0 -124
- data/test/rubygems/utilities.rb +0 -436
- data/test/rubygems/wrong_key_cert.pem +0 -19
- data/test/rubygems/wrong_key_cert_32.pem +0 -19
- data/test/test_changelog_generator.rb +0 -17
@@ -5,20 +5,21 @@ require_relative "user_interaction"
|
|
5
5
|
class Gem::SpecificationPolicy
|
6
6
|
include Gem::UserInteraction
|
7
7
|
|
8
|
-
VALID_NAME_PATTERN = /\A[a-zA-Z0-9\.\-\_]+\z
|
8
|
+
VALID_NAME_PATTERN = /\A[a-zA-Z0-9\.\-\_]+\z/ # :nodoc:
|
9
9
|
|
10
|
-
SPECIAL_CHARACTERS = /\A[#{Regexp.escape('.-_')}]
|
10
|
+
SPECIAL_CHARACTERS = /\A[#{Regexp.escape('.-_')}]+/ # :nodoc:
|
11
11
|
|
12
|
-
VALID_URI_PATTERN = %r{\Ahttps?:\/\/([^\s:@]+:[^\s:@]*@)?[A-Za-z\d\-]+(\.[A-Za-z\d\-]+)+\.?(:\d{1,5})?([\/?]\S*)?\z}
|
12
|
+
VALID_URI_PATTERN = %r{\Ahttps?:\/\/([^\s:@]+:[^\s:@]*@)?[A-Za-z\d\-]+(\.[A-Za-z\d\-]+)+\.?(:\d{1,5})?([\/?]\S*)?\z} # :nodoc:
|
13
13
|
|
14
14
|
METADATA_LINK_KEYS = %w[
|
15
|
-
bug_tracker_uri
|
16
|
-
changelog_uri
|
17
|
-
documentation_uri
|
18
15
|
homepage_uri
|
19
|
-
|
16
|
+
changelog_uri
|
20
17
|
source_code_uri
|
18
|
+
documentation_uri
|
21
19
|
wiki_uri
|
20
|
+
mailing_list_uri
|
21
|
+
bug_tracker_uri
|
22
|
+
download_uri
|
22
23
|
funding_uri
|
23
24
|
].freeze # :nodoc:
|
24
25
|
|
@@ -106,6 +107,8 @@ class Gem::SpecificationPolicy
|
|
106
107
|
|
107
108
|
validate_removed_attributes
|
108
109
|
|
110
|
+
validate_unique_links
|
111
|
+
|
109
112
|
if @warnings > 0
|
110
113
|
if strict
|
111
114
|
error "specification has warnings"
|
@@ -162,7 +165,7 @@ class Gem::SpecificationPolicy
|
|
162
165
|
if prev = seen[dep.type][dep.name]
|
163
166
|
error_messages << <<-MESSAGE
|
164
167
|
duplicate dependency on #{dep}, (#{prev.requirement}) use:
|
165
|
-
add_#{dep.type}_dependency
|
168
|
+
add_#{dep.type}_dependency \"#{dep.name}\", \"#{dep.requirement}\", \"#{prev.requirement}\"
|
166
169
|
MESSAGE
|
167
170
|
end
|
168
171
|
|
@@ -194,7 +197,7 @@ duplicate dependency on #{dep}, (#{prev.requirement}) use:
|
|
194
197
|
prerelease_dep && !@specification.version.prerelease?
|
195
198
|
|
196
199
|
open_ended = dep.requirement.requirements.all? do |op, version|
|
197
|
-
!version.prerelease? &&
|
200
|
+
!version.prerelease? && [">", ">="].include?(op)
|
198
201
|
end
|
199
202
|
|
200
203
|
next unless open_ended
|
@@ -204,17 +207,17 @@ duplicate dependency on #{dep}, (#{prev.requirement}) use:
|
|
204
207
|
|
205
208
|
base = segments.first 2
|
206
209
|
|
207
|
-
recommendation = if
|
208
|
-
" use a bounded requirement, such as
|
210
|
+
recommendation = if [">", ">="].include?(op) && segments == [0]
|
211
|
+
" use a bounded requirement, such as \"~> x.y\""
|
209
212
|
else
|
210
213
|
bugfix = if op == ">"
|
211
|
-
",
|
214
|
+
", \"> #{dep_version}\""
|
212
215
|
elsif op == ">=" && base != segments
|
213
|
-
",
|
216
|
+
", \">= #{dep_version}\""
|
214
217
|
end
|
215
218
|
|
216
219
|
" if #{dep.name} is semantically versioned, use:\n" \
|
217
|
-
" add_#{dep.type}_dependency
|
220
|
+
" add_#{dep.type}_dependency \"#{dep.name}\", \"~> #{base.join "."}\"#{bugfix}"
|
218
221
|
end
|
219
222
|
|
220
223
|
warning_messages << ["open-ended dependency on #{dep} is not recommended", recommendation].join("\n") + "\n"
|
@@ -300,7 +303,7 @@ duplicate dependency on #{dep}, (#{prev.requirement}) use:
|
|
300
303
|
non_files = @specification.files.reject {|x| File.file?(x) || File.symlink?(x) }
|
301
304
|
|
302
305
|
unless non_files.empty?
|
303
|
-
error "[\"#{non_files.join
|
306
|
+
error "[\"#{non_files.join "\", \""}\"] are not files"
|
304
307
|
end
|
305
308
|
end
|
306
309
|
|
@@ -337,10 +340,10 @@ duplicate dependency on #{dep}, (#{prev.requirement}) use:
|
|
337
340
|
def validate_array_attribute(field)
|
338
341
|
val = @specification.send(field)
|
339
342
|
klass = case field
|
340
|
-
|
341
|
-
|
342
|
-
|
343
|
-
|
343
|
+
when :dependencies then
|
344
|
+
Gem::Dependency
|
345
|
+
else
|
346
|
+
String
|
344
347
|
end
|
345
348
|
|
346
349
|
unless Array === val && val.all? {|x| x.is_a?(klass) || (field == :licenses && x.nil?) }
|
@@ -371,10 +374,21 @@ duplicate dependency on #{dep}, (#{prev.requirement}) use:
|
|
371
374
|
|
372
375
|
licenses.each do |license|
|
373
376
|
next if Gem::Licenses.match?(license) || license.nil?
|
377
|
+
license_id_deprecated = Gem::Licenses.deprecated_license_id?(license)
|
378
|
+
exception_id_deprecated = Gem::Licenses.deprecated_exception_id?(license)
|
374
379
|
suggestions = Gem::Licenses.suggestions(license)
|
380
|
+
|
381
|
+
if license_id_deprecated
|
382
|
+
main_message = "License identifier '#{license}' is deprecated"
|
383
|
+
elsif exception_id_deprecated
|
384
|
+
main_message = "Exception identifier at '#{license}' is deprecated"
|
385
|
+
else
|
386
|
+
main_message = "License identifier '#{license}' is invalid"
|
387
|
+
end
|
388
|
+
|
375
389
|
message = <<-WARNING
|
376
|
-
|
377
|
-
|
390
|
+
#{main_message}. Use an identifier from
|
391
|
+
https://spdx.org/licenses or '#{Gem::Licenses::NONSTANDARD}' for a nonstandard license,
|
378
392
|
or set it to nil if you don't want to specify a license.
|
379
393
|
WARNING
|
380
394
|
message += "Did you mean #{suggestions.map {|s| "'#{s}'" }.join(", ")}?\n" unless suggestions.nil?
|
@@ -382,15 +396,15 @@ or set it to nil if you don't want to specify a license.
|
|
382
396
|
end
|
383
397
|
|
384
398
|
warning <<-WARNING if licenses.empty?
|
385
|
-
licenses is empty, but is recommended.
|
386
|
-
|
399
|
+
licenses is empty, but is recommended. Use an license identifier from
|
400
|
+
https://spdx.org/licenses or '#{Gem::Licenses::NONSTANDARD}' for a nonstandard license,
|
387
401
|
or set it to nil if you don't want to specify a license.
|
388
402
|
WARNING
|
389
403
|
end
|
390
404
|
|
391
405
|
LAZY = '"FIxxxXME" or "TOxxxDO"'.gsub(/xxx/, "")
|
392
|
-
LAZY_PATTERN = /\AFI XME|\ATO DO/x
|
393
|
-
HOMEPAGE_URI_PATTERN = /\A[a-z][a-z\d+.-]*:/i
|
406
|
+
LAZY_PATTERN = /\AFI XME|\ATO DO/x
|
407
|
+
HOMEPAGE_URI_PATTERN = /\A[a-z][a-z\d+.-]*:/i
|
394
408
|
|
395
409
|
def validate_lazy_metadata
|
396
410
|
unless @specification.authors.grep(LAZY_PATTERN).empty?
|
@@ -490,6 +504,22 @@ You have specified rake based extension, but rake is not added as dependency. It
|
|
490
504
|
WARNING
|
491
505
|
end
|
492
506
|
|
507
|
+
def validate_unique_links
|
508
|
+
links = @specification.metadata.slice(*METADATA_LINK_KEYS)
|
509
|
+
grouped = links.group_by {|_key, uri| uri }
|
510
|
+
grouped.each do |uri, copies|
|
511
|
+
next unless copies.length > 1
|
512
|
+
keys = copies.map(&:first).join("\n ")
|
513
|
+
warning <<~WARNING
|
514
|
+
You have specified the uri:
|
515
|
+
#{uri}
|
516
|
+
for all of the following keys:
|
517
|
+
#{keys}
|
518
|
+
Only the first one will be shown on rubygems.org
|
519
|
+
WARNING
|
520
|
+
end
|
521
|
+
end
|
522
|
+
|
493
523
|
def warning(statement) # :nodoc:
|
494
524
|
@warnings += 1
|
495
525
|
|
@@ -69,7 +69,6 @@ class Gem::StubSpecification < Gem::BasicSpecification
|
|
69
69
|
|
70
70
|
def initialize(filename, base_dir, gems_dir, default_gem)
|
71
71
|
super()
|
72
|
-
filename.tap(&Gem::UNTAINT)
|
73
72
|
|
74
73
|
self.loaded_from = filename
|
75
74
|
@data = nil
|
@@ -85,10 +84,10 @@ class Gem::StubSpecification < Gem::BasicSpecification
|
|
85
84
|
|
86
85
|
def activated?
|
87
86
|
@activated ||=
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
87
|
+
begin
|
88
|
+
loaded = Gem.loaded_specs[name]
|
89
|
+
loaded && loaded.version == version
|
90
|
+
end
|
92
91
|
end
|
93
92
|
|
94
93
|
def default_gem?
|
data/lib/rubygems/text.rb
CHANGED
@@ -4,7 +4,6 @@
|
|
4
4
|
# A collection of text-wrangling methods
|
5
5
|
|
6
6
|
module Gem::Text
|
7
|
-
|
8
7
|
##
|
9
8
|
# Remove any non-printable characters and make the text suitable for
|
10
9
|
# printing.
|
@@ -67,7 +66,7 @@ module Gem::Text
|
|
67
66
|
str1.each_codepoint.with_index(1) do |char1, i|
|
68
67
|
j = 0
|
69
68
|
while j < m
|
70
|
-
cost =
|
69
|
+
cost = char1 == str2_codepoints[j] ? 0 : 1
|
71
70
|
x = min3(
|
72
71
|
d[j + 1] + 1, # insertion
|
73
72
|
i + 1, # deletion
|
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (C) 1993-2013 Yukihiro Matsumoto. All rights reserved.
|
2
|
+
|
3
|
+
Redistribution and use in source and binary forms, with or without
|
4
|
+
modification, are permitted provided that the following conditions
|
5
|
+
are met:
|
6
|
+
1. Redistributions of source code must retain the above copyright
|
7
|
+
notice, this list of conditions and the following disclaimer.
|
8
|
+
2. Redistributions in binary form must reproduce the above copyright
|
9
|
+
notice, this list of conditions and the following disclaimer in the
|
10
|
+
documentation and/or other materials provided with the distribution.
|
11
|
+
|
12
|
+
THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
13
|
+
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
14
|
+
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
15
|
+
ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
16
|
+
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
17
|
+
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
18
|
+
OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
19
|
+
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
20
|
+
LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
21
|
+
OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
22
|
+
SUCH DAMAGE.
|
@@ -0,0 +1,199 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
# Timeout long-running blocks
|
3
|
+
#
|
4
|
+
# == Synopsis
|
5
|
+
#
|
6
|
+
# require 'rubygems/timeout/lib/timeout'
|
7
|
+
# status = Gem::Timeout::timeout(5) {
|
8
|
+
# # Something that should be interrupted if it takes more than 5 seconds...
|
9
|
+
# }
|
10
|
+
#
|
11
|
+
# == Description
|
12
|
+
#
|
13
|
+
# Gem::Timeout provides a way to auto-terminate a potentially long-running
|
14
|
+
# operation if it hasn't finished in a fixed amount of time.
|
15
|
+
#
|
16
|
+
# Previous versions didn't use a module for namespacing, however
|
17
|
+
# #timeout is provided for backwards compatibility. You
|
18
|
+
# should prefer Gem::Timeout.timeout instead.
|
19
|
+
#
|
20
|
+
# == Copyright
|
21
|
+
#
|
22
|
+
# Copyright:: (C) 2000 Network Applied Communication Laboratory, Inc.
|
23
|
+
# Copyright:: (C) 2000 Information-technology Promotion Agency, Japan
|
24
|
+
|
25
|
+
module Gem::Timeout
|
26
|
+
VERSION = "0.4.1"
|
27
|
+
|
28
|
+
# Internal error raised to when a timeout is triggered.
|
29
|
+
class ExitException < Exception
|
30
|
+
def exception(*)
|
31
|
+
self
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
# Raised by Gem::Timeout.timeout when the block times out.
|
36
|
+
class Error < RuntimeError
|
37
|
+
def self.handle_timeout(message)
|
38
|
+
exc = ExitException.new(message)
|
39
|
+
|
40
|
+
begin
|
41
|
+
yield exc
|
42
|
+
rescue ExitException => e
|
43
|
+
raise new(message) if exc.equal?(e)
|
44
|
+
raise
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
# :stopdoc:
|
50
|
+
CONDVAR = ConditionVariable.new
|
51
|
+
QUEUE = Queue.new
|
52
|
+
QUEUE_MUTEX = Mutex.new
|
53
|
+
TIMEOUT_THREAD_MUTEX = Mutex.new
|
54
|
+
@timeout_thread = nil
|
55
|
+
private_constant :CONDVAR, :QUEUE, :QUEUE_MUTEX, :TIMEOUT_THREAD_MUTEX
|
56
|
+
|
57
|
+
class Request
|
58
|
+
attr_reader :deadline
|
59
|
+
|
60
|
+
def initialize(thread, timeout, exception_class, message)
|
61
|
+
@thread = thread
|
62
|
+
@deadline = GET_TIME.call(Process::CLOCK_MONOTONIC) + timeout
|
63
|
+
@exception_class = exception_class
|
64
|
+
@message = message
|
65
|
+
|
66
|
+
@mutex = Mutex.new
|
67
|
+
@done = false # protected by @mutex
|
68
|
+
end
|
69
|
+
|
70
|
+
def done?
|
71
|
+
@mutex.synchronize do
|
72
|
+
@done
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def expired?(now)
|
77
|
+
now >= @deadline
|
78
|
+
end
|
79
|
+
|
80
|
+
def interrupt
|
81
|
+
@mutex.synchronize do
|
82
|
+
unless @done
|
83
|
+
@thread.raise @exception_class, @message
|
84
|
+
@done = true
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
def finished
|
90
|
+
@mutex.synchronize do
|
91
|
+
@done = true
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
private_constant :Request
|
96
|
+
|
97
|
+
def self.create_timeout_thread
|
98
|
+
watcher = Thread.new do
|
99
|
+
requests = []
|
100
|
+
while true
|
101
|
+
until QUEUE.empty? and !requests.empty? # wait to have at least one request
|
102
|
+
req = QUEUE.pop
|
103
|
+
requests << req unless req.done?
|
104
|
+
end
|
105
|
+
closest_deadline = requests.min_by(&:deadline).deadline
|
106
|
+
|
107
|
+
now = 0.0
|
108
|
+
QUEUE_MUTEX.synchronize do
|
109
|
+
while (now = GET_TIME.call(Process::CLOCK_MONOTONIC)) < closest_deadline and QUEUE.empty?
|
110
|
+
CONDVAR.wait(QUEUE_MUTEX, closest_deadline - now)
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
requests.each do |req|
|
115
|
+
req.interrupt if req.expired?(now)
|
116
|
+
end
|
117
|
+
requests.reject!(&:done?)
|
118
|
+
end
|
119
|
+
end
|
120
|
+
ThreadGroup::Default.add(watcher) unless watcher.group.enclosed?
|
121
|
+
watcher.name = "Gem::Timeout stdlib thread"
|
122
|
+
watcher.thread_variable_set(:"\0__detached_thread__", true)
|
123
|
+
watcher
|
124
|
+
end
|
125
|
+
private_class_method :create_timeout_thread
|
126
|
+
|
127
|
+
def self.ensure_timeout_thread_created
|
128
|
+
unless @timeout_thread and @timeout_thread.alive?
|
129
|
+
TIMEOUT_THREAD_MUTEX.synchronize do
|
130
|
+
unless @timeout_thread and @timeout_thread.alive?
|
131
|
+
@timeout_thread = create_timeout_thread
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
# We keep a private reference so that time mocking libraries won't break
|
138
|
+
# Gem::Timeout.
|
139
|
+
GET_TIME = Process.method(:clock_gettime)
|
140
|
+
private_constant :GET_TIME
|
141
|
+
|
142
|
+
# :startdoc:
|
143
|
+
|
144
|
+
# Perform an operation in a block, raising an error if it takes longer than
|
145
|
+
# +sec+ seconds to complete.
|
146
|
+
#
|
147
|
+
# +sec+:: Number of seconds to wait for the block to terminate. Any number
|
148
|
+
# may be used, including Floats to specify fractional seconds. A
|
149
|
+
# value of 0 or +nil+ will execute the block without any timeout.
|
150
|
+
# +klass+:: Exception Class to raise if the block fails to terminate
|
151
|
+
# in +sec+ seconds. Omitting will use the default, Gem::Timeout::Error
|
152
|
+
# +message+:: Error message to raise with Exception Class.
|
153
|
+
# Omitting will use the default, "execution expired"
|
154
|
+
#
|
155
|
+
# Returns the result of the block *if* the block completed before
|
156
|
+
# +sec+ seconds, otherwise throws an exception, based on the value of +klass+.
|
157
|
+
#
|
158
|
+
# The exception thrown to terminate the given block cannot be rescued inside
|
159
|
+
# the block unless +klass+ is given explicitly. However, the block can use
|
160
|
+
# ensure to prevent the handling of the exception. For that reason, this
|
161
|
+
# method cannot be relied on to enforce timeouts for untrusted blocks.
|
162
|
+
#
|
163
|
+
# If a scheduler is defined, it will be used to handle the timeout by invoking
|
164
|
+
# Scheduler#timeout_after.
|
165
|
+
#
|
166
|
+
# Note that this is both a method of module Gem::Timeout, so you can <tt>include
|
167
|
+
# Gem::Timeout</tt> into your classes so they have a #timeout method, as well as
|
168
|
+
# a module method, so you can call it directly as Gem::Timeout.timeout().
|
169
|
+
def timeout(sec, klass = nil, message = nil, &block) #:yield: +sec+
|
170
|
+
return yield(sec) if sec == nil or sec.zero?
|
171
|
+
|
172
|
+
message ||= "execution expired"
|
173
|
+
|
174
|
+
if Fiber.respond_to?(:current_scheduler) && (scheduler = Fiber.current_scheduler)&.respond_to?(:timeout_after)
|
175
|
+
return scheduler.timeout_after(sec, klass || Error, message, &block)
|
176
|
+
end
|
177
|
+
|
178
|
+
Gem::Timeout.ensure_timeout_thread_created
|
179
|
+
perform = Proc.new do |exc|
|
180
|
+
request = Request.new(Thread.current, sec, exc, message)
|
181
|
+
QUEUE_MUTEX.synchronize do
|
182
|
+
QUEUE << request
|
183
|
+
CONDVAR.signal
|
184
|
+
end
|
185
|
+
begin
|
186
|
+
return yield(sec)
|
187
|
+
ensure
|
188
|
+
request.finished
|
189
|
+
end
|
190
|
+
end
|
191
|
+
|
192
|
+
if klass
|
193
|
+
perform.call(klass)
|
194
|
+
else
|
195
|
+
Error.handle_timeout(message, &perform)
|
196
|
+
end
|
197
|
+
end
|
198
|
+
module_function :timeout
|
199
|
+
end
|
data/lib/rubygems/uninstaller.rb
CHANGED
@@ -99,9 +99,7 @@ class Gem::Uninstaller
|
|
99
99
|
raise Gem::InstallError, "gem #{@gem.inspect} is not installed"
|
100
100
|
end
|
101
101
|
|
102
|
-
default_specs, list = list.partition
|
103
|
-
spec.default_gem?
|
104
|
-
end
|
102
|
+
default_specs, list = list.partition(&:default_gem?)
|
105
103
|
warn_cannot_uninstall_default_gems(default_specs - list)
|
106
104
|
@default_specs_matching_uninstall_params = default_specs
|
107
105
|
|
@@ -115,7 +113,7 @@ class Gem::Uninstaller
|
|
115
113
|
if list.empty?
|
116
114
|
return unless other_repo_specs.any?
|
117
115
|
|
118
|
-
other_repos = other_repo_specs.map
|
116
|
+
other_repos = other_repo_specs.map(&:base_dir).uniq
|
119
117
|
|
120
118
|
message = ["#{@gem} is not installed in GEM_HOME, try:"]
|
121
119
|
message.concat other_repos.map {|repo|
|
@@ -127,7 +125,7 @@ class Gem::Uninstaller
|
|
127
125
|
remove_all list
|
128
126
|
|
129
127
|
elsif list.size > 1
|
130
|
-
gem_names = list.map
|
128
|
+
gem_names = list.map(&:full_name)
|
131
129
|
gem_names << "All versions"
|
132
130
|
|
133
131
|
say
|
@@ -201,8 +199,8 @@ class Gem::Uninstaller
|
|
201
199
|
executables = executables.map {|exec| formatted_program_filename exec }
|
202
200
|
|
203
201
|
remove = if @force_executables.nil?
|
204
|
-
ask_yes_no("Remove executables:\n"
|
205
|
-
"\t#{executables.join ", "}\n\n"
|
202
|
+
ask_yes_no("Remove executables:\n" \
|
203
|
+
"\t#{executables.join ", "}\n\n" \
|
206
204
|
"in addition to the gem?",
|
207
205
|
true)
|
208
206
|
else
|
@@ -243,7 +241,7 @@ class Gem::Uninstaller
|
|
243
241
|
unless path_ok?(@gem_home, spec) ||
|
244
242
|
(@user_install && path_ok?(Gem.user_dir, spec))
|
245
243
|
e = Gem::GemNotInHomeException.new \
|
246
|
-
|
244
|
+
"Gem '#{spec.full_name}' is not installed in directory #{@gem_home}"
|
247
245
|
e.spec = spec
|
248
246
|
|
249
247
|
raise e
|
@@ -342,7 +340,7 @@ class Gem::Uninstaller
|
|
342
340
|
s.name == spec.name && s.full_name != spec.full_name
|
343
341
|
end
|
344
342
|
|
345
|
-
spec.dependent_gems(@check_dev).each do |dep_spec, dep,
|
343
|
+
spec.dependent_gems(@check_dev).each do |dep_spec, dep, _satlist|
|
346
344
|
unless siblings.any? {|s| s.satisfies_requirement? dep }
|
347
345
|
msg << "#{dep_spec.name}-#{dep_spec.version} depends on #{dep}"
|
348
346
|
end
|
@@ -4,15 +4,6 @@
|
|
4
4
|
# Mixin methods for Gem::Command to promote available RubyGems update
|
5
5
|
|
6
6
|
module Gem::UpdateSuggestion
|
7
|
-
# list taken from https://github.com/watson/ci-info/blob/7a3c30d/index.js#L56-L66
|
8
|
-
CI_ENV_VARS = [
|
9
|
-
"CI", # Travis CI, CircleCI, Cirrus CI, Gitlab CI, Appveyor, CodeShip, dsari
|
10
|
-
"CONTINUOUS_INTEGRATION", # Travis CI, Cirrus CI
|
11
|
-
"BUILD_NUMBER", # Jenkins, TeamCity
|
12
|
-
"CI_APP_ID", "CI_BUILD_ID", "CI_BUILD_NUMBER", # Applfow
|
13
|
-
"RUN_ID" # TaskCluster, dsari
|
14
|
-
].freeze
|
15
|
-
|
16
7
|
ONE_WEEK = 7 * 24 * 60 * 60
|
17
8
|
|
18
9
|
##
|
@@ -28,9 +19,9 @@ Run `gem update --system #{Gem.latest_rubygems_version}` to update your installa
|
|
28
19
|
end
|
29
20
|
|
30
21
|
##
|
31
|
-
# Determines if current environment is
|
22
|
+
# Determines if current environment is eligible for update suggestion.
|
32
23
|
|
33
|
-
def
|
24
|
+
def eligible_for_update?
|
34
25
|
# explicit opt-out
|
35
26
|
return false if Gem.configuration[:prevent_update_suggestion]
|
36
27
|
return false if ENV["RUBYGEMS_PREVENT_UPDATE_SUGGESTION"]
|
@@ -39,7 +30,7 @@ Run `gem update --system #{Gem.latest_rubygems_version}` to update your installa
|
|
39
30
|
return false unless Gem.ui.tty?
|
40
31
|
return false if Gem.rubygems_version.prerelease?
|
41
32
|
return false if Gem.disable_system_update_message
|
42
|
-
return false if ci?
|
33
|
+
return false if Gem::CIDetector.ci?
|
43
34
|
|
44
35
|
# check makes sense only when we can store timestamp of last try
|
45
36
|
# otherwise we will not be able to prevent "annoying" update message
|
@@ -53,17 +44,13 @@ Run `gem update --system #{Gem.latest_rubygems_version}` to update your installa
|
|
53
44
|
|
54
45
|
# compare current and latest version, this is the part where
|
55
46
|
# latest rubygems spec is fetched from remote
|
56
|
-
(Gem.rubygems_version < Gem.latest_rubygems_version).tap do |
|
47
|
+
(Gem.rubygems_version < Gem.latest_rubygems_version).tap do |eligible|
|
57
48
|
# store the time of last successful check into state file
|
58
49
|
Gem.configuration.last_update_check = check_time
|
59
50
|
|
60
|
-
return
|
51
|
+
return eligible
|
61
52
|
end
|
62
53
|
rescue StandardError # don't block install command on any problem
|
63
54
|
false
|
64
55
|
end
|
65
|
-
|
66
|
-
def ci?
|
67
|
-
CI_ENV_VARS.any? {|var| ENV.include?(var) }
|
68
|
-
end
|
69
56
|
end
|
@@ -14,7 +14,6 @@ require_relative "text"
|
|
14
14
|
# module will have access to the +ui+ method that returns the default UI.
|
15
15
|
|
16
16
|
module Gem::DefaultUserInteraction
|
17
|
-
|
18
17
|
include Gem::Text
|
19
18
|
|
20
19
|
##
|
@@ -69,7 +68,6 @@ module Gem::DefaultUserInteraction
|
|
69
68
|
def use_ui(new_ui, &block)
|
70
69
|
Gem::DefaultUserInteraction.use_ui(new_ui, &block)
|
71
70
|
end
|
72
|
-
|
73
71
|
end
|
74
72
|
|
75
73
|
##
|
@@ -92,7 +90,6 @@ end
|
|
92
90
|
# end
|
93
91
|
|
94
92
|
module Gem::UserInteraction
|
95
|
-
|
96
93
|
include Gem::DefaultUserInteraction
|
97
94
|
|
98
95
|
##
|
@@ -196,7 +193,7 @@ class Gem::StreamUI
|
|
196
193
|
# then special operations (like asking for passwords) will use the TTY
|
197
194
|
# commands to disable character echo.
|
198
195
|
|
199
|
-
def initialize(in_stream, out_stream, err_stream
|
196
|
+
def initialize(in_stream, out_stream, err_stream=$stderr, usetty=true)
|
200
197
|
@ins = in_stream
|
201
198
|
@outs = out_stream
|
202
199
|
@errs = err_stream
|
@@ -260,22 +257,21 @@ class Gem::StreamUI
|
|
260
257
|
end
|
261
258
|
|
262
259
|
default_answer = case default
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
260
|
+
when nil
|
261
|
+
"yn"
|
262
|
+
when true
|
263
|
+
"Yn"
|
264
|
+
else
|
265
|
+
"yN"
|
269
266
|
end
|
270
267
|
|
271
268
|
result = nil
|
272
269
|
|
273
270
|
while result.nil? do
|
274
271
|
result = case ask "#{question} [#{default_answer}]"
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
else nil
|
272
|
+
when /^y/i then true
|
273
|
+
when /^n/i then false
|
274
|
+
when /^$/ then default
|
279
275
|
end
|
280
276
|
end
|
281
277
|
|
@@ -430,8 +426,7 @@ class Gem::StreamUI
|
|
430
426
|
# +size+ items. Shows the given +initial_message+ when progress starts
|
431
427
|
# and the +terminal_message+ when it is complete.
|
432
428
|
|
433
|
-
def initialize(out_stream, size, initial_message,
|
434
|
-
terminal_message = "complete")
|
429
|
+
def initialize(out_stream, size, initial_message, terminal_message = "complete")
|
435
430
|
@out = out_stream
|
436
431
|
@total = size
|
437
432
|
@count = 0
|
@@ -473,8 +468,7 @@ class Gem::StreamUI
|
|
473
468
|
# +size+ items. Shows the given +initial_message+ when progress starts
|
474
469
|
# and the +terminal_message+ when it is complete.
|
475
470
|
|
476
|
-
def initialize(out_stream, size, initial_message,
|
477
|
-
terminal_message = "complete")
|
471
|
+
def initialize(out_stream, size, initial_message, terminal_message = "complete")
|
478
472
|
@out = out_stream
|
479
473
|
@total = size
|
480
474
|
@count = 0
|
@@ -597,8 +591,8 @@ class Gem::StreamUI
|
|
597
591
|
end
|
598
592
|
|
599
593
|
##
|
600
|
-
# Subclass of StreamUI that instantiates the user interaction using
|
601
|
-
#
|
594
|
+
# Subclass of StreamUI that instantiates the user interaction using $stdin,
|
595
|
+
# $stdout, and $stderr.
|
602
596
|
|
603
597
|
class Gem::ConsoleUI < Gem::StreamUI
|
604
598
|
##
|
@@ -606,7 +600,7 @@ class Gem::ConsoleUI < Gem::StreamUI
|
|
606
600
|
# stdin, output to stdout and warnings or errors to stderr.
|
607
601
|
|
608
602
|
def initialize
|
609
|
-
super
|
603
|
+
super $stdin, $stdout, $stderr, true
|
610
604
|
end
|
611
605
|
end
|
612
606
|
|