rubygems-update 3.3.18 → 3.3.22
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 +65 -0
- data/Manifest.txt +11 -0
- data/bin/gem +2 -2
- data/bin/update_rubygems +4 -4
- data/bundler/CHANGELOG.md +100 -0
- data/bundler/UPGRADING.md +11 -4
- data/bundler/bundler.gemspec +6 -8
- data/bundler/lib/bundler/build_metadata.rb +2 -2
- data/bundler/lib/bundler/cli/common.rb +1 -0
- data/bundler/lib/bundler/cli/install.rb +5 -2
- data/bundler/lib/bundler/cli/outdated.rb +12 -3
- data/bundler/lib/bundler/cli/platform.rb +1 -1
- data/bundler/lib/bundler/cli.rb +7 -4
- data/bundler/lib/bundler/current_ruby.rb +14 -5
- data/bundler/lib/bundler/definition.rb +102 -31
- data/bundler/lib/bundler/dependency.rb +18 -85
- data/bundler/lib/bundler/dsl.rb +2 -2
- data/bundler/lib/bundler/endpoint_specification.rb +2 -13
- data/bundler/lib/bundler/feature_flag.rb +0 -1
- data/bundler/lib/bundler/fetcher.rb +6 -6
- data/bundler/lib/bundler/gem_helpers.rb +7 -1
- data/bundler/lib/bundler/gem_version_promoter.rb +8 -18
- data/bundler/lib/bundler/index.rb +10 -12
- data/bundler/lib/bundler/injector.rb +2 -1
- data/bundler/lib/bundler/inline.rb +1 -1
- data/bundler/lib/bundler/installer/standalone.rb +1 -1
- data/bundler/lib/bundler/installer.rb +14 -12
- data/bundler/lib/bundler/lazy_specification.rb +30 -23
- data/bundler/lib/bundler/lockfile_generator.rb +1 -1
- data/bundler/lib/bundler/man/bundle-add.1 +6 -2
- data/bundler/lib/bundler/man/bundle-add.1.ronn +4 -1
- data/bundler/lib/bundler/man/bundle-binstubs.1 +1 -1
- data/bundler/lib/bundler/man/bundle-cache.1 +7 -1
- data/bundler/lib/bundler/man/bundle-cache.1.ronn +7 -0
- data/bundler/lib/bundler/man/bundle-check.1 +1 -1
- data/bundler/lib/bundler/man/bundle-clean.1 +1 -1
- data/bundler/lib/bundler/man/bundle-config.1 +25 -6
- data/bundler/lib/bundler/man/bundle-config.1.ronn +16 -6
- data/bundler/lib/bundler/man/bundle-console.1 +53 -0
- data/bundler/lib/bundler/man/bundle-console.1.ronn +44 -0
- data/bundler/lib/bundler/man/bundle-doctor.1 +1 -1
- data/bundler/lib/bundler/man/bundle-exec.1 +2 -2
- data/bundler/lib/bundler/man/bundle-exec.1.ronn +1 -1
- data/bundler/lib/bundler/man/bundle-gem.1 +1 -1
- data/bundler/lib/bundler/man/bundle-help.1 +13 -0
- data/bundler/lib/bundler/man/bundle-help.1.ronn +12 -0
- data/bundler/lib/bundler/man/bundle-info.1 +1 -1
- data/bundler/lib/bundler/man/bundle-init.1 +1 -1
- data/bundler/lib/bundler/man/bundle-inject.1 +5 -2
- data/bundler/lib/bundler/man/bundle-inject.1.ronn +3 -1
- data/bundler/lib/bundler/man/bundle-install.1 +5 -1
- data/bundler/lib/bundler/man/bundle-install.1.ronn +6 -0
- data/bundler/lib/bundler/man/bundle-list.1 +1 -1
- data/bundler/lib/bundler/man/bundle-lock.1 +1 -1
- data/bundler/lib/bundler/man/bundle-open.1 +1 -1
- data/bundler/lib/bundler/man/bundle-outdated.1 +1 -1
- data/bundler/lib/bundler/man/bundle-platform.1 +16 -6
- data/bundler/lib/bundler/man/bundle-platform.1.ronn +14 -7
- data/bundler/lib/bundler/man/bundle-plugin.1 +81 -0
- data/bundler/lib/bundler/man/bundle-plugin.1.ronn +59 -0
- data/bundler/lib/bundler/man/bundle-pristine.1 +1 -1
- data/bundler/lib/bundler/man/bundle-remove.1 +1 -1
- data/bundler/lib/bundler/man/bundle-show.1 +1 -1
- data/bundler/lib/bundler/man/bundle-update.1 +1 -1
- data/bundler/lib/bundler/man/bundle-version.1 +35 -0
- data/bundler/lib/bundler/man/bundle-version.1.ronn +24 -0
- data/bundler/lib/bundler/man/bundle-viz.1 +4 -1
- data/bundler/lib/bundler/man/bundle-viz.1.ronn +2 -0
- data/bundler/lib/bundler/man/bundle.1 +15 -10
- data/bundler/lib/bundler/man/bundle.1.ronn +12 -7
- data/bundler/lib/bundler/man/gemfile.5 +23 -47
- data/bundler/lib/bundler/man/gemfile.5.ronn +32 -43
- data/bundler/lib/bundler/man/index.txt +4 -0
- data/bundler/lib/bundler/match_metadata.rb +13 -0
- data/bundler/lib/bundler/match_remote_metadata.rb +29 -0
- data/bundler/lib/bundler/plugin.rb +2 -0
- data/bundler/lib/bundler/remote_specification.rb +6 -11
- data/bundler/lib/bundler/resolver/base.rb +50 -0
- data/bundler/lib/bundler/resolver/spec_group.rb +11 -8
- data/bundler/lib/bundler/resolver.rb +95 -90
- data/bundler/lib/bundler/ruby_dsl.rb +1 -1
- data/bundler/lib/bundler/ruby_version.rb +5 -5
- data/bundler/lib/bundler/rubygems_ext.rb +52 -1
- data/bundler/lib/bundler/rubygems_gem_installer.rb +19 -12
- data/bundler/lib/bundler/settings.rb +1 -1
- data/bundler/lib/bundler/source/metadata.rb +1 -1
- data/bundler/lib/bundler/source_list.rb +4 -0
- data/bundler/lib/bundler/spec_set.rb +48 -33
- data/bundler/lib/bundler/version.rb +1 -1
- data/bundler/lib/bundler.rb +3 -3
- data/lib/rubygems/available_set.rb +3 -3
- data/lib/rubygems/basic_specification.rb +4 -4
- data/lib/rubygems/command.rb +25 -25
- data/lib/rubygems/command_manager.rb +9 -9
- data/lib/rubygems/commands/build_command.rb +8 -8
- data/lib/rubygems/commands/cert_command.rb +33 -33
- data/lib/rubygems/commands/check_command.rb +20 -20
- data/lib/rubygems/commands/cleanup_command.rb +17 -17
- data/lib/rubygems/commands/contents_command.rb +13 -13
- data/lib/rubygems/commands/dependency_command.rb +16 -16
- data/lib/rubygems/commands/environment_command.rb +5 -5
- data/lib/rubygems/commands/fetch_command.rb +8 -8
- data/lib/rubygems/commands/generate_index_command.rb +17 -17
- data/lib/rubygems/commands/help_command.rb +3 -3
- data/lib/rubygems/commands/info_command.rb +3 -3
- data/lib/rubygems/commands/install_command.rb +20 -20
- data/lib/rubygems/commands/list_command.rb +3 -3
- data/lib/rubygems/commands/lock_command.rb +4 -4
- data/lib/rubygems/commands/mirror_command.rb +3 -3
- data/lib/rubygems/commands/open_command.rb +9 -9
- data/lib/rubygems/commands/outdated_command.rb +5 -5
- data/lib/rubygems/commands/owner_command.rb +11 -11
- data/lib/rubygems/commands/pristine_command.rb +36 -36
- data/lib/rubygems/commands/push_command.rb +8 -8
- data/lib/rubygems/commands/query_command.rb +8 -8
- data/lib/rubygems/commands/rdoc_command.rb +17 -17
- data/lib/rubygems/commands/search_command.rb +3 -3
- data/lib/rubygems/commands/server_command.rb +3 -3
- data/lib/rubygems/commands/setup_command.rb +96 -106
- data/lib/rubygems/commands/signin_command.rb +9 -9
- data/lib/rubygems/commands/signout_command.rb +7 -7
- data/lib/rubygems/commands/sources_command.rb +21 -21
- data/lib/rubygems/commands/specification_command.rb +13 -13
- data/lib/rubygems/commands/stale_command.rb +2 -2
- data/lib/rubygems/commands/uninstall_command.rb +40 -40
- data/lib/rubygems/commands/unpack_command.rb +12 -12
- data/lib/rubygems/commands/update_command.rb +40 -56
- data/lib/rubygems/commands/which_command.rb +7 -7
- data/lib/rubygems/commands/yank_command.rb +11 -11
- data/lib/rubygems/config_file.rb +21 -21
- data/lib/rubygems/core_ext/kernel_gem.rb +1 -1
- data/lib/rubygems/core_ext/kernel_require.rb +1 -1
- 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 +16 -16
- data/lib/rubygems/dependency.rb +9 -9
- data/lib/rubygems/dependency_installer.rb +13 -13
- data/lib/rubygems/dependency_list.rb +6 -6
- data/lib/rubygems/doctor.rb +18 -18
- data/lib/rubygems/errors.rb +2 -2
- data/lib/rubygems/exceptions.rb +5 -5
- data/lib/rubygems/ext/build_error.rb +1 -1
- data/lib/rubygems/ext/builder.rb +16 -16
- data/lib/rubygems/ext/cargo_builder.rb +7 -7
- data/lib/rubygems/ext/cmake_builder.rb +2 -2
- data/lib/rubygems/ext/configure_builder.rb +1 -1
- data/lib/rubygems/ext/ext_conf_builder.rb +8 -8
- data/lib/rubygems/ext/rake_builder.rb +3 -3
- data/lib/rubygems/ext.rb +7 -7
- data/lib/rubygems/gem_runner.rb +5 -5
- data/lib/rubygems/gemcutter_utilities.rb +31 -28
- data/lib/rubygems/indexer.rb +27 -27
- data/lib/rubygems/install_default_message.rb +2 -2
- data/lib/rubygems/install_message.rb +2 -2
- data/lib/rubygems/install_update_options.rb +55 -55
- data/lib/rubygems/installer.rb +32 -40
- data/lib/rubygems/installer_uninstaller_utils.rb +2 -2
- data/lib/rubygems/local_remote_options.rb +18 -20
- data/lib/rubygems/mock_gem_ui.rb +2 -2
- data/lib/rubygems/name_tuple.rb +4 -4
- data/lib/rubygems/optparse.rb +1 -1
- data/lib/rubygems/package/file_source.rb +2 -2
- data/lib/rubygems/package/old.rb +8 -8
- data/lib/rubygems/package/tar_header.rb +50 -50
- data/lib/rubygems/package/tar_reader/entry.rb +2 -2
- data/lib/rubygems/package/tar_reader.rb +1 -1
- data/lib/rubygems/package/tar_writer.rb +7 -7
- data/lib/rubygems/package.rb +54 -43
- data/lib/rubygems/package_task.rb +4 -4
- data/lib/rubygems/platform.rb +66 -55
- data/lib/rubygems/psych_tree.rb +1 -1
- data/lib/rubygems/query_utils.rb +35 -35
- data/lib/rubygems/rdoc.rb +2 -2
- data/lib/rubygems/remote_fetcher.rb +22 -22
- data/lib/rubygems/request/connection_pools.rb +4 -4
- data/lib/rubygems/request/http_pool.rb +1 -1
- data/lib/rubygems/request.rb +22 -22
- data/lib/rubygems/request_set/gem_dependency_api.rb +18 -18
- data/lib/rubygems/request_set/lockfile/parser.rb +26 -26
- data/lib/rubygems/request_set/lockfile/tokenizer.rb +4 -4
- data/lib/rubygems/request_set/lockfile.rb +5 -5
- data/lib/rubygems/request_set.rb +17 -17
- data/lib/rubygems/requirement.rb +6 -6
- data/lib/rubygems/resolver/activation_request.rb +3 -3
- data/lib/rubygems/resolver/api_set.rb +4 -4
- data/lib/rubygems/resolver/api_specification.rb +6 -6
- data/lib/rubygems/resolver/best_set.rb +5 -5
- data/lib/rubygems/resolver/conflict.rb +10 -10
- data/lib/rubygems/resolver/dependency_request.rb +2 -2
- data/lib/rubygems/resolver/git_set.rb +2 -2
- data/lib/rubygems/resolver/git_specification.rb +6 -6
- data/lib/rubygems/resolver/index_set.rb +3 -3
- data/lib/rubygems/resolver/index_specification.rb +6 -5
- data/lib/rubygems/resolver/installed_specification.rb +4 -4
- data/lib/rubygems/resolver/installer_set.rb +11 -16
- data/lib/rubygems/resolver/local_specification.rb +2 -2
- data/lib/rubygems/resolver/lock_set.rb +4 -4
- data/lib/rubygems/resolver/lock_specification.rb +4 -4
- data/lib/rubygems/resolver/molinillo.rb +1 -1
- data/lib/rubygems/resolver/specification.rb +1 -1
- data/lib/rubygems/resolver/vendor_set.rb +1 -1
- data/lib/rubygems/resolver/vendor_specification.rb +3 -3
- data/lib/rubygems/resolver.rb +39 -39
- data/lib/rubygems/s3_uri_signer.rb +6 -6
- data/lib/rubygems/safe_yaml.rb +2 -2
- data/lib/rubygems/security/policies.rb +11 -11
- data/lib/rubygems/security/policy.rb +18 -18
- data/lib/rubygems/security/signer.rb +5 -5
- data/lib/rubygems/security/trust_dir.rb +3 -3
- data/lib/rubygems/security.rb +28 -28
- data/lib/rubygems/security_option.rb +5 -5
- data/lib/rubygems/source/git.rb +21 -21
- data/lib/rubygems/source/installed.rb +1 -1
- data/lib/rubygems/source/local.rb +2 -2
- data/lib/rubygems/source/specific_file.rb +1 -1
- data/lib/rubygems/source.rb +16 -16
- data/lib/rubygems/spec_fetcher.rb +9 -9
- data/lib/rubygems/specification.rb +63 -62
- data/lib/rubygems/specification_policy.rb +15 -15
- data/lib/rubygems/stub_specification.rb +5 -5
- data/lib/rubygems/tsort.rb +1 -1
- data/lib/rubygems/uninstaller.rb +18 -18
- data/lib/rubygems/uri.rb +4 -4
- data/lib/rubygems/uri_formatter.rb +1 -1
- data/lib/rubygems/user_interaction.rb +33 -19
- data/lib/rubygems/util/licenses.rb +3 -3
- data/lib/rubygems/util.rb +10 -10
- data/lib/rubygems/validator.rb +5 -5
- data/lib/rubygems/version.rb +15 -9
- data/lib/rubygems/version_option.rb +3 -3
- data/lib/rubygems.rb +62 -61
- data/rubygems-update.gemspec +2 -2
- data/setup.rb +9 -9
- data/test/rubygems/helper.rb +132 -134
- data/test/rubygems/installer_test_case.rb +13 -13
- data/test/rubygems/package/tar_test_case.rb +2 -2
- data/test/rubygems/plugin/exception/rubygems_plugin.rb +1 -1
- data/test/rubygems/plugin/standarderror/rubygems_plugin.rb +1 -1
- data/test/rubygems/rubygems_plugin.rb +2 -2
- data/test/rubygems/specifications/rubyforge-0.0.1.gemspec +4 -4
- data/test/rubygems/test_bundled_ca.rb +10 -10
- data/test/rubygems/test_config.rb +3 -3
- data/test/rubygems/test_deprecate.rb +3 -3
- data/test/rubygems/test_exit.rb +2 -2
- data/test/rubygems/test_gem.rb +342 -342
- data/test/rubygems/test_gem_available_set.rb +21 -21
- data/test/rubygems/test_gem_bundler_version_finder.rb +1 -1
- data/test/rubygems/test_gem_command.rb +44 -44
- data/test/rubygems/test_gem_command_manager.rb +29 -29
- data/test/rubygems/test_gem_commands_build_command.rb +63 -63
- data/test/rubygems/test_gem_commands_cert_command.rb +97 -99
- data/test/rubygems/test_gem_commands_check_command.rb +4 -4
- data/test/rubygems/test_gem_commands_cleanup_command.rb +40 -40
- data/test/rubygems/test_gem_commands_contents_command.rb +27 -27
- data/test/rubygems/test_gem_commands_dependency_command.rb +36 -36
- data/test/rubygems/test_gem_commands_environment_command.rb +16 -16
- data/test/rubygems/test_gem_commands_fetch_command.rb +37 -37
- data/test/rubygems/test_gem_commands_generate_index_command.rb +7 -7
- data/test/rubygems/test_gem_commands_help_command.rb +13 -13
- data/test/rubygems/test_gem_commands_info_command.rb +28 -2
- data/test/rubygems/test_gem_commands_install_command.rb +131 -131
- data/test/rubygems/test_gem_commands_list_command.rb +4 -4
- data/test/rubygems/test_gem_commands_lock_command.rb +10 -10
- data/test/rubygems/test_gem_commands_mirror.rb +2 -2
- data/test/rubygems/test_gem_commands_open_command.rb +4 -4
- data/test/rubygems/test_gem_commands_outdated_command.rb +9 -9
- data/test/rubygems/test_gem_commands_owner_command.rb +41 -41
- data/test/rubygems/test_gem_commands_pristine_command.rb +92 -92
- data/test/rubygems/test_gem_commands_push_command.rb +54 -54
- data/test/rubygems/test_gem_commands_query_command.rb +73 -73
- data/test/rubygems/test_gem_commands_search_command.rb +2 -2
- data/test/rubygems/test_gem_commands_server_command.rb +2 -2
- data/test/rubygems/test_gem_commands_setup_command.rb +119 -85
- data/test/rubygems/test_gem_commands_signin_command.rb +45 -31
- data/test/rubygems/test_gem_commands_signout_command.rb +3 -3
- data/test/rubygems/test_gem_commands_sources_command.rb +28 -29
- data/test/rubygems/test_gem_commands_specification_command.rb +32 -32
- data/test/rubygems/test_gem_commands_stale_command.rb +4 -4
- data/test/rubygems/test_gem_commands_uninstall_command.rb +75 -75
- data/test/rubygems/test_gem_commands_unpack_command.rb +31 -31
- data/test/rubygems/test_gem_commands_update_command.rb +89 -89
- data/test/rubygems/test_gem_commands_which_command.rb +6 -6
- data/test/rubygems/test_gem_commands_yank_command.rb +40 -40
- data/test/rubygems/test_gem_config_file.rb +93 -81
- data/test/rubygems/test_gem_dependency.rb +73 -73
- data/test/rubygems/test_gem_dependency_installer.rb +165 -165
- data/test/rubygems/test_gem_dependency_list.rb +47 -47
- data/test/rubygems/test_gem_dependency_resolution_error.rb +4 -4
- data/test/rubygems/test_gem_doctor.rb +26 -26
- data/test/rubygems/test_gem_ext_builder.rb +59 -59
- data/test/rubygems/test_gem_ext_cargo_builder/custom_name/Cargo.lock +6 -6
- data/test/rubygems/test_gem_ext_cargo_builder/custom_name/Cargo.toml +1 -1
- data/test/rubygems/test_gem_ext_cargo_builder/custom_name/build.rb +8 -8
- data/test/rubygems/test_gem_ext_cargo_builder/custom_name/custom_name.gemspec +1 -1
- data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/Cargo.lock +6 -6
- data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/Cargo.toml +1 -1
- data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/build.rb +8 -8
- data/test/rubygems/test_gem_ext_cargo_builder.rb +26 -26
- data/test/rubygems/test_gem_ext_cargo_builder_link_flag_converter.rb +3 -3
- data/test/rubygems/test_gem_ext_cargo_builder_unit.rb +23 -23
- data/test/rubygems/test_gem_ext_cmake_builder.rb +15 -15
- data/test/rubygems/test_gem_ext_configure_builder.rb +13 -13
- data/test/rubygems/test_gem_ext_ext_conf_builder.rb +51 -52
- data/test/rubygems/test_gem_ext_rake_builder.rb +15 -15
- data/test/rubygems/test_gem_gem_runner.rb +7 -7
- data/test/rubygems/test_gem_gemcutter_utilities.rb +66 -66
- data/test/rubygems/test_gem_impossible_dependencies_error.rb +4 -4
- data/test/rubygems/test_gem_indexer.rb +48 -48
- data/test/rubygems/test_gem_install_update_options.rb +16 -16
- data/test/rubygems/test_gem_installer.rb +303 -300
- data/test/rubygems/test_gem_local_remote_options.rb +10 -10
- data/test/rubygems/test_gem_name_tuple.rb +4 -4
- data/test/rubygems/test_gem_package.rb +228 -206
- data/test/rubygems/test_gem_package_old.rb +13 -13
- data/test/rubygems/test_gem_package_tar_header.rb +42 -42
- data/test/rubygems/test_gem_package_tar_reader.rb +8 -8
- data/test/rubygems/test_gem_package_tar_reader_entry.rb +10 -10
- data/test/rubygems/test_gem_package_tar_writer.rb +76 -76
- data/test/rubygems/test_gem_package_task.rb +18 -18
- data/test/rubygems/test_gem_path_support.rb +14 -14
- data/test/rubygems/test_gem_platform.rb +298 -227
- data/test/rubygems/test_gem_rdoc.rb +14 -14
- data/test/rubygems/test_gem_remote_fetcher.rb +149 -149
- data/test/rubygems/test_gem_request.rb +55 -55
- data/test/rubygems/test_gem_request_connection_pools.rb +29 -29
- data/test/rubygems/test_gem_request_set.rb +99 -99
- data/test/rubygems/test_gem_request_set_gem_dependency_api.rb +204 -206
- data/test/rubygems/test_gem_request_set_lockfile.rb +86 -86
- data/test/rubygems/test_gem_request_set_lockfile_parser.rb +56 -56
- data/test/rubygems/test_gem_request_set_lockfile_tokenizer.rb +62 -62
- data/test/rubygems/test_gem_requirement.rb +47 -41
- data/test/rubygems/test_gem_resolver.rb +133 -99
- data/test/rubygems/test_gem_resolver_activation_request.rb +6 -6
- data/test/rubygems/test_gem_resolver_api_set.rb +33 -33
- data/test/rubygems/test_gem_resolver_api_specification.rb +47 -47
- data/test/rubygems/test_gem_resolver_best_set.rb +22 -22
- data/test/rubygems/test_gem_resolver_composed_set.rb +1 -1
- data/test/rubygems/test_gem_resolver_conflict.rb +12 -12
- data/test/rubygems/test_gem_resolver_dependency_request.rb +15 -15
- data/test/rubygems/test_gem_resolver_git_set.rb +21 -21
- data/test/rubygems/test_gem_resolver_git_specification.rb +21 -21
- data/test/rubygems/test_gem_resolver_index_set.rb +12 -12
- data/test/rubygems/test_gem_resolver_index_specification.rb +16 -16
- data/test/rubygems/test_gem_resolver_installed_specification.rb +5 -5
- data/test/rubygems/test_gem_resolver_installer_set.rb +78 -34
- data/test/rubygems/test_gem_resolver_local_specification.rb +7 -7
- data/test/rubygems/test_gem_resolver_lock_set.rb +12 -12
- data/test/rubygems/test_gem_resolver_lock_specification.rb +17 -17
- data/test/rubygems/test_gem_resolver_requirement_list.rb +1 -1
- data/test/rubygems/test_gem_resolver_specification.rb +8 -8
- data/test/rubygems/test_gem_resolver_vendor_set.rb +6 -6
- data/test/rubygems/test_gem_resolver_vendor_specification.rb +10 -10
- data/test/rubygems/test_gem_security.rb +67 -67
- data/test/rubygems/test_gem_security_policy.rb +62 -62
- data/test/rubygems/test_gem_security_signer.rb +28 -28
- data/test/rubygems/test_gem_security_trust_dir.rb +4 -4
- data/test/rubygems/test_gem_silent_ui.rb +38 -32
- data/test/rubygems/test_gem_source.rb +44 -44
- data/test/rubygems/test_gem_source_fetch_problem.rb +9 -9
- data/test/rubygems/test_gem_source_git.rb +59 -59
- data/test/rubygems/test_gem_source_installed.rb +16 -16
- data/test/rubygems/test_gem_source_list.rb +5 -5
- data/test/rubygems/test_gem_source_local.rb +14 -14
- data/test/rubygems/test_gem_source_lock.rb +31 -31
- data/test/rubygems/test_gem_source_specific_file.rb +17 -17
- data/test/rubygems/test_gem_source_subpath_problem.rb +7 -7
- data/test/rubygems/test_gem_source_vendor.rb +13 -13
- data/test/rubygems/test_gem_spec_fetcher.rb +72 -72
- data/test/rubygems/test_gem_specification.rb +444 -436
- data/test/rubygems/test_gem_stream_ui.rb +19 -19
- data/test/rubygems/test_gem_stub_specification.rb +32 -32
- data/test/rubygems/test_gem_text.rb +1 -1
- data/test/rubygems/test_gem_uninstaller.rb +112 -112
- data/test/rubygems/test_gem_unsatisfiable_dependency_error.rb +3 -3
- data/test/rubygems/test_gem_uri.rb +4 -4
- data/test/rubygems/test_gem_uri_formatter.rb +14 -14
- data/test/rubygems/test_gem_util.rb +23 -23
- data/test/rubygems/test_gem_validator.rb +8 -8
- data/test/rubygems/test_gem_version.rb +22 -15
- data/test/rubygems/test_gem_version_option.rb +15 -15
- data/test/rubygems/test_kernel.rb +31 -31
- data/test/rubygems/test_project_sanity.rb +1 -1
- data/test/rubygems/test_remote_fetch_error.rb +6 -6
- data/test/rubygems/test_require.rb +43 -43
- data/test/rubygems/test_rubygems.rb +8 -8
- data/test/rubygems/utilities.rb +19 -19
- metadata +14 -3
data/lib/rubygems/safe_yaml.rb
CHANGED
@@ -26,7 +26,7 @@ module Gem
|
|
26
26
|
|
27
27
|
if ::Psych.respond_to? :safe_load
|
28
28
|
def self.safe_load(input)
|
29
|
-
if Gem::Version.new(Psych::VERSION) >= Gem::Version.new(
|
29
|
+
if Gem::Version.new(Psych::VERSION) >= Gem::Version.new("3.1.0.pre1")
|
30
30
|
::Psych.safe_load(input, permitted_classes: PERMITTED_CLASSES, permitted_symbols: PERMITTED_SYMBOLS, aliases: true)
|
31
31
|
else
|
32
32
|
::Psych.safe_load(input, PERMITTED_CLASSES, PERMITTED_SYMBOLS, true)
|
@@ -34,7 +34,7 @@ module Gem
|
|
34
34
|
end
|
35
35
|
|
36
36
|
def self.load(input)
|
37
|
-
if Gem::Version.new(Psych::VERSION) >= Gem::Version.new(
|
37
|
+
if Gem::Version.new(Psych::VERSION) >= Gem::Version.new("3.1.0.pre1")
|
38
38
|
::Psych.safe_load(input, permitted_classes: [::Symbol])
|
39
39
|
else
|
40
40
|
::Psych.safe_load(input, [::Symbol])
|
@@ -5,7 +5,7 @@ module Gem::Security
|
|
5
5
|
# No security policy: all package signature checks are disabled.
|
6
6
|
|
7
7
|
NoSecurity = Policy.new(
|
8
|
-
|
8
|
+
"No Security",
|
9
9
|
:verify_data => false,
|
10
10
|
:verify_signer => false,
|
11
11
|
:verify_chain => false,
|
@@ -23,7 +23,7 @@ module Gem::Security
|
|
23
23
|
# easily spoofed, and is not recommended.
|
24
24
|
|
25
25
|
AlmostNoSecurity = Policy.new(
|
26
|
-
|
26
|
+
"Almost No Security",
|
27
27
|
:verify_data => true,
|
28
28
|
:verify_signer => false,
|
29
29
|
:verify_chain => false,
|
@@ -40,7 +40,7 @@ module Gem::Security
|
|
40
40
|
# is not recommended.
|
41
41
|
|
42
42
|
LowSecurity = Policy.new(
|
43
|
-
|
43
|
+
"Low Security",
|
44
44
|
:verify_data => true,
|
45
45
|
:verify_signer => true,
|
46
46
|
:verify_chain => false,
|
@@ -59,7 +59,7 @@ module Gem::Security
|
|
59
59
|
# gem off as unsigned.
|
60
60
|
|
61
61
|
MediumSecurity = Policy.new(
|
62
|
-
|
62
|
+
"Medium Security",
|
63
63
|
:verify_data => true,
|
64
64
|
:verify_signer => true,
|
65
65
|
:verify_chain => true,
|
@@ -78,7 +78,7 @@ module Gem::Security
|
|
78
78
|
# a reasonable guarantee that the contents of the gem have not been altered.
|
79
79
|
|
80
80
|
HighSecurity = Policy.new(
|
81
|
-
|
81
|
+
"High Security",
|
82
82
|
:verify_data => true,
|
83
83
|
:verify_signer => true,
|
84
84
|
:verify_chain => true,
|
@@ -91,7 +91,7 @@ module Gem::Security
|
|
91
91
|
# Policy used to verify a certificate and key when signing a gem
|
92
92
|
|
93
93
|
SigningPolicy = Policy.new(
|
94
|
-
|
94
|
+
"Signing Policy",
|
95
95
|
:verify_data => false,
|
96
96
|
:verify_signer => true,
|
97
97
|
:verify_chain => true,
|
@@ -104,11 +104,11 @@ module Gem::Security
|
|
104
104
|
# Hash of configured security policies
|
105
105
|
|
106
106
|
Policies = {
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
107
|
+
"NoSecurity" => NoSecurity,
|
108
|
+
"AlmostNoSecurity" => AlmostNoSecurity,
|
109
|
+
"LowSecurity" => LowSecurity,
|
110
|
+
"MediumSecurity" => MediumSecurity,
|
111
|
+
"HighSecurity" => HighSecurity,
|
112
112
|
# SigningPolicy is not intended for use by `gem -P` so do not list it
|
113
113
|
}.freeze
|
114
114
|
|
@@ -1,5 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
-
require_relative
|
2
|
+
require_relative "../user_interaction"
|
3
3
|
|
4
4
|
##
|
5
5
|
# A Gem::Security::Policy object encapsulates the settings for verifying
|
@@ -53,8 +53,8 @@ class Gem::Security::Policy
|
|
53
53
|
# and is valid for the given +time+.
|
54
54
|
|
55
55
|
def check_chain(chain, time)
|
56
|
-
raise Gem::Security::Exception,
|
57
|
-
raise Gem::Security::Exception,
|
56
|
+
raise Gem::Security::Exception, "missing signing chain" unless chain
|
57
|
+
raise Gem::Security::Exception, "empty signing chain" if chain.empty?
|
58
58
|
|
59
59
|
begin
|
60
60
|
chain.each_cons 2 do |issuer, cert|
|
@@ -83,21 +83,21 @@ class Gem::Security::Policy
|
|
83
83
|
# If the +issuer+ is +nil+ no verification is performed.
|
84
84
|
|
85
85
|
def check_cert(signer, issuer, time)
|
86
|
-
raise Gem::Security::Exception,
|
86
|
+
raise Gem::Security::Exception, "missing signing certificate" unless
|
87
87
|
signer
|
88
88
|
|
89
89
|
message = "certificate #{signer.subject}"
|
90
90
|
|
91
|
-
if not_before = signer.not_before
|
91
|
+
if (not_before = signer.not_before) && not_before > time
|
92
92
|
raise Gem::Security::Exception,
|
93
93
|
"#{message} not valid before #{not_before}"
|
94
94
|
end
|
95
95
|
|
96
|
-
if not_after = signer.not_after
|
96
|
+
if (not_after = signer.not_after) && not_after < time
|
97
97
|
raise Gem::Security::Exception, "#{message} not valid after #{not_after}"
|
98
98
|
end
|
99
99
|
|
100
|
-
if issuer
|
100
|
+
if issuer && !signer.verify(issuer.public_key)
|
101
101
|
raise Gem::Security::Exception,
|
102
102
|
"#{message} was not issued by #{issuer.subject}"
|
103
103
|
end
|
@@ -109,10 +109,10 @@ class Gem::Security::Policy
|
|
109
109
|
# Ensures the public key of +key+ matches the public key in +signer+
|
110
110
|
|
111
111
|
def check_key(signer, key)
|
112
|
-
unless signer
|
112
|
+
unless signer && key
|
113
113
|
return true unless @only_signed
|
114
114
|
|
115
|
-
raise Gem::Security::Exception,
|
115
|
+
raise Gem::Security::Exception, "missing key or signature"
|
116
116
|
end
|
117
117
|
|
118
118
|
raise Gem::Security::Exception,
|
@@ -127,11 +127,11 @@ class Gem::Security::Policy
|
|
127
127
|
# +time+.
|
128
128
|
|
129
129
|
def check_root(chain, time)
|
130
|
-
raise Gem::Security::Exception,
|
130
|
+
raise Gem::Security::Exception, "missing signing chain" unless chain
|
131
131
|
|
132
132
|
root = chain.first
|
133
133
|
|
134
|
-
raise Gem::Security::Exception,
|
134
|
+
raise Gem::Security::Exception, "missing root certificate" unless root
|
135
135
|
|
136
136
|
raise Gem::Security::Exception,
|
137
137
|
"root certificate #{root.subject} is not self-signed " +
|
@@ -146,11 +146,11 @@ class Gem::Security::Policy
|
|
146
146
|
# the digests of the two certificates match according to +digester+
|
147
147
|
|
148
148
|
def check_trust(chain, digester, trust_dir)
|
149
|
-
raise Gem::Security::Exception,
|
149
|
+
raise Gem::Security::Exception, "missing signing chain" unless chain
|
150
150
|
|
151
151
|
root = chain.first
|
152
152
|
|
153
|
-
raise Gem::Security::Exception,
|
153
|
+
raise Gem::Security::Exception, "missing root certificate" unless root
|
154
154
|
|
155
155
|
path = Gem::Security.trust_dir.cert_path root
|
156
156
|
|
@@ -182,7 +182,7 @@ class Gem::Security::Policy
|
|
182
182
|
|
183
183
|
def subject(certificate) # :nodoc:
|
184
184
|
certificate.extensions.each do |extension|
|
185
|
-
next unless extension.oid ==
|
185
|
+
next unless extension.oid == "subjectAltName"
|
186
186
|
|
187
187
|
return extension.value
|
188
188
|
end
|
@@ -206,7 +206,7 @@ class Gem::Security::Policy
|
|
206
206
|
# If +key+ is given it is used to validate the signing certificate.
|
207
207
|
|
208
208
|
def verify(chain, key = nil, digests = {}, signatures = {},
|
209
|
-
full_name =
|
209
|
+
full_name = "(unknown)")
|
210
210
|
if signatures.empty?
|
211
211
|
if @only_signed
|
212
212
|
raise Gem::Security::Exception,
|
@@ -230,8 +230,8 @@ class Gem::Security::Policy
|
|
230
230
|
end
|
231
231
|
|
232
232
|
if @verify_data
|
233
|
-
raise Gem::Security::Exception,
|
234
|
-
signer_digests.nil?
|
233
|
+
raise Gem::Security::Exception, "no digests provided (probable bug)" if
|
234
|
+
signer_digests.nil? || signer_digests.empty?
|
235
235
|
else
|
236
236
|
signer_digests = {}
|
237
237
|
end
|
@@ -248,7 +248,7 @@ class Gem::Security::Policy
|
|
248
248
|
|
249
249
|
if @only_trusted
|
250
250
|
check_trust chain, digester, trust_dir
|
251
|
-
elsif signatures.empty?
|
251
|
+
elsif signatures.empty? && digests.empty?
|
252
252
|
# trust is irrelevant if there's no signatures to verify
|
253
253
|
else
|
254
254
|
alert_warning "#{subject signer} is not trusted for #{full_name}"
|
@@ -42,7 +42,7 @@ class Gem::Security::Signer
|
|
42
42
|
def self.re_sign_cert(expired_cert, expired_cert_path, private_key)
|
43
43
|
return unless expired_cert.not_after < Time.now
|
44
44
|
|
45
|
-
expiry = expired_cert.not_after.strftime(
|
45
|
+
expiry = expired_cert.not_after.strftime("%Y%m%d%H%M%S")
|
46
46
|
expired_cert_file = "#{File.basename(expired_cert_path)}.expired.#{expiry}"
|
47
47
|
new_expired_cert_path = File.join(Gem.user_home, ".gem", expired_cert_file)
|
48
48
|
|
@@ -105,7 +105,7 @@ class Gem::Security::Signer
|
|
105
105
|
# this value is preferred, otherwise the subject is used.
|
106
106
|
|
107
107
|
def extract_name(cert) # :nodoc:
|
108
|
-
subject_alt_name = cert.extensions.find {|e|
|
108
|
+
subject_alt_name = cert.extensions.find {|e| "subjectAltName" == e.oid }
|
109
109
|
|
110
110
|
if subject_alt_name
|
111
111
|
/\Aemail:/ =~ subject_alt_name.value # rubocop:disable Performance/StartWith
|
@@ -139,9 +139,9 @@ class Gem::Security::Signer
|
|
139
139
|
def sign(data)
|
140
140
|
return unless @key
|
141
141
|
|
142
|
-
raise Gem::Security::Exception,
|
142
|
+
raise Gem::Security::Exception, "no certs provided" if @cert_chain.empty?
|
143
143
|
|
144
|
-
if @cert_chain.length == 1
|
144
|
+
if @cert_chain.length == 1 && @cert_chain.last.not_after < Time.now
|
145
145
|
alert("Your certificate has expired, trying to re-sign it...")
|
146
146
|
|
147
147
|
re_sign_key(
|
@@ -182,7 +182,7 @@ class Gem::Security::Signer
|
|
182
182
|
return unless disk_key
|
183
183
|
|
184
184
|
if disk_key.to_pem == @key.to_pem && disk_cert == old_cert.to_pem
|
185
|
-
expiry = old_cert.not_after.strftime(
|
185
|
+
expiry = old_cert.not_after.strftime("%Y%m%d%H%M%S")
|
186
186
|
old_cert_file = "gem-public_cert.pem.expired.#{expiry}"
|
187
187
|
old_cert_path = File.join(Gem.user_home, ".gem", old_cert_file)
|
188
188
|
|
@@ -41,7 +41,7 @@ class Gem::Security::TrustDir
|
|
41
41
|
def each_certificate
|
42
42
|
return enum_for __method__ unless block_given?
|
43
43
|
|
44
|
-
glob = File.join @dir,
|
44
|
+
glob = File.join @dir, "*.pem"
|
45
45
|
|
46
46
|
Dir[glob].each do |certificate_file|
|
47
47
|
begin
|
@@ -92,7 +92,7 @@ class Gem::Security::TrustDir
|
|
92
92
|
|
93
93
|
destination = cert_path certificate
|
94
94
|
|
95
|
-
File.open destination,
|
95
|
+
File.open destination, "wb", 0600 do |io|
|
96
96
|
io.write certificate.to_pem
|
97
97
|
io.chmod(@permissions[:trusted_cert])
|
98
98
|
end
|
@@ -104,7 +104,7 @@ class Gem::Security::TrustDir
|
|
104
104
|
# permissions.
|
105
105
|
|
106
106
|
def verify
|
107
|
-
require
|
107
|
+
require "fileutils"
|
108
108
|
if File.exist? @dir
|
109
109
|
raise Gem::Security::Exception,
|
110
110
|
"trust directory #{@dir} is not a directory" unless
|
data/lib/rubygems/security.rb
CHANGED
@@ -5,8 +5,8 @@
|
|
5
5
|
# See LICENSE.txt for permissions.
|
6
6
|
#++
|
7
7
|
|
8
|
-
require_relative
|
9
|
-
require_relative
|
8
|
+
require_relative "exceptions"
|
9
|
+
require_relative "openssl"
|
10
10
|
|
11
11
|
##
|
12
12
|
# = Signing gems
|
@@ -334,7 +334,7 @@ module Gem::Security
|
|
334
334
|
##
|
335
335
|
# Used internally to select the signing digest from all computed digests
|
336
336
|
|
337
|
-
DIGEST_NAME =
|
337
|
+
DIGEST_NAME = "SHA256" # :nodoc:
|
338
338
|
|
339
339
|
##
|
340
340
|
# Length of keys created by RSA and DSA keys
|
@@ -344,18 +344,18 @@ module Gem::Security
|
|
344
344
|
##
|
345
345
|
# Default algorithm to use when building a key pair
|
346
346
|
|
347
|
-
DEFAULT_KEY_ALGORITHM =
|
347
|
+
DEFAULT_KEY_ALGORITHM = "RSA"
|
348
348
|
|
349
349
|
##
|
350
350
|
# Named curve used for Elliptic Curve
|
351
351
|
|
352
|
-
EC_NAME =
|
352
|
+
EC_NAME = "secp384r1"
|
353
353
|
|
354
354
|
##
|
355
355
|
# Cipher used to encrypt the key pair used to sign gems.
|
356
356
|
# Must be in the list returned by OpenSSL::Cipher.ciphers
|
357
357
|
|
358
|
-
KEY_CIPHER = OpenSSL::Cipher.new(
|
358
|
+
KEY_CIPHER = OpenSSL::Cipher.new("AES-256-CBC") if defined?(OpenSSL::Cipher)
|
359
359
|
|
360
360
|
##
|
361
361
|
# One day in seconds
|
@@ -376,10 +376,10 @@ module Gem::Security
|
|
376
376
|
# * The certificate contains a subject key identifier
|
377
377
|
|
378
378
|
EXTENSIONS = {
|
379
|
-
|
380
|
-
|
381
|
-
|
382
|
-
|
379
|
+
"basicConstraints" => "CA:FALSE",
|
380
|
+
"keyUsage" =>
|
381
|
+
"keyEncipherment,dataEncipherment,digitalSignature",
|
382
|
+
"subjectKeyIdentifier" => "hash",
|
383
383
|
}.freeze
|
384
384
|
|
385
385
|
def self.alt_name_or_x509_entry(certificate, x509_entry)
|
@@ -473,7 +473,7 @@ module Gem::Security
|
|
473
473
|
OpenSSL::Digest.new(algorithm)
|
474
474
|
end
|
475
475
|
else
|
476
|
-
require
|
476
|
+
require "digest"
|
477
477
|
|
478
478
|
def self.create_digest(algorithm = DIGEST_NAME)
|
479
479
|
Digest.const_get(algorithm).new
|
@@ -487,11 +487,11 @@ module Gem::Security
|
|
487
487
|
def self.create_key(algorithm)
|
488
488
|
if defined?(OpenSSL::PKey)
|
489
489
|
case algorithm.downcase
|
490
|
-
when
|
490
|
+
when "dsa"
|
491
491
|
OpenSSL::PKey::DSA.new(RSA_DSA_KEY_LENGTH)
|
492
|
-
when
|
492
|
+
when "rsa"
|
493
493
|
OpenSSL::PKey::RSA.new(RSA_DSA_KEY_LENGTH)
|
494
|
-
when
|
494
|
+
when "ec"
|
495
495
|
if RUBY_VERSION >= "2.4.0"
|
496
496
|
OpenSSL::PKey::EC.generate(EC_NAME)
|
497
497
|
else
|
@@ -510,11 +510,11 @@ module Gem::Security
|
|
510
510
|
# Turns +email_address+ into an OpenSSL::X509::Name
|
511
511
|
|
512
512
|
def self.email_to_name(email_address)
|
513
|
-
email_address = email_address.gsub(/[^\w@.-]+/i,
|
513
|
+
email_address = email_address.gsub(/[^\w@.-]+/i, "_")
|
514
514
|
|
515
|
-
cn, dcs = email_address.split
|
515
|
+
cn, dcs = email_address.split "@"
|
516
516
|
|
517
|
-
dcs = dcs.split
|
517
|
+
dcs = dcs.split "."
|
518
518
|
|
519
519
|
OpenSSL::X509::Name.new([
|
520
520
|
["CN", cn],
|
@@ -571,17 +571,17 @@ module Gem::Security
|
|
571
571
|
signee_key = certificate.public_key
|
572
572
|
|
573
573
|
alt_name = certificate.extensions.find do |extension|
|
574
|
-
extension.oid ==
|
574
|
+
extension.oid == "subjectAltName"
|
575
575
|
end
|
576
576
|
|
577
|
-
extensions = extensions.merge
|
577
|
+
extensions = extensions.merge "subjectAltName" => alt_name.value if
|
578
578
|
alt_name
|
579
579
|
|
580
580
|
issuer_alt_name = signing_cert.extensions.find do |extension|
|
581
|
-
extension.oid ==
|
581
|
+
extension.oid == "subjectAltName"
|
582
582
|
end
|
583
583
|
|
584
|
-
extensions = extensions.merge
|
584
|
+
extensions = extensions.merge "issuerAltName" => issuer_alt_name.value if
|
585
585
|
issuer_alt_name
|
586
586
|
|
587
587
|
signed = create_cert signee_subject, signee_key, age, extensions, serial
|
@@ -597,7 +597,7 @@ module Gem::Security
|
|
597
597
|
def self.trust_dir
|
598
598
|
return @trust_dir if @trust_dir
|
599
599
|
|
600
|
-
dir = File.join Gem.user_home,
|
600
|
+
dir = File.join Gem.user_home, ".gem", "trust"
|
601
601
|
|
602
602
|
@trust_dir ||= Gem::Security::TrustDir.new dir
|
603
603
|
end
|
@@ -617,8 +617,8 @@ module Gem::Security
|
|
617
617
|
def self.write(pemmable, path, permissions = 0600, passphrase = nil, cipher = KEY_CIPHER)
|
618
618
|
path = File.expand_path path
|
619
619
|
|
620
|
-
File.open path,
|
621
|
-
if passphrase
|
620
|
+
File.open path, "wb", permissions do |io|
|
621
|
+
if passphrase && cipher
|
622
622
|
io.write pemmable.to_pem cipher, passphrase
|
623
623
|
else
|
624
624
|
io.write pemmable.to_pem
|
@@ -633,9 +633,9 @@ module Gem::Security
|
|
633
633
|
end
|
634
634
|
|
635
635
|
if Gem::HAVE_OPENSSL
|
636
|
-
require_relative
|
637
|
-
require_relative
|
638
|
-
require_relative
|
636
|
+
require_relative "security/policy"
|
637
|
+
require_relative "security/policies"
|
638
|
+
require_relative "security/trust_dir"
|
639
639
|
end
|
640
640
|
|
641
|
-
require_relative
|
641
|
+
require_relative "security/signer"
|
@@ -5,7 +5,7 @@
|
|
5
5
|
# See LICENSE.txt for permissions.
|
6
6
|
#++
|
7
7
|
|
8
|
-
require_relative
|
8
|
+
require_relative "../rubygems"
|
9
9
|
|
10
10
|
# forward-declare
|
11
11
|
|
@@ -20,9 +20,9 @@ end
|
|
20
20
|
module Gem::SecurityOption
|
21
21
|
def add_security_option
|
22
22
|
Gem::OptionParser.accept Gem::Security::Policy do |value|
|
23
|
-
require_relative
|
23
|
+
require_relative "security"
|
24
24
|
|
25
|
-
raise Gem::OptionParser::InvalidArgument,
|
25
|
+
raise Gem::OptionParser::InvalidArgument, "OpenSSL not installed" unless
|
26
26
|
defined?(Gem::Security::HighSecurity)
|
27
27
|
|
28
28
|
policy = Gem::Security::Policies[value]
|
@@ -33,9 +33,9 @@ module Gem::SecurityOption
|
|
33
33
|
policy
|
34
34
|
end
|
35
35
|
|
36
|
-
add_option(:"Install/Update",
|
36
|
+
add_option(:"Install/Update", "-P", "--trust-policy POLICY",
|
37
37
|
Gem::Security::Policy,
|
38
|
-
|
38
|
+
"Specify gem trust policy") do |value, options|
|
39
39
|
options[:security_policy] = value
|
40
40
|
end
|
41
41
|
end
|
data/lib/rubygems/source/git.rb
CHANGED
@@ -58,7 +58,7 @@ class Gem::Source::Git < Gem::Source
|
|
58
58
|
|
59
59
|
@remote = true
|
60
60
|
@root_dir = Gem.dir
|
61
|
-
@git = ENV[
|
61
|
+
@git = ENV["git"] || "git"
|
62
62
|
end
|
63
63
|
|
64
64
|
def <=>(other)
|
@@ -76,10 +76,10 @@ class Gem::Source::Git < Gem::Source
|
|
76
76
|
end
|
77
77
|
|
78
78
|
def ==(other) # :nodoc:
|
79
|
-
super
|
80
|
-
@name == other.name
|
81
|
-
@repository == other.repository
|
82
|
-
@reference == other.reference
|
79
|
+
super &&
|
80
|
+
@name == other.name &&
|
81
|
+
@repository == other.repository &&
|
82
|
+
@reference == other.reference &&
|
83
83
|
@need_submodules == other.need_submodules
|
84
84
|
end
|
85
85
|
|
@@ -92,18 +92,18 @@ class Gem::Source::Git < Gem::Source
|
|
92
92
|
return false unless File.exist? repo_cache_dir
|
93
93
|
|
94
94
|
unless File.exist? install_dir
|
95
|
-
system @git,
|
95
|
+
system @git, "clone", "--quiet", "--no-checkout",
|
96
96
|
repo_cache_dir, install_dir
|
97
97
|
end
|
98
98
|
|
99
99
|
Dir.chdir install_dir do
|
100
|
-
system @git,
|
100
|
+
system @git, "fetch", "--quiet", "--force", "--tags", install_dir
|
101
101
|
|
102
|
-
success = system @git,
|
102
|
+
success = system @git, "reset", "--quiet", "--hard", rev_parse
|
103
103
|
|
104
104
|
if @need_submodules
|
105
105
|
require "open3"
|
106
|
-
_, status = Open3.capture2e(@git,
|
106
|
+
_, status = Open3.capture2e(@git, "submodule", "update", "--quiet", "--init", "--recursive")
|
107
107
|
|
108
108
|
success &&= status.success?
|
109
109
|
end
|
@@ -120,11 +120,11 @@ class Gem::Source::Git < Gem::Source
|
|
120
120
|
|
121
121
|
if File.exist? repo_cache_dir
|
122
122
|
Dir.chdir repo_cache_dir do
|
123
|
-
system @git,
|
124
|
-
@repository,
|
123
|
+
system @git, "fetch", "--quiet", "--force", "--tags",
|
124
|
+
@repository, "refs/heads/*:refs/heads/*"
|
125
125
|
end
|
126
126
|
else
|
127
|
-
system @git,
|
127
|
+
system @git, "clone", "--quiet", "--bare", "--no-hardlinks",
|
128
128
|
@repository, repo_cache_dir
|
129
129
|
end
|
130
130
|
end
|
@@ -133,7 +133,7 @@ class Gem::Source::Git < Gem::Source
|
|
133
133
|
# Directory where git gems get unpacked and so-forth.
|
134
134
|
|
135
135
|
def base_dir # :nodoc:
|
136
|
-
File.join @root_dir,
|
136
|
+
File.join @root_dir, "bundler"
|
137
137
|
end
|
138
138
|
|
139
139
|
##
|
@@ -155,11 +155,11 @@ class Gem::Source::Git < Gem::Source
|
|
155
155
|
def install_dir # :nodoc:
|
156
156
|
return unless File.exist? repo_cache_dir
|
157
157
|
|
158
|
-
File.join base_dir,
|
158
|
+
File.join base_dir, "gems", "#{@name}-#{dir_shortref}"
|
159
159
|
end
|
160
160
|
|
161
161
|
def pretty_print(q) # :nodoc:
|
162
|
-
q.group 2,
|
162
|
+
q.group 2, "[Git: ", "]" do
|
163
163
|
q.breakable
|
164
164
|
q.text @repository
|
165
165
|
|
@@ -172,7 +172,7 @@ class Gem::Source::Git < Gem::Source
|
|
172
172
|
# The directory where the git gem's repository will be cached.
|
173
173
|
|
174
174
|
def repo_cache_dir # :nodoc:
|
175
|
-
File.join @root_dir,
|
175
|
+
File.join @root_dir, "cache", "bundler", "git", "#{@name}-#{uri_hash}"
|
176
176
|
end
|
177
177
|
|
178
178
|
##
|
@@ -182,7 +182,7 @@ class Gem::Source::Git < Gem::Source
|
|
182
182
|
hash = nil
|
183
183
|
|
184
184
|
Dir.chdir repo_cache_dir do
|
185
|
-
hash = Gem::Util.popen(@git,
|
185
|
+
hash = Gem::Util.popen(@git, "rev-parse", @reference).strip
|
186
186
|
end
|
187
187
|
|
188
188
|
raise Gem::Exception,
|
@@ -201,7 +201,7 @@ class Gem::Source::Git < Gem::Source
|
|
201
201
|
return [] unless install_dir
|
202
202
|
|
203
203
|
Dir.chdir install_dir do
|
204
|
-
Dir[
|
204
|
+
Dir["{,*,*/*}.gemspec"].map do |spec_file|
|
205
205
|
directory = File.dirname spec_file
|
206
206
|
file = File.basename spec_file
|
207
207
|
|
@@ -211,7 +211,7 @@ class Gem::Source::Git < Gem::Source
|
|
211
211
|
spec.base_dir = base_dir
|
212
212
|
|
213
213
|
spec.extension_dir =
|
214
|
-
File.join base_dir,
|
214
|
+
File.join base_dir, "extensions", Gem::Platform.local.to_s,
|
215
215
|
Gem.extension_api_version, "#{name}-#{dir_shortref}"
|
216
216
|
|
217
217
|
spec.full_gem_path = File.dirname spec.loaded_from if spec
|
@@ -226,11 +226,11 @@ class Gem::Source::Git < Gem::Source
|
|
226
226
|
# A hash for the git gem based on the git repository URI.
|
227
227
|
|
228
228
|
def uri_hash # :nodoc:
|
229
|
-
require_relative
|
229
|
+
require_relative "../openssl"
|
230
230
|
|
231
231
|
normalized =
|
232
232
|
if @repository =~ %r{^\w+://(\w+@)?}
|
233
|
-
uri = URI(@repository).normalize.to_s.sub %r{/$},
|
233
|
+
uri = URI(@repository).normalize.to_s.sub %r{/$},""
|
234
234
|
uri.sub(/\A(\w+)/) { $1.downcase }
|
235
235
|
else
|
236
236
|
@repository
|
@@ -29,7 +29,7 @@ class Gem::Source::Local < Gem::Source
|
|
29
29
|
end
|
30
30
|
|
31
31
|
def inspect # :nodoc:
|
32
|
-
keys = @specs ? @specs.keys.sort :
|
32
|
+
keys = @specs ? @specs.keys.sort : "NOT LOADED"
|
33
33
|
"#<%s specs: %p>" % [self.class, keys]
|
34
34
|
end
|
35
35
|
|
@@ -121,7 +121,7 @@ class Gem::Source::Local < Gem::Source
|
|
121
121
|
end
|
122
122
|
|
123
123
|
def pretty_print(q) # :nodoc:
|
124
|
-
q.group 2,
|
124
|
+
q.group 2, "[Local gems:", "]" do
|
125
125
|
q.breakable
|
126
126
|
q.seplist @specs.keys do |v|
|
127
127
|
q.text v.full_name
|