rubygems-update 3.5.3 → 3.7.1
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 +1410 -686
- data/CODE_OF_CONDUCT.md +79 -28
- data/CONTRIBUTING.md +4 -226
- data/Manifest.txt +107 -83
- data/README.md +16 -11
- data/SECURITY.md +7 -0
- data/bundler/CHANGELOG.md +1525 -931
- data/bundler/README.md +9 -9
- data/bundler/bundler.gemspec +2 -2
- data/bundler/lib/bundler/build_metadata.rb +10 -11
- data/bundler/lib/bundler/checksum.rb +22 -12
- data/bundler/lib/bundler/cli/add.rb +3 -1
- data/bundler/lib/bundler/cli/binstubs.rb +1 -1
- data/bundler/lib/bundler/cli/check.rb +3 -3
- data/bundler/lib/bundler/cli/common.rb +1 -1
- data/bundler/lib/bundler/cli/config.rb +2 -2
- data/bundler/lib/bundler/cli/console.rb +8 -10
- data/bundler/lib/bundler/cli/doctor/diagnose.rb +167 -0
- data/bundler/lib/bundler/cli/doctor/ssl.rb +249 -0
- data/bundler/lib/bundler/cli/doctor.rb +27 -151
- data/bundler/lib/bundler/cli/exec.rb +1 -0
- data/bundler/lib/bundler/cli/fund.rb +1 -1
- data/bundler/lib/bundler/cli/gem.rb +74 -46
- data/bundler/lib/bundler/cli/info.rb +6 -6
- data/bundler/lib/bundler/cli/inject.rb +3 -3
- data/bundler/lib/bundler/cli/install.rb +19 -10
- data/bundler/lib/bundler/cli/issue.rb +3 -3
- data/bundler/lib/bundler/cli/lock.rb +32 -11
- data/bundler/lib/bundler/cli/outdated.rb +23 -23
- data/bundler/lib/bundler/cli/plugin.rb +3 -2
- data/bundler/lib/bundler/cli/pristine.rb +1 -1
- data/bundler/lib/bundler/cli/show.rb +3 -3
- data/bundler/lib/bundler/cli/update.rb +3 -3
- data/bundler/lib/bundler/cli.rb +75 -145
- data/bundler/lib/bundler/compact_index_client/cache.rb +48 -73
- data/bundler/lib/bundler/compact_index_client/cache_file.rb +0 -5
- data/bundler/lib/bundler/compact_index_client/parser.rb +84 -0
- data/bundler/lib/bundler/compact_index_client/updater.rb +6 -16
- data/bundler/lib/bundler/compact_index_client.rb +52 -85
- data/bundler/lib/bundler/constants.rb +8 -1
- data/bundler/lib/bundler/current_ruby.rb +48 -34
- data/bundler/lib/bundler/definition.rb +501 -328
- data/bundler/lib/bundler/dependency.rb +93 -47
- data/bundler/lib/bundler/dsl.rb +147 -103
- data/bundler/lib/bundler/endpoint_specification.rb +30 -3
- data/bundler/lib/bundler/env.rb +1 -1
- data/bundler/lib/bundler/environment_preserver.rb +5 -23
- data/bundler/lib/bundler/errors.rb +53 -5
- data/bundler/lib/bundler/feature_flag.rb +18 -18
- data/bundler/lib/bundler/fetcher/compact_index.rb +16 -25
- data/bundler/lib/bundler/fetcher/dependency.rb +2 -1
- data/bundler/lib/bundler/fetcher/downloader.rb +34 -8
- data/bundler/lib/bundler/fetcher.rb +63 -26
- data/bundler/lib/bundler/force_platform.rb +0 -2
- data/bundler/lib/bundler/friendly_errors.rb +3 -2
- data/bundler/lib/bundler/gem_helper.rb +1 -1
- data/bundler/lib/bundler/gem_version_promoter.rb +42 -40
- data/bundler/lib/bundler/index.rb +7 -2
- data/bundler/lib/bundler/injector.rb +14 -16
- data/bundler/lib/bundler/inline.rb +42 -17
- data/bundler/lib/bundler/installer/gem_installer.rb +4 -3
- data/bundler/lib/bundler/installer/parallel_installer.rb +3 -2
- data/bundler/lib/bundler/installer/standalone.rb +2 -5
- data/bundler/lib/bundler/installer.rb +22 -45
- data/bundler/lib/bundler/lazy_specification.rb +121 -48
- data/bundler/lib/bundler/lockfile_generator.rb +1 -1
- data/bundler/lib/bundler/lockfile_parser.rb +36 -9
- data/bundler/lib/bundler/man/bundle-add.1 +44 -27
- data/bundler/lib/bundler/man/bundle-add.1.ronn +52 -23
- data/bundler/lib/bundler/man/bundle-binstubs.1 +9 -6
- data/bundler/lib/bundler/man/bundle-binstubs.1.ronn +6 -3
- data/bundler/lib/bundler/man/bundle-cache.1 +32 -4
- data/bundler/lib/bundler/man/bundle-cache.1.ronn +31 -2
- data/bundler/lib/bundler/man/bundle-check.1 +7 -5
- data/bundler/lib/bundler/man/bundle-check.1.ronn +7 -2
- data/bundler/lib/bundler/man/bundle-clean.1 +3 -3
- data/bundler/lib/bundler/man/bundle-config.1 +180 -138
- data/bundler/lib/bundler/man/bundle-config.1.ronn +96 -99
- data/bundler/lib/bundler/man/bundle-console.1 +4 -6
- data/bundler/lib/bundler/man/bundle-console.1.ronn +2 -7
- data/bundler/lib/bundler/man/bundle-doctor.1 +46 -7
- data/bundler/lib/bundler/man/bundle-doctor.1.ronn +49 -5
- data/bundler/lib/bundler/man/bundle-env.1 +9 -0
- data/bundler/lib/bundler/man/bundle-env.1.ronn +10 -0
- data/bundler/lib/bundler/man/bundle-exec.1 +9 -6
- data/bundler/lib/bundler/man/bundle-exec.1.ronn +6 -3
- data/bundler/lib/bundler/man/bundle-fund.1 +22 -0
- data/bundler/lib/bundler/man/bundle-fund.1.ronn +25 -0
- data/bundler/lib/bundler/man/bundle-gem.1 +69 -28
- data/bundler/lib/bundler/man/bundle-gem.1.ronn +42 -6
- data/bundler/lib/bundler/man/bundle-help.1 +3 -3
- data/bundler/lib/bundler/man/bundle-info.1 +7 -4
- data/bundler/lib/bundler/man/bundle-info.1.ronn +6 -2
- data/bundler/lib/bundler/man/bundle-init.1 +5 -5
- data/bundler/lib/bundler/man/bundle-init.1.ronn +3 -2
- data/bundler/lib/bundler/man/bundle-inject.1 +13 -5
- data/bundler/lib/bundler/man/bundle-inject.1.ronn +10 -2
- data/bundler/lib/bundler/man/bundle-install.1 +20 -17
- data/bundler/lib/bundler/man/bundle-install.1.ronn +26 -23
- data/bundler/lib/bundler/man/bundle-issue.1 +45 -0
- data/bundler/lib/bundler/man/bundle-issue.1.ronn +37 -0
- data/bundler/lib/bundler/man/bundle-licenses.1 +9 -0
- data/bundler/lib/bundler/man/bundle-licenses.1.ronn +10 -0
- data/bundler/lib/bundler/man/bundle-list.1 +3 -3
- data/bundler/lib/bundler/man/bundle-list.1.ronn +4 -1
- data/bundler/lib/bundler/man/bundle-lock.1 +23 -8
- data/bundler/lib/bundler/man/bundle-lock.1.ronn +25 -4
- data/bundler/lib/bundler/man/bundle-open.1 +4 -4
- data/bundler/lib/bundler/man/bundle-open.1.ronn +2 -1
- data/bundler/lib/bundler/man/bundle-outdated.1 +10 -7
- data/bundler/lib/bundler/man/bundle-outdated.1.ronn +8 -4
- data/bundler/lib/bundler/man/bundle-platform.1 +3 -3
- data/bundler/lib/bundler/man/bundle-plugin.1 +9 -6
- data/bundler/lib/bundler/man/bundle-plugin.1.ronn +7 -3
- data/bundler/lib/bundler/man/bundle-pristine.1 +3 -3
- data/bundler/lib/bundler/man/bundle-pristine.1.ronn +1 -1
- data/bundler/lib/bundler/man/bundle-remove.1 +3 -3
- data/bundler/lib/bundler/man/bundle-remove.1.ronn +1 -1
- data/bundler/lib/bundler/man/bundle-show.1 +7 -4
- data/bundler/lib/bundler/man/bundle-show.1.ronn +4 -0
- data/bundler/lib/bundler/man/bundle-update.1 +17 -11
- data/bundler/lib/bundler/man/bundle-update.1.ronn +17 -9
- data/bundler/lib/bundler/man/bundle-version.1 +3 -3
- data/bundler/lib/bundler/man/bundle-viz.1 +6 -6
- data/bundler/lib/bundler/man/bundle-viz.1.ronn +7 -3
- data/bundler/lib/bundler/man/bundle.1 +3 -3
- data/bundler/lib/bundler/man/gemfile.5 +7 -5
- data/bundler/lib/bundler/man/gemfile.5.ronn +8 -2
- data/bundler/lib/bundler/man/index.txt +4 -0
- data/bundler/lib/bundler/match_metadata.rb +13 -0
- data/bundler/lib/bundler/match_platform.rb +31 -12
- data/bundler/lib/bundler/materialization.rb +59 -0
- data/bundler/lib/bundler/mirror.rb +3 -3
- data/bundler/lib/bundler/plugin/api/source.rb +5 -4
- data/bundler/lib/bundler/plugin/events.rb +24 -0
- data/bundler/lib/bundler/plugin/index.rb +5 -1
- data/bundler/lib/bundler/plugin/installer/path.rb +26 -0
- data/bundler/lib/bundler/plugin/installer.rb +37 -17
- data/bundler/lib/bundler/plugin/source_list.rb +4 -4
- data/bundler/lib/bundler/plugin.rb +21 -2
- data/bundler/lib/bundler/process_lock.rb +10 -14
- data/bundler/lib/bundler/remote_specification.rb +6 -1
- data/bundler/lib/bundler/resolver/base.rb +14 -3
- data/bundler/lib/bundler/resolver/candidate.rb +18 -27
- data/bundler/lib/bundler/resolver/package.rb +20 -3
- data/bundler/lib/bundler/resolver/spec_group.rb +22 -27
- data/bundler/lib/bundler/resolver/strategy.rb +40 -0
- data/bundler/lib/bundler/resolver.rb +114 -52
- data/bundler/lib/bundler/retry.rb +1 -1
- data/bundler/lib/bundler/ruby_dsl.rb +12 -3
- data/bundler/lib/bundler/ruby_version.rb +7 -1
- data/bundler/lib/bundler/rubygems_ext.rb +303 -150
- data/bundler/lib/bundler/rubygems_gem_installer.rb +40 -5
- data/bundler/lib/bundler/rubygems_integration.rb +40 -73
- data/bundler/lib/bundler/runtime.rb +48 -35
- data/bundler/lib/bundler/self_manager.rb +36 -26
- data/bundler/lib/bundler/settings/validator.rb +0 -23
- data/bundler/lib/bundler/settings.rb +36 -27
- data/bundler/lib/bundler/setup.rb +6 -0
- data/bundler/lib/bundler/shared_helpers.rb +45 -25
- data/bundler/lib/bundler/source/gemspec.rb +1 -4
- data/bundler/lib/bundler/source/git/git_proxy.rb +26 -9
- data/bundler/lib/bundler/source/git.rb +113 -41
- data/bundler/lib/bundler/source/metadata.rb +4 -3
- data/bundler/lib/bundler/source/path.rb +14 -18
- data/bundler/lib/bundler/source/rubygems/remote.rb +12 -4
- data/bundler/lib/bundler/source/rubygems.rb +54 -48
- data/bundler/lib/bundler/source.rb +2 -0
- data/bundler/lib/bundler/source_list.rb +54 -12
- data/bundler/lib/bundler/source_map.rb +1 -1
- data/bundler/lib/bundler/spec_set.rb +227 -103
- data/bundler/lib/bundler/stub_specification.rb +29 -2
- data/bundler/lib/bundler/templates/Executable +0 -11
- data/bundler/lib/bundler/templates/newgem/CODE_OF_CONDUCT.md.tt +77 -29
- data/bundler/lib/bundler/templates/newgem/Gemfile.tt +1 -3
- data/bundler/lib/bundler/templates/newgem/README.md.tt +7 -3
- data/bundler/lib/bundler/templates/newgem/github/workflows/main.yml.tt +17 -15
- data/bundler/lib/bundler/templates/newgem/newgem.gemspec.tt +14 -12
- data/bundler/lib/bundler/templates/newgem/rubocop.yml.tt +0 -5
- data/bundler/lib/bundler/ui/shell.rb +26 -4
- data/bundler/lib/bundler/ui/silent.rb +12 -1
- data/bundler/lib/bundler/uri_credentials_filter.rb +3 -3
- data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool/timed_stack.rb +53 -3
- 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 +11 -0
- data/bundler/lib/bundler/vendor/fileutils/lib/fileutils.rb +15 -13
- data/bundler/lib/bundler/vendor/net-http-persistent/README.rdoc +1 -1
- data/bundler/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/timed_stack_multi.rb +2 -1
- data/bundler/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb +134 -57
- data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/basic_package_source.rb +4 -24
- data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/static_package_source.rb +1 -0
- data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/strategy.rb +42 -0
- data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/version_range.rb +20 -8
- data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/version_solver.rb +17 -29
- data/bundler/lib/bundler/vendor/securerandom/COPYING +56 -0
- data/bundler/lib/bundler/vendor/securerandom/lib/securerandom.rb +102 -0
- data/bundler/lib/bundler/vendor/thor/lib/thor/actions/file_manipulation.rb +3 -5
- data/bundler/lib/bundler/vendor/thor/lib/thor/group.rb +11 -0
- data/bundler/lib/bundler/vendor/thor/lib/thor/parser/argument.rb +1 -4
- data/bundler/lib/bundler/vendor/thor/lib/thor/parser/option.rb +2 -2
- data/bundler/lib/bundler/vendor/thor/lib/thor/parser/options.rb +2 -1
- data/bundler/lib/bundler/vendor/thor/lib/thor/shell/basic.rb +9 -9
- data/bundler/lib/bundler/vendor/thor/lib/thor/shell/html.rb +1 -1
- data/bundler/lib/bundler/vendor/thor/lib/thor/shell/table_printer.rb +5 -21
- data/bundler/lib/bundler/vendor/thor/lib/thor/util.rb +1 -1
- data/bundler/lib/bundler/vendor/thor/lib/thor/version.rb +1 -1
- data/bundler/lib/bundler/vendor/thor/lib/thor.rb +11 -0
- data/bundler/lib/bundler/vendor/uri/COPYING +56 -0
- data/bundler/lib/bundler/vendor/uri/lib/uri/common.rb +43 -16
- data/bundler/lib/bundler/vendor/uri/lib/uri/file.rb +3 -3
- data/bundler/lib/bundler/vendor/uri/lib/uri/ftp.rb +1 -1
- data/bundler/lib/bundler/vendor/uri/lib/uri/generic.rb +28 -37
- data/bundler/lib/bundler/vendor/uri/lib/uri/http.rb +2 -2
- data/bundler/lib/bundler/vendor/uri/lib/uri/rfc2396_parser.rb +16 -9
- data/bundler/lib/bundler/vendor/uri/lib/uri/rfc3986_parser.rb +26 -3
- data/bundler/lib/bundler/vendor/uri/lib/uri/version.rb +1 -1
- data/bundler/lib/bundler/vendor/uri/lib/uri.rb +9 -9
- data/bundler/lib/bundler/vendored_net_http.rb +20 -5
- data/bundler/lib/bundler/vendored_securerandom.rb +12 -0
- data/bundler/lib/bundler/vendored_timeout.rb +7 -3
- data/bundler/lib/bundler/vendored_uri.rb +18 -1
- data/bundler/lib/bundler/version.rb +10 -2
- data/bundler/lib/bundler/worker.rb +1 -1
- data/bundler/lib/bundler/yaml_serializer.rb +12 -7
- data/bundler/lib/bundler.rb +101 -61
- data/{bundler → doc/bundler}/UPGRADING.md +132 -127
- data/doc/rubygems/CONTRIBUTING.md +227 -0
- data/{POLICIES.md → doc/rubygems/POLICIES.md} +86 -17
- data/exe/update_rubygems +1 -1
- data/lib/rubygems/basic_specification.rb +50 -10
- data/lib/rubygems/bundler_version_finder.rb +1 -1
- data/lib/rubygems/command.rb +1 -4
- data/lib/rubygems/command_manager.rb +5 -6
- data/lib/rubygems/commands/build_command.rb +2 -11
- data/lib/rubygems/commands/cleanup_command.rb +3 -13
- data/lib/rubygems/commands/contents_command.rb +17 -10
- data/lib/rubygems/commands/environment_command.rb +5 -0
- data/lib/rubygems/commands/exec_command.rb +18 -11
- data/lib/rubygems/commands/fetch_command.rb +14 -0
- data/lib/rubygems/commands/help_command.rb +2 -2
- data/lib/rubygems/commands/install_command.rb +0 -4
- data/lib/rubygems/commands/pristine_command.rb +29 -19
- data/lib/rubygems/commands/push_command.rb +31 -6
- data/lib/rubygems/commands/rdoc_command.rb +3 -10
- data/lib/rubygems/commands/rebuild_command.rb +262 -0
- data/lib/rubygems/commands/setup_command.rb +13 -18
- data/lib/rubygems/commands/sources_command.rb +2 -2
- data/lib/rubygems/commands/uninstall_command.rb +9 -4
- data/lib/rubygems/commands/unpack_command.rb +0 -6
- data/lib/rubygems/commands/update_command.rb +13 -22
- data/lib/rubygems/config_file.rb +45 -16
- data/lib/rubygems/core_ext/kernel_require.rb +15 -3
- data/lib/rubygems/core_ext/kernel_warn.rb +2 -6
- data/lib/rubygems/defaults.rb +7 -7
- data/lib/rubygems/dependency.rb +12 -16
- data/lib/rubygems/dependency_list.rb +1 -1
- data/lib/rubygems/deprecate.rb +79 -77
- data/lib/rubygems/errors.rb +2 -1
- data/lib/rubygems/exceptions.rb +2 -9
- data/lib/rubygems/ext/builder.rb +21 -8
- data/lib/rubygems/ext/cargo_builder.rb +16 -26
- data/lib/rubygems/ext/cmake_builder.rb +7 -2
- data/lib/rubygems/ext/configure_builder.rb +7 -2
- data/lib/rubygems/ext/ext_conf_builder.rb +9 -5
- data/lib/rubygems/ext/rake_builder.rb +7 -4
- data/lib/rubygems/gem_runner.rb +9 -0
- data/lib/rubygems/gemcutter_utilities/webauthn_listener.rb +11 -4
- data/lib/rubygems/gemcutter_utilities/webauthn_poller.rb +3 -1
- data/lib/rubygems/gemcutter_utilities.rb +52 -26
- data/lib/rubygems/gemspec_helpers.rb +19 -0
- data/lib/rubygems/install_update_options.rb +5 -0
- data/lib/rubygems/installer.rb +76 -90
- data/lib/rubygems/local_remote_options.rb +8 -8
- data/lib/rubygems/package/tar_header.rb +31 -4
- data/lib/rubygems/package/tar_reader/entry.rb +1 -5
- data/lib/rubygems/package/tar_writer.rb +5 -4
- data/lib/rubygems/package.rb +13 -8
- data/lib/rubygems/platform.rb +148 -43
- data/lib/rubygems/psych_tree.rb +4 -0
- data/lib/rubygems/query_utils.rb +2 -2
- data/lib/rubygems/rdoc.rb +16 -3
- data/lib/rubygems/remote_fetcher.rb +6 -7
- data/lib/rubygems/request.rb +5 -5
- data/lib/rubygems/request_set/gem_dependency_api.rb +1 -1
- data/lib/rubygems/request_set.rb +4 -7
- data/lib/rubygems/requirement.rb +16 -12
- data/lib/rubygems/resolver/activation_request.rb +1 -1
- data/lib/rubygems/resolver/api_set/gem_parser.rb +2 -5
- data/lib/rubygems/resolver/api_set.rb +13 -8
- data/lib/rubygems/resolver/best_set.rb +1 -29
- data/lib/rubygems/resolver/composed_set.rb +3 -3
- data/lib/rubygems/resolver/git_set.rb +0 -1
- data/lib/rubygems/resolver/index_set.rb +2 -2
- data/lib/rubygems/resolver/source_set.rb +1 -1
- data/lib/rubygems/resolver/spec_specification.rb +7 -0
- data/lib/rubygems/resolver.rb +8 -8
- data/lib/rubygems/s3_uri_signer.rb +8 -6
- data/lib/rubygems/safe_marshal/reader.rb +31 -14
- data/lib/rubygems/safe_marshal/visitors/to_ruby.rb +29 -16
- data/lib/rubygems/safe_yaml.rb +10 -1
- data/lib/rubygems/security.rb +1 -1
- data/lib/rubygems/source/git.rb +22 -17
- data/lib/rubygems/source/installed.rb +3 -1
- data/lib/rubygems/source/local.rb +8 -4
- data/lib/rubygems/source/specific_file.rb +5 -3
- data/lib/rubygems/source.rb +37 -29
- data/lib/rubygems/source_list.rb +1 -1
- data/lib/rubygems/spec_fetcher.rb +47 -15
- data/lib/rubygems/specification.rb +110 -183
- data/lib/rubygems/specification_policy.rb +33 -13
- data/lib/rubygems/specification_record.rb +212 -0
- data/lib/rubygems/stub_specification.rb +32 -10
- data/lib/rubygems/target_rbconfig.rb +50 -0
- data/lib/rubygems/uninstaller.rb +42 -22
- data/lib/rubygems/uri.rb +6 -6
- data/lib/rubygems/uri_formatter.rb +2 -1
- data/lib/rubygems/util/licenses.rb +118 -1
- data/lib/rubygems/util.rb +1 -1
- data/lib/rubygems/vendor/molinillo/lib/molinillo/delegates/resolution_state.rb +57 -0
- data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/delegates/specification_provider.rb +11 -11
- data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/dependency_graph/action.rb +1 -1
- data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/dependency_graph/add_edge_no_circular.rb +1 -1
- data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/dependency_graph/add_vertex.rb +1 -1
- data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/dependency_graph/delete_edge.rb +1 -1
- data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/dependency_graph/detach_vertex_named.rb +1 -1
- data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/dependency_graph/log.rb +1 -1
- data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/dependency_graph/set_payload.rb +1 -1
- data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/dependency_graph/tag.rb +1 -1
- data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/dependency_graph/vertex.rb +1 -1
- data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/dependency_graph.rb +2 -2
- data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/errors.rb +1 -1
- data/lib/rubygems/vendor/molinillo/lib/molinillo/gem_metadata.rb +6 -0
- data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/modules/specification_provider.rb +2 -2
- data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/modules/ui.rb +1 -1
- data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/resolution.rb +4 -4
- data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/resolver.rb +1 -1
- data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/state.rb +1 -1
- data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo.rb +2 -2
- data/lib/rubygems/vendor/net-http/COPYING +56 -0
- data/lib/rubygems/{net-http → vendor/net-http}/lib/net/http/generic_request.rb +9 -9
- data/lib/rubygems/{net-http → vendor/net-http}/lib/net/http/header.rb +3 -3
- data/lib/rubygems/{net-http → vendor/net-http}/lib/net/http/request.rb +3 -3
- data/lib/rubygems/{net-http → vendor/net-http}/lib/net/http/requests.rb +35 -30
- data/lib/rubygems/{net-http → vendor/net-http}/lib/net/http/response.rb +2 -2
- data/lib/rubygems/{net-http → vendor/net-http}/lib/net/http/responses.rb +6 -6
- data/lib/rubygems/{net-http → vendor/net-http}/lib/net/http/status.rb +1 -1
- data/lib/rubygems/{net-http → vendor/net-http}/lib/net/http.rb +149 -70
- data/lib/rubygems/{net-http → vendor/net-http}/lib/net/https.rb +1 -1
- data/lib/rubygems/vendor/optparse/COPYING +56 -0
- data/lib/rubygems/{optparse → vendor/optparse}/lib/optparse/ac.rb +16 -0
- data/lib/rubygems/{optparse → vendor/optparse}/lib/optparse/kwargs.rb +8 -3
- data/lib/rubygems/vendor/optparse/lib/optparse/uri.rb +7 -0
- data/lib/rubygems/{optparse → vendor/optparse}/lib/optparse/version.rb +9 -0
- data/lib/rubygems/{optparse → vendor/optparse}/lib/optparse.rb +158 -62
- data/lib/rubygems/vendor/resolv/COPYING +56 -0
- data/lib/rubygems/{resolv → vendor/resolv}/lib/resolv.rb +165 -69
- data/lib/rubygems/vendor/securerandom/COPYING +56 -0
- data/lib/rubygems/vendor/securerandom/lib/securerandom.rb +102 -0
- data/lib/rubygems/vendor/timeout/COPYING +56 -0
- data/lib/rubygems/{timeout → vendor/timeout}/lib/timeout.rb +10 -11
- data/lib/rubygems/{tsort → vendor/tsort}/lib/tsort.rb +2 -2
- data/lib/rubygems/vendor/uri/COPYING +56 -0
- data/lib/rubygems/vendor/uri/lib/uri/common.rb +880 -0
- data/lib/rubygems/vendor/uri/lib/uri/file.rb +100 -0
- data/lib/rubygems/vendor/uri/lib/uri/ftp.rb +267 -0
- data/lib/rubygems/vendor/uri/lib/uri/generic.rb +1579 -0
- data/lib/rubygems/vendor/uri/lib/uri/http.rb +125 -0
- data/lib/rubygems/vendor/uri/lib/uri/https.rb +23 -0
- data/lib/rubygems/vendor/uri/lib/uri/ldap.rb +261 -0
- data/lib/rubygems/vendor/uri/lib/uri/ldaps.rb +22 -0
- data/lib/rubygems/vendor/uri/lib/uri/mailto.rb +293 -0
- data/lib/rubygems/vendor/uri/lib/uri/rfc2396_parser.rb +546 -0
- data/lib/rubygems/vendor/uri/lib/uri/rfc3986_parser.rb +206 -0
- data/lib/rubygems/vendor/uri/lib/uri/version.rb +6 -0
- data/lib/rubygems/vendor/uri/lib/uri/ws.rb +83 -0
- data/lib/rubygems/vendor/uri/lib/uri/wss.rb +23 -0
- data/lib/rubygems/vendor/uri/lib/uri.rb +104 -0
- data/lib/rubygems/vendored_molinillo.rb +3 -0
- data/lib/rubygems/vendored_net_http.rb +5 -0
- data/lib/rubygems/vendored_optparse.rb +3 -0
- data/lib/rubygems/vendored_securerandom.rb +3 -0
- data/lib/rubygems/vendored_timeout.rb +5 -0
- data/lib/rubygems/vendored_tsort.rb +3 -0
- data/lib/rubygems/version.rb +26 -9
- data/lib/rubygems/yaml_serializer.rb +12 -7
- data/lib/rubygems.rb +160 -53
- data/rubygems-update.gemspec +11 -6
- data/setup.rb +1 -1
- metadata +124 -96
- data/bundler/lib/bundler/compact_index_client/gem_parser.rb +0 -32
- data/bundler/lib/bundler/gem_helpers.rb +0 -127
- data/bundler/lib/bundler/templates/Executable.bundler +0 -109
- data/bundler/lib/bundler/vendor/fileutils/.document +0 -1
- data/bundler/lib/bundler/vendor/net-http-persistent/.document +0 -1
- data/bundler/lib/bundler/vendor/pub_grub/.document +0 -1
- data/bundler/lib/bundler/vendor/thor/.document +0 -1
- data/bundler/lib/bundler/vendor/tsort/.document +0 -1
- data/bundler/lib/bundler/vendor/uri/.document +0 -1
- data/lib/rubygems/net/http.rb +0 -3
- data/lib/rubygems/net-http/.document +0 -1
- data/lib/rubygems/net-http/LICENSE.txt +0 -22
- data/lib/rubygems/net-http/lib/net/http/backward.rb +0 -40
- data/lib/rubygems/net-protocol/.document +0 -1
- data/lib/rubygems/net-protocol/LICENSE.txt +0 -22
- data/lib/rubygems/optparse/.document +0 -1
- data/lib/rubygems/optparse/lib/optparse/uri.rb +0 -7
- data/lib/rubygems/optparse.rb +0 -3
- data/lib/rubygems/resolv/.document +0 -1
- data/lib/rubygems/resolv/LICENSE.txt +0 -22
- data/lib/rubygems/resolver/molinillo/.document +0 -1
- data/lib/rubygems/resolver/molinillo/lib/molinillo/delegates/resolution_state.rb +0 -57
- data/lib/rubygems/resolver/molinillo/lib/molinillo/gem_metadata.rb +0 -6
- data/lib/rubygems/resolver/molinillo.rb +0 -3
- data/lib/rubygems/shellwords.rb +0 -3
- data/lib/rubygems/ssl_certs/rubygems.org/GlobalSignRootCA.pem +0 -21
- data/lib/rubygems/timeout/.document +0 -1
- data/lib/rubygems/timeout/LICENSE.txt +0 -22
- data/lib/rubygems/timeout.rb +0 -3
- data/lib/rubygems/tsort/.document +0 -1
- data/lib/rubygems/tsort/LICENSE.txt +0 -22
- data/lib/rubygems/tsort.rb +0 -3
- /data/{lib/rubygems/optparse → bundler/lib/bundler/vendor/fileutils}/COPYING +0 -0
- /data/{MAINTAINERS.txt → doc/MAINTAINERS.txt} +0 -0
- /data/{UPGRADING.md → doc/rubygems/UPGRADING.md} +0 -0
- /data/lib/rubygems/ssl_certs/rubygems.org/{GlobalSignRootCA_R3.pem → GlobalSign.pem} +0 -0
- /data/{bundler/lib/bundler/vendor/connection_pool → lib/rubygems/vendor}/.document +0 -0
- /data/lib/rubygems/{resolver → vendor}/molinillo/LICENSE +0 -0
- /data/lib/rubygems/{net-http → vendor/net-http}/lib/net/http/exceptions.rb +0 -0
- /data/lib/rubygems/{net-http → vendor/net-http}/lib/net/http/proxy_delta.rb +0 -0
- /data/{bundler/lib/bundler/vendor/fileutils → lib/rubygems/vendor/net-protocol}/LICENSE.txt +0 -0
- /data/lib/rubygems/{net-protocol → vendor/net-protocol}/lib/net/protocol.rb +0 -0
- /data/lib/rubygems/{optparse → vendor/optparse}/lib/optionparser.rb +0 -0
- /data/lib/rubygems/{optparse → vendor/optparse}/lib/optparse/date.rb +0 -0
- /data/lib/rubygems/{optparse → vendor/optparse}/lib/optparse/shellwords.rb +0 -0
- /data/lib/rubygems/{optparse → vendor/optparse}/lib/optparse/time.rb +0 -0
- /data/{bundler/lib/bundler/vendor/uri → lib/rubygems/vendor/tsort}/LICENSE.txt +0 -0
@@ -7,7 +7,7 @@ class Gem::SpecificationPolicy
|
|
7
7
|
|
8
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
12
|
VALID_URI_PATTERN = %r{\Ahttps?:\/\/([^\s:@]+:[^\s:@]*@)?[A-Za-z\d\-]+(\.[A-Za-z\d\-]+)+\.?(:\d{1,5})?([\/?]\S*)?\z} # :nodoc:
|
13
13
|
|
@@ -45,6 +45,7 @@ class Gem::SpecificationPolicy
|
|
45
45
|
|
46
46
|
def validate(strict = false)
|
47
47
|
validate_required!
|
48
|
+
validate_required_metadata!
|
48
49
|
|
49
50
|
validate_optional(strict) if packaging || strict
|
50
51
|
|
@@ -85,15 +86,17 @@ class Gem::SpecificationPolicy
|
|
85
86
|
|
86
87
|
validate_authors_field
|
87
88
|
|
88
|
-
validate_metadata
|
89
|
-
|
90
89
|
validate_licenses_length
|
91
90
|
|
92
|
-
validate_lazy_metadata
|
93
|
-
|
94
91
|
validate_duplicate_dependencies
|
95
92
|
end
|
96
93
|
|
94
|
+
def validate_required_metadata!
|
95
|
+
validate_metadata
|
96
|
+
|
97
|
+
validate_lazy_metadata
|
98
|
+
end
|
99
|
+
|
97
100
|
def validate_optional(strict)
|
98
101
|
validate_licenses
|
99
102
|
|
@@ -103,6 +106,8 @@ class Gem::SpecificationPolicy
|
|
103
106
|
|
104
107
|
validate_dependencies
|
105
108
|
|
109
|
+
validate_required_ruby_version
|
110
|
+
|
106
111
|
validate_extensions
|
107
112
|
|
108
113
|
validate_removed_attributes
|
@@ -118,6 +123,13 @@ class Gem::SpecificationPolicy
|
|
118
123
|
end
|
119
124
|
end
|
120
125
|
|
126
|
+
##
|
127
|
+
# Implementation for Specification#validate_for_resolution
|
128
|
+
|
129
|
+
def validate_for_resolution
|
130
|
+
validate_required!
|
131
|
+
end
|
132
|
+
|
121
133
|
##
|
122
134
|
# Implementation for Specification#validate_metadata
|
123
135
|
|
@@ -227,6 +239,12 @@ duplicate dependency on #{dep}, (#{prev.requirement}) use:
|
|
227
239
|
end
|
228
240
|
end
|
229
241
|
|
242
|
+
def validate_required_ruby_version
|
243
|
+
if @specification.required_ruby_version.requirements == [Gem::Requirement::DefaultRequirement]
|
244
|
+
warning "make sure you specify the oldest ruby version constraint (like \">= 3.0\") that you want your gem to support by setting the `required_ruby_version` gemspec attribute"
|
245
|
+
end
|
246
|
+
end
|
247
|
+
|
230
248
|
##
|
231
249
|
# Issues a warning for each file to be packaged which is world-readable.
|
232
250
|
#
|
@@ -266,7 +284,9 @@ duplicate dependency on #{dep}, (#{prev.requirement}) use:
|
|
266
284
|
|
267
285
|
return if rubygems_version == Gem::VERSION
|
268
286
|
|
269
|
-
|
287
|
+
warning "expected RubyGems version #{Gem::VERSION}, was #{rubygems_version}"
|
288
|
+
|
289
|
+
@specification.rubygems_version = Gem::VERSION
|
270
290
|
end
|
271
291
|
|
272
292
|
def validate_required_attributes
|
@@ -287,7 +307,7 @@ duplicate dependency on #{dep}, (#{prev.requirement}) use:
|
|
287
307
|
elsif !VALID_NAME_PATTERN.match?(name)
|
288
308
|
error "invalid value for attribute name: #{name.dump} can only include letters, numbers, dashes, and underscores"
|
289
309
|
elsif SPECIAL_CHARACTERS.match?(name)
|
290
|
-
error "invalid value for attribute name: #{name.dump}
|
310
|
+
error "invalid value for attribute name: #{name.dump} cannot begin with a period, dash, or underscore"
|
291
311
|
end
|
292
312
|
end
|
293
313
|
|
@@ -427,13 +447,13 @@ or set it to nil if you don't want to specify a license.
|
|
427
447
|
|
428
448
|
# Make sure a homepage is valid HTTP/HTTPS URI
|
429
449
|
if homepage && !homepage.empty?
|
430
|
-
|
450
|
+
require_relative "vendor/uri/lib/uri"
|
431
451
|
begin
|
432
|
-
homepage_uri = URI.parse(homepage)
|
433
|
-
unless [URI::HTTP, URI::HTTPS].member? homepage_uri.class
|
452
|
+
homepage_uri = Gem::URI.parse(homepage)
|
453
|
+
unless [Gem::URI::HTTP, Gem::URI::HTTPS].member? homepage_uri.class
|
434
454
|
error "\"#{homepage}\" is not a valid HTTP URI"
|
435
455
|
end
|
436
|
-
rescue URI::InvalidURIError
|
456
|
+
rescue Gem::URI::InvalidURIError
|
437
457
|
error "\"#{homepage}\" is not a valid HTTP URI"
|
438
458
|
end
|
439
459
|
end
|
@@ -497,10 +517,10 @@ You have specified rust based extension, but Cargo.lock is not part of the gem f
|
|
497
517
|
|
498
518
|
def validate_rake_extensions(builder) # :nodoc:
|
499
519
|
rake_extension = @specification.extensions.any? {|s| builder.builder_for(s) == Gem::Ext::RakeBuilder }
|
500
|
-
rake_dependency = @specification.dependencies.any? {|d| d.name == "rake" }
|
520
|
+
rake_dependency = @specification.dependencies.any? {|d| d.name == "rake" && d.type == :runtime }
|
501
521
|
|
502
522
|
warning <<-WARNING if rake_extension && !rake_dependency
|
503
|
-
You have specified rake based extension, but rake is not added as dependency. It is recommended to add rake as a dependency in gemspec since there's no guarantee rake will be already installed.
|
523
|
+
You have specified rake based extension, but rake is not added as runtime dependency. It is recommended to add rake as a runtime dependency in gemspec since there's no guarantee rake will be already installed.
|
504
524
|
WARNING
|
505
525
|
end
|
506
526
|
|
@@ -0,0 +1,212 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Gem
|
4
|
+
class SpecificationRecord
|
5
|
+
def self.dirs_from(paths)
|
6
|
+
paths.map do |path|
|
7
|
+
File.join(path, "specifications")
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.from_path(path)
|
12
|
+
new(dirs_from([path]))
|
13
|
+
end
|
14
|
+
|
15
|
+
def initialize(dirs)
|
16
|
+
@all = nil
|
17
|
+
@stubs = nil
|
18
|
+
@stubs_by_name = {}
|
19
|
+
@spec_with_requirable_file = {}
|
20
|
+
@active_stub_with_requirable_file = {}
|
21
|
+
|
22
|
+
@dirs = dirs
|
23
|
+
end
|
24
|
+
|
25
|
+
# Sentinel object to represent "not found" stubs
|
26
|
+
NOT_FOUND = Struct.new(:to_spec, :this).new
|
27
|
+
private_constant :NOT_FOUND
|
28
|
+
|
29
|
+
##
|
30
|
+
# Returns the list of all specifications in the record
|
31
|
+
|
32
|
+
def all
|
33
|
+
@all ||= stubs.map(&:to_spec)
|
34
|
+
end
|
35
|
+
|
36
|
+
##
|
37
|
+
# Returns a Gem::StubSpecification for every specification in the record
|
38
|
+
|
39
|
+
def stubs
|
40
|
+
@stubs ||= begin
|
41
|
+
pattern = "*.gemspec"
|
42
|
+
stubs = stubs_for_pattern(pattern, false)
|
43
|
+
|
44
|
+
@stubs_by_name = stubs.select {|s| Gem::Platform.match_spec? s }.group_by(&:name)
|
45
|
+
stubs
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
##
|
50
|
+
# Returns a Gem::StubSpecification for every specification in the record
|
51
|
+
# named +name+ only returns stubs that match Gem.platforms
|
52
|
+
|
53
|
+
def stubs_for(name)
|
54
|
+
if @stubs
|
55
|
+
@stubs_by_name[name] || []
|
56
|
+
else
|
57
|
+
@stubs_by_name[name] ||= stubs_for_pattern("#{name}-*.gemspec").select do |s|
|
58
|
+
s.name == name
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
##
|
64
|
+
# Finds stub specifications matching a pattern in the record, optionally
|
65
|
+
# filtering out specs not matching the current platform
|
66
|
+
|
67
|
+
def stubs_for_pattern(pattern, match_platform = true)
|
68
|
+
installed_stubs = installed_stubs(pattern)
|
69
|
+
installed_stubs.select! {|s| Gem::Platform.match_spec? s } if match_platform
|
70
|
+
stubs = installed_stubs + Gem::Specification.default_stubs(pattern)
|
71
|
+
Gem::Specification._resort!(stubs)
|
72
|
+
stubs
|
73
|
+
end
|
74
|
+
|
75
|
+
##
|
76
|
+
# Adds +spec+ to the the record, keeping the collection properly sorted.
|
77
|
+
|
78
|
+
def add_spec(spec)
|
79
|
+
return if all.include? spec
|
80
|
+
|
81
|
+
all << spec
|
82
|
+
stubs << spec
|
83
|
+
(@stubs_by_name[spec.name] ||= []) << spec
|
84
|
+
|
85
|
+
Gem::Specification._resort!(@stubs_by_name[spec.name])
|
86
|
+
Gem::Specification._resort!(stubs)
|
87
|
+
end
|
88
|
+
|
89
|
+
##
|
90
|
+
# Removes +spec+ from the record.
|
91
|
+
|
92
|
+
def remove_spec(spec)
|
93
|
+
all.delete spec.to_spec
|
94
|
+
stubs.delete spec
|
95
|
+
(@stubs_by_name[spec.name] || []).delete spec
|
96
|
+
end
|
97
|
+
|
98
|
+
##
|
99
|
+
# Sets the specs known by the record to +specs+.
|
100
|
+
|
101
|
+
def all=(specs)
|
102
|
+
@stubs_by_name = specs.group_by(&:name)
|
103
|
+
@all = @stubs = specs
|
104
|
+
end
|
105
|
+
|
106
|
+
##
|
107
|
+
# Return full names of all specs in the record in sorted order.
|
108
|
+
|
109
|
+
def all_names
|
110
|
+
all.map(&:full_name)
|
111
|
+
end
|
112
|
+
|
113
|
+
include Enumerable
|
114
|
+
|
115
|
+
##
|
116
|
+
# Enumerate every known spec.
|
117
|
+
|
118
|
+
def each
|
119
|
+
return enum_for(:each) unless block_given?
|
120
|
+
|
121
|
+
all.each do |x|
|
122
|
+
yield x
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
##
|
127
|
+
# Returns every spec in the record that matches +name+ and optional +requirements+.
|
128
|
+
|
129
|
+
def find_all_by_name(name, *requirements)
|
130
|
+
req = Gem::Requirement.create(*requirements)
|
131
|
+
env_req = Gem.env_requirement(name)
|
132
|
+
|
133
|
+
matches = stubs_for(name).find_all do |spec|
|
134
|
+
req.satisfied_by?(spec.version) && env_req.satisfied_by?(spec.version)
|
135
|
+
end.map(&:to_spec)
|
136
|
+
|
137
|
+
if name == "bundler" && !req.specific?
|
138
|
+
require_relative "bundler_version_finder"
|
139
|
+
Gem::BundlerVersionFinder.prioritize!(matches)
|
140
|
+
end
|
141
|
+
|
142
|
+
matches
|
143
|
+
end
|
144
|
+
|
145
|
+
##
|
146
|
+
# Return the best specification in the record that contains the file matching +path+.
|
147
|
+
|
148
|
+
def find_by_path(path)
|
149
|
+
path = path.dup.freeze
|
150
|
+
spec = @spec_with_requirable_file[path] ||= stubs.find do |s|
|
151
|
+
s.contains_requirable_file? path
|
152
|
+
end || NOT_FOUND
|
153
|
+
|
154
|
+
spec.to_spec
|
155
|
+
end
|
156
|
+
|
157
|
+
##
|
158
|
+
# Return the best specification in the record that contains the file
|
159
|
+
# matching +path+ amongst the specs that are not activated.
|
160
|
+
|
161
|
+
def find_inactive_by_path(path)
|
162
|
+
stub = stubs.find do |s|
|
163
|
+
next if s.activated?
|
164
|
+
s.contains_requirable_file? path
|
165
|
+
end
|
166
|
+
stub&.to_spec
|
167
|
+
end
|
168
|
+
|
169
|
+
##
|
170
|
+
# Return the best specification in the record that contains the file
|
171
|
+
# matching +path+, among those already activated.
|
172
|
+
|
173
|
+
def find_active_stub_by_path(path)
|
174
|
+
stub = @active_stub_with_requirable_file[path] ||= stubs.find do |s|
|
175
|
+
s.activated? && s.contains_requirable_file?(path)
|
176
|
+
end || NOT_FOUND
|
177
|
+
|
178
|
+
stub.this
|
179
|
+
end
|
180
|
+
|
181
|
+
##
|
182
|
+
# Return the latest specs in the record, optionally including prerelease
|
183
|
+
# specs if +prerelease+ is true.
|
184
|
+
|
185
|
+
def latest_specs(prerelease)
|
186
|
+
Gem::Specification._latest_specs stubs, prerelease
|
187
|
+
end
|
188
|
+
|
189
|
+
##
|
190
|
+
# Return the latest installed spec in the record for gem +name+.
|
191
|
+
|
192
|
+
def latest_spec_for(name)
|
193
|
+
latest_specs(true).find {|installed_spec| installed_spec.name == name }
|
194
|
+
end
|
195
|
+
|
196
|
+
private
|
197
|
+
|
198
|
+
def installed_stubs(pattern)
|
199
|
+
map_stubs(pattern) do |path, base_dir, gems_dir|
|
200
|
+
Gem::StubSpecification.gemspec_stub(path, base_dir, gems_dir)
|
201
|
+
end
|
202
|
+
end
|
203
|
+
|
204
|
+
def map_stubs(pattern)
|
205
|
+
@dirs.flat_map do |dir|
|
206
|
+
base_dir = File.dirname dir
|
207
|
+
gems_dir = File.join base_dir, "gems"
|
208
|
+
Gem::Specification.gemspec_stubs_in(dir, pattern) {|path| yield path, base_dir, gems_dir }
|
209
|
+
end
|
210
|
+
end
|
211
|
+
end
|
212
|
+
end
|
@@ -83,11 +83,7 @@ class Gem::StubSpecification < Gem::BasicSpecification
|
|
83
83
|
# True when this gem has been activated
|
84
84
|
|
85
85
|
def activated?
|
86
|
-
@activated ||=
|
87
|
-
begin
|
88
|
-
loaded = Gem.loaded_specs[name]
|
89
|
-
loaded && loaded.version == version
|
90
|
-
end
|
86
|
+
@activated ||= !loaded_spec.nil?
|
91
87
|
end
|
92
88
|
|
93
89
|
def default_gem?
|
@@ -187,11 +183,7 @@ class Gem::StubSpecification < Gem::BasicSpecification
|
|
187
183
|
# The full Gem::Specification for this gem, loaded from evalling its gemspec
|
188
184
|
|
189
185
|
def spec
|
190
|
-
@spec ||= if @data
|
191
|
-
loaded = Gem.loaded_specs[name]
|
192
|
-
loaded if loaded && loaded.version == version
|
193
|
-
end
|
194
|
-
|
186
|
+
@spec ||= loaded_spec if @data
|
195
187
|
@spec ||= Gem::Specification.load(loaded_from)
|
196
188
|
end
|
197
189
|
alias_method :to_spec, :spec
|
@@ -210,4 +202,34 @@ class Gem::StubSpecification < Gem::BasicSpecification
|
|
210
202
|
def stubbed?
|
211
203
|
data.is_a? StubLine
|
212
204
|
end
|
205
|
+
|
206
|
+
def ==(other) # :nodoc:
|
207
|
+
self.class === other &&
|
208
|
+
name == other.name &&
|
209
|
+
version == other.version &&
|
210
|
+
platform == other.platform
|
211
|
+
end
|
212
|
+
|
213
|
+
alias_method :eql?, :== # :nodoc:
|
214
|
+
|
215
|
+
def hash # :nodoc:
|
216
|
+
name.hash ^ version.hash ^ platform.hash
|
217
|
+
end
|
218
|
+
|
219
|
+
def <=>(other) # :nodoc:
|
220
|
+
sort_obj <=> other.sort_obj
|
221
|
+
end
|
222
|
+
|
223
|
+
def sort_obj # :nodoc:
|
224
|
+
[name, version, Gem::Platform.sort_priority(platform)]
|
225
|
+
end
|
226
|
+
|
227
|
+
private
|
228
|
+
|
229
|
+
def loaded_spec
|
230
|
+
spec = Gem.loaded_specs[name]
|
231
|
+
return unless spec && spec.version == version && spec.default_gem? == default_gem?
|
232
|
+
|
233
|
+
spec
|
234
|
+
end
|
213
235
|
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "rbconfig"
|
4
|
+
|
5
|
+
##
|
6
|
+
# A TargetConfig is a wrapper around an RbConfig object that provides a
|
7
|
+
# consistent interface for querying configuration for *deployment target
|
8
|
+
# platform*, where the gem being installed is intended to run on.
|
9
|
+
#
|
10
|
+
# The TargetConfig is typically created from the RbConfig of the running Ruby
|
11
|
+
# process, but can also be created from an RbConfig file on disk for cross-
|
12
|
+
# compiling gems.
|
13
|
+
|
14
|
+
class Gem::TargetRbConfig
|
15
|
+
attr_reader :path
|
16
|
+
|
17
|
+
def initialize(rbconfig, path)
|
18
|
+
@rbconfig = rbconfig
|
19
|
+
@path = path
|
20
|
+
end
|
21
|
+
|
22
|
+
##
|
23
|
+
# Creates a TargetRbConfig for the platform that RubyGems is running on.
|
24
|
+
|
25
|
+
def self.for_running_ruby
|
26
|
+
new(::RbConfig, nil)
|
27
|
+
end
|
28
|
+
|
29
|
+
##
|
30
|
+
# Creates a TargetRbConfig from the RbConfig file at the given path.
|
31
|
+
# Typically used for cross-compiling gems.
|
32
|
+
|
33
|
+
def self.from_path(rbconfig_path)
|
34
|
+
namespace = Module.new do |m|
|
35
|
+
# Load the rbconfig.rb file within a new anonymous module to avoid
|
36
|
+
# conflicts with the rbconfig for the running platform.
|
37
|
+
Kernel.load rbconfig_path, m
|
38
|
+
end
|
39
|
+
rbconfig = namespace.const_get(:RbConfig)
|
40
|
+
|
41
|
+
new(rbconfig, rbconfig_path)
|
42
|
+
end
|
43
|
+
|
44
|
+
##
|
45
|
+
# Queries the configuration for the given key.
|
46
|
+
|
47
|
+
def [](key)
|
48
|
+
@rbconfig::CONFIG[key]
|
49
|
+
end
|
50
|
+
end
|
data/lib/rubygems/uninstaller.rb
CHANGED
@@ -10,7 +10,6 @@ require "fileutils"
|
|
10
10
|
require_relative "../rubygems"
|
11
11
|
require_relative "installer_uninstaller_utils"
|
12
12
|
require_relative "dependency_list"
|
13
|
-
require_relative "rdoc"
|
14
13
|
require_relative "user_interaction"
|
15
14
|
|
16
15
|
##
|
@@ -32,7 +31,7 @@ class Gem::Uninstaller
|
|
32
31
|
attr_reader :bin_dir
|
33
32
|
|
34
33
|
##
|
35
|
-
# The gem repository the gem will be
|
34
|
+
# The gem repository the gem will be uninstalled from
|
36
35
|
|
37
36
|
attr_reader :gem_home
|
38
37
|
|
@@ -49,8 +48,9 @@ class Gem::Uninstaller
|
|
49
48
|
# TODO: document the valid options
|
50
49
|
@gem = gem
|
51
50
|
@version = options[:version] || Gem::Requirement.default
|
52
|
-
@
|
53
|
-
@
|
51
|
+
@install_dir = options[:install_dir]
|
52
|
+
@gem_home = File.realpath(@install_dir || Gem.dir)
|
53
|
+
@user_dir = File.exist?(Gem.user_dir) ? File.realpath(Gem.user_dir) : Gem.user_dir
|
54
54
|
@force_executables = options[:executables]
|
55
55
|
@force_all = options[:all]
|
56
56
|
@force_ignore = options[:ignore]
|
@@ -70,7 +70,7 @@ class Gem::Uninstaller
|
|
70
70
|
|
71
71
|
# only add user directory if install_dir is not set
|
72
72
|
@user_install = false
|
73
|
-
@user_install = options[:user_install] unless
|
73
|
+
@user_install = options[:user_install] unless @install_dir
|
74
74
|
|
75
75
|
# Optimization: populated during #uninstall
|
76
76
|
@default_specs_matching_uninstall_params = []
|
@@ -85,11 +85,7 @@ class Gem::Uninstaller
|
|
85
85
|
|
86
86
|
list = []
|
87
87
|
|
88
|
-
|
89
|
-
Gem::Specification.dirs +
|
90
|
-
[Gem.default_specifications_dir]
|
91
|
-
|
92
|
-
Gem::Specification.each_spec dirs do |spec|
|
88
|
+
specification_record.stubs.each do |spec|
|
93
89
|
next unless dependency.matches_spec? spec
|
94
90
|
|
95
91
|
list << spec
|
@@ -101,11 +97,11 @@ class Gem::Uninstaller
|
|
101
97
|
|
102
98
|
default_specs, list = list.partition(&:default_gem?)
|
103
99
|
warn_cannot_uninstall_default_gems(default_specs - list)
|
104
|
-
@default_specs_matching_uninstall_params = default_specs
|
100
|
+
@default_specs_matching_uninstall_params = default_specs.map(&:to_spec)
|
105
101
|
|
106
102
|
list, other_repo_specs = list.partition do |spec|
|
107
103
|
@gem_home == spec.base_dir ||
|
108
|
-
(@user_install && spec.base_dir ==
|
104
|
+
(@user_install && spec.base_dir == @user_dir)
|
109
105
|
end
|
110
106
|
|
111
107
|
list.sort!
|
@@ -125,7 +121,7 @@ class Gem::Uninstaller
|
|
125
121
|
remove_all list
|
126
122
|
|
127
123
|
elsif list.size > 1
|
128
|
-
gem_names = list.map(&:
|
124
|
+
gem_names = list.map(&:full_name_with_location)
|
129
125
|
gem_names << "All versions"
|
130
126
|
|
131
127
|
say
|
@@ -146,7 +142,9 @@ class Gem::Uninstaller
|
|
146
142
|
##
|
147
143
|
# Uninstalls gem +spec+
|
148
144
|
|
149
|
-
def uninstall_gem(
|
145
|
+
def uninstall_gem(stub)
|
146
|
+
spec = stub.to_spec
|
147
|
+
|
150
148
|
@spec = spec
|
151
149
|
|
152
150
|
unless dependencies_ok? spec
|
@@ -164,6 +162,8 @@ class Gem::Uninstaller
|
|
164
162
|
remove_plugins @spec
|
165
163
|
remove @spec
|
166
164
|
|
165
|
+
specification_record.remove_spec(stub)
|
166
|
+
|
167
167
|
regenerate_plugins
|
168
168
|
|
169
169
|
Gem.post_uninstall_hooks.each do |hook|
|
@@ -177,7 +177,7 @@ class Gem::Uninstaller
|
|
177
177
|
# Removes installed executables and batch files (windows only) for +spec+.
|
178
178
|
|
179
179
|
def remove_executables(spec)
|
180
|
-
return if spec.executables.empty?
|
180
|
+
return if spec.executables.empty? || default_spec_matches?(spec)
|
181
181
|
|
182
182
|
executables = spec.executables.clone
|
183
183
|
|
@@ -239,7 +239,7 @@ class Gem::Uninstaller
|
|
239
239
|
|
240
240
|
def remove(spec)
|
241
241
|
unless path_ok?(@gem_home, spec) ||
|
242
|
-
(@user_install && path_ok?(
|
242
|
+
(@user_install && path_ok?(@user_dir, spec))
|
243
243
|
e = Gem::GemNotInHomeException.new \
|
244
244
|
"Gem '#{spec.full_name}' is not installed in directory #{@gem_home}"
|
245
245
|
e.spec = spec
|
@@ -250,7 +250,15 @@ class Gem::Uninstaller
|
|
250
250
|
raise Gem::FilePermissionError, spec.base_dir unless
|
251
251
|
File.writable?(spec.base_dir)
|
252
252
|
|
253
|
-
|
253
|
+
full_gem_path = spec.full_gem_path
|
254
|
+
exclusions = []
|
255
|
+
|
256
|
+
if default_spec_matches?(spec) && spec.executables.any?
|
257
|
+
exclusions = spec.executables.map {|exe| File.join(spec.bin_dir, exe) }
|
258
|
+
exclusions << File.dirname(exclusions.last) until exclusions.last == full_gem_path
|
259
|
+
end
|
260
|
+
|
261
|
+
safe_delete { rm_r full_gem_path, exclusions: exclusions }
|
254
262
|
safe_delete { FileUtils.rm_r spec.extension_dir }
|
255
263
|
|
256
264
|
old_platform_name = spec.original_name
|
@@ -274,8 +282,6 @@ class Gem::Uninstaller
|
|
274
282
|
|
275
283
|
safe_delete { FileUtils.rm_r gemspec }
|
276
284
|
announce_deletion_of(spec)
|
277
|
-
|
278
|
-
Gem::Specification.reset
|
279
285
|
end
|
280
286
|
|
281
287
|
##
|
@@ -284,17 +290,17 @@ class Gem::Uninstaller
|
|
284
290
|
def remove_plugins(spec) # :nodoc:
|
285
291
|
return if spec.plugins.empty?
|
286
292
|
|
287
|
-
remove_plugins_for(spec,
|
293
|
+
remove_plugins_for(spec, plugin_dir_for(spec))
|
288
294
|
end
|
289
295
|
|
290
296
|
##
|
291
297
|
# Regenerates plugin wrappers after removal.
|
292
298
|
|
293
299
|
def regenerate_plugins
|
294
|
-
latest =
|
300
|
+
latest = specification_record.latest_spec_for(@spec.name)
|
295
301
|
return if latest.nil?
|
296
302
|
|
297
|
-
regenerate_plugins_for(latest, @
|
303
|
+
regenerate_plugins_for(latest, plugin_dir_for(@spec))
|
298
304
|
end
|
299
305
|
|
300
306
|
##
|
@@ -379,6 +385,16 @@ class Gem::Uninstaller
|
|
379
385
|
|
380
386
|
private
|
381
387
|
|
388
|
+
def rm_r(path, exclusions:)
|
389
|
+
FileUtils::Entry_.new(path).postorder_traverse do |ent|
|
390
|
+
ent.remove unless exclusions.include?(ent.path)
|
391
|
+
end
|
392
|
+
end
|
393
|
+
|
394
|
+
def specification_record
|
395
|
+
@specification_record ||= @install_dir ? Gem::SpecificationRecord.from_path(@install_dir) : Gem::Specification.specification_record
|
396
|
+
end
|
397
|
+
|
382
398
|
def announce_deletion_of(spec)
|
383
399
|
name = spec.full_name
|
384
400
|
say "Successfully uninstalled #{name}"
|
@@ -406,4 +422,8 @@ class Gem::Uninstaller
|
|
406
422
|
say "Gem #{spec.full_name} cannot be uninstalled because it is a default gem"
|
407
423
|
end
|
408
424
|
end
|
425
|
+
|
426
|
+
def plugin_dir_for(spec)
|
427
|
+
Gem.plugindir(spec.base_dir)
|
428
|
+
end
|
409
429
|
end
|
data/lib/rubygems/uri.rb
CHANGED
@@ -16,9 +16,9 @@ class Gem::Uri
|
|
16
16
|
# Parses uri, raising if it's invalid
|
17
17
|
|
18
18
|
def self.parse!(uri)
|
19
|
-
|
19
|
+
require_relative "vendor/uri/lib/uri"
|
20
20
|
|
21
|
-
raise URI::InvalidURIError unless uri
|
21
|
+
raise Gem::URI::InvalidURIError unless uri
|
22
22
|
|
23
23
|
return uri unless uri.is_a?(String)
|
24
24
|
|
@@ -28,9 +28,9 @@ class Gem::Uri
|
|
28
28
|
# as "%7BDESede%7D". If this is escaped again the percentage
|
29
29
|
# symbols will be escaped.
|
30
30
|
begin
|
31
|
-
URI.parse(uri)
|
32
|
-
rescue URI::InvalidURIError
|
33
|
-
URI.parse(URI::
|
31
|
+
Gem::URI.parse(uri)
|
32
|
+
rescue Gem::URI::InvalidURIError
|
33
|
+
Gem::URI.parse(Gem::URI::RFC2396_PARSER.escape(uri))
|
34
34
|
end
|
35
35
|
end
|
36
36
|
|
@@ -39,7 +39,7 @@ class Gem::Uri
|
|
39
39
|
|
40
40
|
def self.parse(uri)
|
41
41
|
parse!(uri)
|
42
|
-
rescue URI::InvalidURIError
|
42
|
+
rescue Gem::URI::InvalidURIError
|
43
43
|
uri
|
44
44
|
end
|
45
45
|
|