rubygems-update 3.4.22 → 3.5.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
|