rubygems-update 2.7.11 → 3.0.9
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/.rubocop.yml +67 -0
- data/.travis.yml +24 -18
- data/CODE_OF_CONDUCT.md +10 -8
- data/CONTRIBUTING.md +148 -0
- data/History.txt +458 -8
- data/MAINTAINERS.txt +1 -0
- data/Manifest.txt +16 -9
- data/POLICIES.md +92 -0
- data/README.md +53 -26
- data/Rakefile +77 -211
- data/{UPGRADING.rdoc → UPGRADING.md} +31 -32
- data/appveyor.yml +20 -45
- data/bin/gem +1 -2
- data/bin/update_rubygems +2 -3
- data/bundler/CHANGELOG.md +65 -0
- data/bundler/bundler.gemspec +7 -1
- data/bundler/lib/bundler/build_metadata.rb +1 -1
- data/bundler/lib/bundler/cli/add.rb +15 -5
- data/bundler/lib/bundler/cli/binstubs.rb +8 -2
- data/bundler/lib/bundler/cli/doctor.rb +47 -1
- data/bundler/lib/bundler/cli/install.rb +8 -5
- data/bundler/lib/bundler/cli/list.rb +41 -5
- data/bundler/lib/bundler/cli/outdated.rb +7 -1
- data/bundler/lib/bundler/cli/pristine.rb +4 -0
- data/bundler/lib/bundler/cli/remove.rb +18 -0
- data/bundler/lib/bundler/cli.rb +63 -21
- data/bundler/lib/bundler/definition.rb +15 -16
- data/bundler/lib/bundler/dependency.rb +2 -2
- data/bundler/lib/bundler/dsl.rb +19 -3
- data/bundler/lib/bundler/feature_flag.rb +7 -0
- data/bundler/lib/bundler/gem_version_promoter.rb +4 -2
- data/bundler/lib/bundler/injector.rb +168 -9
- data/bundler/lib/bundler/installer/parallel_installer.rb +5 -0
- data/bundler/lib/bundler/installer.rb +29 -6
- data/bundler/lib/bundler/plugin/events.rb +61 -0
- data/bundler/lib/bundler/plugin.rb +10 -3
- data/bundler/lib/bundler/resolver.rb +2 -2
- data/bundler/lib/bundler/rubygems_gem_installer.rb +7 -0
- data/bundler/lib/bundler/runtime.rb +8 -2
- data/bundler/lib/bundler/settings/validator.rb +23 -0
- data/bundler/lib/bundler/settings.rb +24 -3
- data/bundler/lib/bundler/shared_helpers.rb +19 -3
- data/bundler/lib/bundler/source/metadata.rb +2 -3
- data/bundler/lib/bundler/source.rb +9 -9
- data/bundler/lib/bundler/templates/newgem/lib/newgem.rb.tt +1 -0
- data/bundler/lib/bundler/version.rb +1 -1
- data/bundler/lib/bundler.rb +26 -8
- data/bundler/man/bundle-add.ronn +13 -2
- data/bundler/man/bundle-config.ronn +21 -0
- data/bundler/man/bundle-install.ronn +1 -1
- data/bundler/man/bundle-list.ronn +19 -1
- data/bundler/man/bundle-outdated.ronn +4 -0
- data/bundler/man/bundle-remove.ronn +23 -0
- data/bundler/man/bundle-update.ronn +1 -1
- data/bundler/man/bundle.ronn +3 -0
- data/lib/rubygems/available_set.rb +1 -1
- data/lib/rubygems/basic_specification.rb +12 -12
- data/lib/rubygems/bundler_version_finder.rb +3 -3
- data/lib/rubygems/command.rb +22 -15
- data/lib/rubygems/command_manager.rb +22 -5
- data/lib/rubygems/commands/build_command.rb +41 -7
- data/lib/rubygems/commands/cert_command.rb +45 -24
- data/lib/rubygems/commands/check_command.rb +1 -1
- data/lib/rubygems/commands/cleanup_command.rb +14 -7
- data/lib/rubygems/commands/contents_command.rb +14 -15
- data/lib/rubygems/commands/dependency_command.rb +17 -17
- data/lib/rubygems/commands/environment_command.rb +20 -1
- data/lib/rubygems/commands/fetch_command.rb +2 -3
- data/lib/rubygems/commands/generate_index_command.rb +2 -3
- data/lib/rubygems/commands/help_command.rb +12 -13
- data/lib/rubygems/commands/info_command.rb +33 -0
- data/lib/rubygems/commands/install_command.rb +21 -17
- data/lib/rubygems/commands/list_command.rb +0 -1
- data/lib/rubygems/commands/lock_command.rb +3 -4
- data/lib/rubygems/commands/open_command.rb +16 -10
- data/lib/rubygems/commands/owner_command.rb +21 -7
- data/lib/rubygems/commands/pristine_command.rb +23 -16
- data/lib/rubygems/commands/push_command.rb +19 -8
- data/lib/rubygems/commands/query_command.rb +24 -24
- data/lib/rubygems/commands/rdoc_command.rb +3 -4
- data/lib/rubygems/commands/search_command.rb +0 -1
- data/lib/rubygems/commands/server_command.rb +1 -2
- data/lib/rubygems/commands/setup_command.rb +86 -48
- data/lib/rubygems/commands/signin_command.rb +2 -1
- data/lib/rubygems/commands/signout_command.rb +2 -2
- data/lib/rubygems/commands/sources_command.rb +11 -12
- data/lib/rubygems/commands/specification_command.rb +7 -7
- data/lib/rubygems/commands/uninstall_command.rb +50 -18
- data/lib/rubygems/commands/unpack_command.rb +16 -7
- data/lib/rubygems/commands/update_command.rb +28 -23
- data/lib/rubygems/commands/which_command.rb +5 -8
- data/lib/rubygems/commands/yank_command.rb +1 -2
- data/lib/rubygems/compatibility.rb +1 -21
- data/lib/rubygems/config_file.rb +36 -36
- data/lib/rubygems/core_ext/kernel_require.rb +6 -6
- data/lib/rubygems/core_ext/kernel_warn.rb +45 -0
- data/lib/rubygems/defaults.rb +31 -19
- data/lib/rubygems/dependency.rb +15 -15
- data/lib/rubygems/dependency_installer.rb +30 -33
- data/lib/rubygems/dependency_list.rb +9 -10
- data/lib/rubygems/deprecate.rb +2 -3
- data/lib/rubygems/doctor.rb +5 -6
- data/lib/rubygems/errors.rb +3 -3
- data/lib/rubygems/exceptions.rb +11 -8
- data/lib/rubygems/ext/build_error.rb +0 -1
- data/lib/rubygems/ext/builder.rb +50 -23
- data/lib/rubygems/ext/cmake_builder.rb +2 -2
- data/lib/rubygems/ext/configure_builder.rb +2 -3
- data/lib/rubygems/ext/ext_conf_builder.rb +8 -7
- data/lib/rubygems/ext/rake_builder.rb +16 -18
- data/lib/rubygems/ext.rb +0 -1
- data/lib/rubygems/gem_runner.rb +2 -2
- data/lib/rubygems/gemcutter_utilities.rb +46 -12
- data/lib/rubygems/indexer.rb +19 -12
- data/lib/rubygems/install_default_message.rb +0 -1
- data/lib/rubygems/install_message.rb +0 -1
- data/lib/rubygems/install_update_options.rb +3 -29
- data/lib/rubygems/installer.rb +97 -55
- data/lib/rubygems/installer_test_case.rb +2 -16
- data/lib/rubygems/local_remote_options.rb +5 -4
- data/lib/rubygems/mock_gem_ui.rb +3 -4
- data/lib/rubygems/name_tuple.rb +4 -4
- data/lib/rubygems/package/digest_io.rb +3 -4
- data/lib/rubygems/package/file_source.rb +3 -4
- data/lib/rubygems/package/io_source.rb +1 -2
- data/lib/rubygems/package/old.rb +8 -16
- data/lib/rubygems/package/source.rb +0 -1
- data/lib/rubygems/package/tar_header.rb +13 -4
- data/lib/rubygems/package/tar_reader/entry.rb +20 -4
- data/lib/rubygems/package/tar_reader.rb +2 -4
- data/lib/rubygems/package/tar_test_case.rb +2 -8
- data/lib/rubygems/package/tar_writer.rb +13 -15
- data/lib/rubygems/package.rb +90 -63
- data/lib/rubygems/package_task.rb +0 -1
- data/lib/rubygems/path_support.rb +16 -6
- data/lib/rubygems/platform.rb +4 -5
- data/lib/rubygems/psych_tree.rb +1 -1
- data/lib/rubygems/rdoc.rb +2 -313
- data/lib/rubygems/remote_fetcher.rb +29 -82
- data/lib/rubygems/request/connection_pools.rb +24 -13
- data/lib/rubygems/request/http_pool.rb +3 -4
- data/lib/rubygems/request/https_pool.rb +1 -3
- data/lib/rubygems/request.rb +17 -16
- data/lib/rubygems/request_set/gem_dependency_api.rb +46 -49
- data/lib/rubygems/request_set/lockfile/parser.rb +18 -29
- data/lib/rubygems/request_set/lockfile/tokenizer.rb +9 -9
- data/lib/rubygems/request_set/lockfile.rb +12 -12
- data/lib/rubygems/request_set.rb +52 -25
- data/lib/rubygems/requirement.rb +32 -21
- data/lib/rubygems/resolver/activation_request.rb +6 -6
- data/lib/rubygems/resolver/api_set.rb +5 -6
- data/lib/rubygems/resolver/api_specification.rb +2 -3
- data/lib/rubygems/resolver/best_set.rb +5 -6
- data/lib/rubygems/resolver/composed_set.rb +5 -6
- data/lib/rubygems/resolver/conflict.rb +5 -5
- data/lib/rubygems/resolver/current_set.rb +1 -2
- data/lib/rubygems/resolver/dependency_request.rb +4 -4
- data/lib/rubygems/resolver/git_set.rb +5 -6
- data/lib/rubygems/resolver/git_specification.rb +4 -5
- data/lib/rubygems/resolver/index_set.rb +5 -6
- data/lib/rubygems/resolver/index_specification.rb +3 -4
- data/lib/rubygems/resolver/installed_specification.rb +3 -4
- data/lib/rubygems/resolver/installer_set.rb +12 -12
- data/lib/rubygems/resolver/local_specification.rb +1 -2
- data/lib/rubygems/resolver/lock_set.rb +5 -6
- data/lib/rubygems/resolver/lock_specification.rb +7 -8
- data/lib/rubygems/resolver/requirement_list.rb +1 -1
- data/lib/rubygems/resolver/set.rb +2 -2
- data/lib/rubygems/resolver/source_set.rb +4 -5
- data/lib/rubygems/resolver/spec_specification.rb +1 -2
- data/lib/rubygems/resolver/specification.rb +10 -7
- data/lib/rubygems/resolver/stats.rb +1 -1
- data/lib/rubygems/resolver/vendor_set.rb +4 -5
- data/lib/rubygems/resolver/vendor_specification.rb +2 -3
- data/lib/rubygems/resolver.rb +14 -16
- data/lib/rubygems/s3_uri_signer.rb +183 -0
- data/lib/rubygems/safe_yaml.rb +18 -10
- data/lib/rubygems/security/policies.rb +1 -2
- data/lib/rubygems/security/policy.rb +25 -25
- data/lib/rubygems/security/signer.rb +72 -24
- data/lib/rubygems/security/trust_dir.rb +10 -10
- data/lib/rubygems/security.rb +21 -22
- data/lib/rubygems/security_option.rb +0 -1
- data/lib/rubygems/server.rb +21 -21
- data/lib/rubygems/source/git.rb +9 -10
- data/lib/rubygems/source/installed.rb +3 -4
- data/lib/rubygems/source/local.rb +7 -7
- data/lib/rubygems/source/lock.rb +4 -4
- data/lib/rubygems/source/specific_file.rb +5 -5
- data/lib/rubygems/source/vendor.rb +2 -3
- data/lib/rubygems/source.rb +16 -25
- data/lib/rubygems/source_list.rb +2 -2
- data/lib/rubygems/source_local.rb +0 -1
- data/lib/rubygems/spec_fetcher.rb +5 -6
- data/lib/rubygems/specification.rb +219 -558
- data/lib/rubygems/specification_policy.rb +407 -0
- data/lib/rubygems/stub_specification.rb +12 -17
- data/lib/rubygems/test_case.rb +161 -75
- data/lib/rubygems/test_utilities.rb +20 -35
- data/lib/rubygems/text.rb +6 -6
- data/lib/rubygems/uninstaller.rb +38 -27
- data/lib/rubygems/uri_formatter.rb +1 -2
- data/lib/rubygems/user_interaction.rb +37 -89
- data/lib/rubygems/util/licenses.rb +27 -1
- data/lib/rubygems/util/list.rb +1 -1
- data/lib/rubygems/util.rb +32 -14
- data/lib/rubygems/validator.rb +4 -5
- data/lib/rubygems/version.rb +15 -15
- data/lib/rubygems/version_option.rb +2 -3
- data/lib/rubygems.rb +71 -102
- data/rubygems-update.gemspec +43 -0
- data/setup.rb +2 -8
- data/test/rubygems/ca_cert.pem +74 -65
- data/test/rubygems/client.pem +103 -45
- data/test/rubygems/rubygems_plugin.rb +0 -1
- data/test/rubygems/simple_gem.rb +1 -1
- data/test/rubygems/ssl_cert.pem +78 -17
- data/test/rubygems/ssl_key.pem +25 -13
- data/test/rubygems/test_bundled_ca.rb +1 -1
- data/test/rubygems/test_config.rb +7 -2
- data/test/rubygems/test_gem.rb +205 -132
- data/test/rubygems/test_gem_bundler_version_finder.rb +4 -0
- data/test/rubygems/test_gem_command.rb +0 -1
- data/test/rubygems/test_gem_command_manager.rb +18 -3
- data/test/rubygems/test_gem_commands_build_command.rb +220 -15
- data/test/rubygems/test_gem_commands_cert_command.rb +69 -8
- data/test/rubygems/test_gem_commands_check_command.rb +1 -1
- data/test/rubygems/test_gem_commands_cleanup_command.rb +27 -1
- data/test/rubygems/test_gem_commands_contents_command.rb +1 -2
- data/test/rubygems/test_gem_commands_dependency_command.rb +33 -34
- data/test/rubygems/test_gem_commands_environment_command.rb +1 -0
- data/test/rubygems/test_gem_commands_fetch_command.rb +0 -1
- data/test/rubygems/test_gem_commands_generate_index_command.rb +0 -1
- data/test/rubygems/test_gem_commands_help_command.rb +7 -4
- data/test/rubygems/test_gem_commands_info_command.rb +44 -0
- data/test/rubygems/test_gem_commands_install_command.rb +79 -12
- data/test/rubygems/test_gem_commands_lock_command.rb +0 -1
- data/test/rubygems/test_gem_commands_open_command.rb +29 -0
- data/test/rubygems/test_gem_commands_outdated_command.rb +0 -1
- data/test/rubygems/test_gem_commands_owner_command.rb +93 -57
- data/test/rubygems/test_gem_commands_pristine_command.rb +65 -30
- data/test/rubygems/test_gem_commands_push_command.rb +54 -0
- data/test/rubygems/test_gem_commands_query_command.rb +102 -100
- data/test/rubygems/test_gem_commands_search_command.rb +0 -1
- data/test/rubygems/test_gem_commands_server_command.rb +0 -1
- data/test/rubygems/test_gem_commands_setup_command.rb +50 -15
- data/test/rubygems/test_gem_commands_signin_command.rb +1 -1
- data/test/rubygems/test_gem_commands_sources_command.rb +0 -1
- data/test/rubygems/test_gem_commands_specification_command.rb +2 -3
- data/test/rubygems/test_gem_commands_stale_command.rb +3 -2
- data/test/rubygems/test_gem_commands_uninstall_command.rb +161 -8
- data/test/rubygems/test_gem_commands_unpack_command.rb +17 -1
- data/test/rubygems/test_gem_commands_update_command.rb +19 -2
- data/test/rubygems/test_gem_commands_which_command.rb +0 -1
- data/test/rubygems/test_gem_commands_yank_command.rb +0 -1
- data/test/rubygems/test_gem_config_file.rb +4 -2
- data/test/rubygems/test_gem_dependency.rb +0 -1
- data/test/rubygems/test_gem_dependency_installer.rb +8 -5
- data/test/rubygems/test_gem_dependency_list.rb +6 -7
- data/test/rubygems/test_gem_dependency_resolution_error.rb +0 -1
- data/test/rubygems/test_gem_doctor.rb +1 -2
- data/test/rubygems/test_gem_ext_builder.rb +10 -23
- data/test/rubygems/test_gem_ext_cmake_builder.rb +5 -4
- data/test/rubygems/test_gem_ext_configure_builder.rb +3 -3
- data/test/rubygems/test_gem_ext_ext_conf_builder.rb +8 -9
- data/test/rubygems/test_gem_ext_rake_builder.rb +20 -5
- data/test/rubygems/test_gem_gem_runner.rb +0 -1
- data/test/rubygems/test_gem_gemcutter_utilities.rb +32 -6
- data/test/rubygems/test_gem_impossible_dependencies_error.rb +0 -1
- data/test/rubygems/test_gem_indexer.rb +16 -10
- data/test/rubygems/test_gem_install_update_options.rb +1 -20
- data/test/rubygems/test_gem_installer.rb +154 -119
- data/test/rubygems/test_gem_local_remote_options.rb +3 -3
- data/test/rubygems/test_gem_name_tuple.rb +0 -1
- data/test/rubygems/test_gem_package.rb +77 -31
- data/test/rubygems/test_gem_package_old.rb +0 -1
- data/test/rubygems/test_gem_package_tar_header.rb +42 -2
- data/test/rubygems/test_gem_package_tar_reader.rb +0 -1
- data/test/rubygems/test_gem_package_tar_reader_entry.rb +11 -0
- data/test/rubygems/test_gem_package_tar_writer.rb +43 -7
- data/test/rubygems/test_gem_package_task.rb +2 -2
- data/test/rubygems/test_gem_path_support.rb +28 -11
- data/test/rubygems/test_gem_platform.rb +4 -5
- data/test/rubygems/test_gem_rdoc.rb +1 -136
- data/test/rubygems/test_gem_remote_fetcher.rb +241 -141
- data/test/rubygems/test_gem_request.rb +9 -9
- data/test/rubygems/test_gem_request_connection_pools.rb +24 -3
- data/test/rubygems/test_gem_request_set.rb +5 -5
- data/test/rubygems/test_gem_request_set_gem_dependency_api.rb +82 -64
- data/test/rubygems/test_gem_request_set_lockfile.rb +1 -2
- data/test/rubygems/test_gem_request_set_lockfile_parser.rb +4 -9
- data/test/rubygems/test_gem_request_set_lockfile_tokenizer.rb +1 -1
- data/test/rubygems/test_gem_requirement.rb +24 -4
- data/test/rubygems/test_gem_resolver.rb +13 -17
- data/test/rubygems/test_gem_resolver_activation_request.rb +0 -1
- data/test/rubygems/test_gem_resolver_api_set.rb +0 -1
- data/test/rubygems/test_gem_resolver_api_specification.rb +0 -1
- data/test/rubygems/test_gem_resolver_best_set.rb +0 -1
- data/test/rubygems/test_gem_resolver_composed_set.rb +0 -1
- data/test/rubygems/test_gem_resolver_conflict.rb +0 -1
- data/test/rubygems/test_gem_resolver_dependency_request.rb +0 -1
- data/test/rubygems/test_gem_resolver_git_set.rb +0 -1
- data/test/rubygems/test_gem_resolver_git_specification.rb +0 -1
- data/test/rubygems/test_gem_resolver_index_set.rb +0 -1
- data/test/rubygems/test_gem_resolver_index_specification.rb +0 -1
- data/test/rubygems/test_gem_resolver_installed_specification.rb +0 -1
- data/test/rubygems/test_gem_resolver_installer_set.rb +2 -3
- data/test/rubygems/test_gem_resolver_local_specification.rb +0 -1
- data/test/rubygems/test_gem_resolver_lock_set.rb +0 -1
- data/test/rubygems/test_gem_resolver_lock_specification.rb +0 -1
- data/test/rubygems/test_gem_resolver_requirement_list.rb +0 -1
- data/test/rubygems/test_gem_resolver_specification.rb +1 -2
- data/test/rubygems/test_gem_resolver_vendor_set.rb +0 -1
- data/test/rubygems/test_gem_resolver_vendor_specification.rb +0 -1
- data/test/rubygems/test_gem_security.rb +1 -3
- data/test/rubygems/test_gem_security_policy.rb +5 -6
- data/test/rubygems/test_gem_security_signer.rb +4 -3
- data/test/rubygems/test_gem_security_trust_dir.rb +1 -2
- data/test/rubygems/test_gem_server.rb +4 -4
- data/test/rubygems/test_gem_source.rb +0 -13
- data/test/rubygems/test_gem_source_fetch_problem.rb +0 -1
- data/test/rubygems/test_gem_source_git.rb +0 -1
- data/test/rubygems/test_gem_source_installed.rb +0 -1
- data/test/rubygems/test_gem_source_lock.rb +0 -1
- data/test/rubygems/test_gem_source_vendor.rb +0 -1
- data/test/rubygems/test_gem_spec_fetcher.rb +0 -1
- data/test/rubygems/test_gem_specification.rb +366 -198
- data/test/rubygems/test_gem_stream_ui.rb +15 -32
- data/test/rubygems/test_gem_stub_specification.rb +0 -2
- data/test/rubygems/test_gem_text.rb +4 -0
- data/test/rubygems/test_gem_uninstaller.rb +42 -3
- data/test/rubygems/test_gem_unsatisfiable_dependency_error.rb +0 -1
- data/test/rubygems/test_gem_uri_formatter.rb +0 -1
- data/test/rubygems/test_gem_util.rb +31 -11
- data/test/rubygems/test_gem_validator.rb +0 -1
- data/test/rubygems/test_gem_version.rb +11 -11
- data/test/rubygems/test_gem_version_option.rb +0 -1
- data/test/rubygems/test_remote_fetch_error.rb +0 -1
- data/test/rubygems/test_require.rb +67 -52
- data/util/CL2notes +1 -2
- data/util/ci +20 -12
- data/util/cops/deprecations.rb +52 -0
- data/util/create_certs.rb +6 -7
- data/util/create_certs.sh +27 -0
- data/util/create_encrypted_key.rb +4 -5
- data/util/patch_with_prs.rb +1 -1
- data/util/rubocop +8 -0
- data/util/update_bundled_ca_certificates.rb +12 -13
- data/util/update_changelog.rb +1 -1
- metadata +61 -51
- data/.autotest +0 -71
- data/.document +0 -5
- data/CONTRIBUTING.rdoc +0 -130
- data/CVE-2013-4287.txt +0 -35
- data/CVE-2013-4363.txt +0 -45
- data/CVE-2015-3900.txt +0 -40
- data/POLICIES.rdoc +0 -74
- data/test/rubygems/fix_openssl_warnings.rb +0 -13
@@ -23,12 +23,14 @@ class Gem::PathSupport
|
|
23
23
|
# hashtable, or defaults to ENV, the system environment.
|
24
24
|
#
|
25
25
|
def initialize(env)
|
26
|
-
@home
|
26
|
+
@home = env["GEM_HOME"] || Gem.default_dir
|
27
27
|
|
28
|
-
if File::ALT_SEPARATOR
|
29
|
-
@home
|
28
|
+
if File::ALT_SEPARATOR
|
29
|
+
@home = @home.gsub(File::ALT_SEPARATOR, File::SEPARATOR)
|
30
30
|
end
|
31
31
|
|
32
|
+
@home = expand(@home)
|
33
|
+
|
32
34
|
@path = split_gem_path env["GEM_PATH"], @home
|
33
35
|
|
34
36
|
@spec_cache_dir = env["GEM_SPEC_CACHE"] || Gem.default_spec_cache_dir
|
@@ -41,7 +43,7 @@ class Gem::PathSupport
|
|
41
43
|
##
|
42
44
|
# Split the Gem search path (as reported by Gem.path).
|
43
45
|
|
44
|
-
def split_gem_path
|
46
|
+
def split_gem_path(gpaths, home)
|
45
47
|
# FIX: it should be [home, *path], not [*path, home]
|
46
48
|
|
47
49
|
gem_path = []
|
@@ -54,7 +56,7 @@ class Gem::PathSupport
|
|
54
56
|
gem_path += default_path
|
55
57
|
end
|
56
58
|
|
57
|
-
if File::ALT_SEPARATOR
|
59
|
+
if File::ALT_SEPARATOR
|
58
60
|
gem_path.map! do |this_path|
|
59
61
|
this_path.gsub File::ALT_SEPARATOR, File::SEPARATOR
|
60
62
|
end
|
@@ -65,7 +67,7 @@ class Gem::PathSupport
|
|
65
67
|
gem_path = default_path
|
66
68
|
end
|
67
69
|
|
68
|
-
gem_path.uniq
|
70
|
+
gem_path.map { |path| expand(path) }.uniq
|
69
71
|
end
|
70
72
|
|
71
73
|
# Return the default Gem path
|
@@ -77,4 +79,12 @@ class Gem::PathSupport
|
|
77
79
|
end
|
78
80
|
gem_path
|
79
81
|
end
|
82
|
+
|
83
|
+
def expand(path)
|
84
|
+
if File.directory?(path)
|
85
|
+
File.realpath(path)
|
86
|
+
else
|
87
|
+
path
|
88
|
+
end
|
89
|
+
end
|
80
90
|
end
|
data/lib/rubygems/platform.rb
CHANGED
@@ -56,7 +56,7 @@ class Gem::Platform
|
|
56
56
|
when String then
|
57
57
|
arch = arch.split '-'
|
58
58
|
|
59
|
-
if arch.length > 2 and arch.last !~ /\d/
|
59
|
+
if arch.length > 2 and arch.last !~ /\d/ # reassemble x86-linux-gnu
|
60
60
|
extra = arch.pop
|
61
61
|
arch.last << "-#{extra}"
|
62
62
|
end
|
@@ -68,7 +68,7 @@ class Gem::Platform
|
|
68
68
|
else cpu
|
69
69
|
end
|
70
70
|
|
71
|
-
if arch.length == 2 and arch.last =~ /^\d+(\.\d+)?$/
|
71
|
+
if arch.length == 2 and arch.last =~ /^\d+(\.\d+)?$/ # for command-line
|
72
72
|
@os, @version = arch
|
73
73
|
return
|
74
74
|
end
|
@@ -195,12 +195,11 @@ class Gem::Platform
|
|
195
195
|
# A pure-Ruby gem that may use Gem::Specification#extensions to build
|
196
196
|
# binary files.
|
197
197
|
|
198
|
-
RUBY = 'ruby'
|
198
|
+
RUBY = 'ruby'.freeze
|
199
199
|
|
200
200
|
##
|
201
201
|
# A platform-specific gem that is built for the packaging Ruby's platform.
|
202
202
|
# This will be replaced with Gem::Platform::local.
|
203
203
|
|
204
|
-
CURRENT = 'current'
|
204
|
+
CURRENT = 'current'.freeze
|
205
205
|
end
|
206
|
-
|
data/lib/rubygems/psych_tree.rb
CHANGED
data/lib/rubygems/rdoc.rb
CHANGED
@@ -1,7 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
require 'rubygems'
|
3
|
-
require 'rubygems/user_interaction'
|
4
|
-
require 'fileutils'
|
5
3
|
|
6
4
|
begin
|
7
5
|
gem 'rdoc'
|
@@ -15,321 +13,12 @@ else
|
|
15
13
|
Gem.finish_resolve
|
16
14
|
end
|
17
15
|
|
18
|
-
loaded_hook = false
|
19
|
-
|
20
16
|
begin
|
21
17
|
require 'rdoc/rubygems_hook'
|
22
|
-
loaded_hook = true
|
23
18
|
module Gem
|
24
19
|
RDoc = ::RDoc::RubygemsHook
|
25
20
|
end
|
21
|
+
|
22
|
+
Gem.done_installing(&Gem::RDoc.method(:generation_hook))
|
26
23
|
rescue LoadError
|
27
24
|
end
|
28
|
-
|
29
|
-
##
|
30
|
-
# Gem::RDoc provides methods to generate RDoc and ri data for installed gems.
|
31
|
-
# It works for RDoc 1.0.1 (in Ruby 1.8) up to RDoc 3.6.
|
32
|
-
#
|
33
|
-
# This implementation is considered obsolete. The RDoc project is the
|
34
|
-
# appropriate location to find this functionality. This file provides the
|
35
|
-
# hooks to load RDoc generation code from the "rdoc" gem and a fallback in
|
36
|
-
# case the installed version of RDoc does not have them.
|
37
|
-
|
38
|
-
class Gem::RDoc # :nodoc: all
|
39
|
-
|
40
|
-
include Gem::UserInteraction
|
41
|
-
extend Gem::UserInteraction
|
42
|
-
|
43
|
-
@rdoc_version = nil
|
44
|
-
@specs = []
|
45
|
-
|
46
|
-
##
|
47
|
-
# Force installation of documentation?
|
48
|
-
|
49
|
-
attr_accessor :force
|
50
|
-
|
51
|
-
##
|
52
|
-
# Generate rdoc?
|
53
|
-
|
54
|
-
attr_accessor :generate_rdoc
|
55
|
-
|
56
|
-
##
|
57
|
-
# Generate ri data?
|
58
|
-
|
59
|
-
attr_accessor :generate_ri
|
60
|
-
|
61
|
-
class << self
|
62
|
-
|
63
|
-
##
|
64
|
-
# Loaded version of RDoc. Set by ::load_rdoc
|
65
|
-
|
66
|
-
attr_reader :rdoc_version
|
67
|
-
|
68
|
-
end
|
69
|
-
|
70
|
-
##
|
71
|
-
# Post installs hook that generates documentation for each specification in
|
72
|
-
# +specs+
|
73
|
-
|
74
|
-
def self.generation_hook installer, specs
|
75
|
-
start = Time.now
|
76
|
-
types = installer.document
|
77
|
-
|
78
|
-
generate_rdoc = types.include? 'rdoc'
|
79
|
-
generate_ri = types.include? 'ri'
|
80
|
-
|
81
|
-
specs.each do |spec|
|
82
|
-
new(spec, generate_rdoc, generate_ri).generate
|
83
|
-
end
|
84
|
-
|
85
|
-
return unless generate_rdoc or generate_ri
|
86
|
-
|
87
|
-
duration = (Time.now - start).to_i
|
88
|
-
names = specs.map(&:name).join ', '
|
89
|
-
|
90
|
-
say "Done installing documentation for #{names} after #{duration} seconds"
|
91
|
-
end
|
92
|
-
|
93
|
-
##
|
94
|
-
# Loads the RDoc generator
|
95
|
-
|
96
|
-
def self.load_rdoc
|
97
|
-
return if @rdoc_version
|
98
|
-
|
99
|
-
require 'rdoc/rdoc'
|
100
|
-
|
101
|
-
@rdoc_version = if ::RDoc.const_defined? :VERSION then
|
102
|
-
Gem::Version.new ::RDoc::VERSION
|
103
|
-
else
|
104
|
-
Gem::Version.new '1.0.1'
|
105
|
-
end
|
106
|
-
|
107
|
-
rescue LoadError => e
|
108
|
-
raise Gem::DocumentError, "RDoc is not installed: #{e}"
|
109
|
-
end
|
110
|
-
|
111
|
-
##
|
112
|
-
# Creates a new documentation generator for +spec+. RDoc and ri data
|
113
|
-
# generation can be enabled or disabled through +generate_rdoc+ and
|
114
|
-
# +generate_ri+ respectively.
|
115
|
-
#
|
116
|
-
# Only +generate_ri+ is enabled by default.
|
117
|
-
|
118
|
-
def initialize spec, generate_rdoc = true, generate_ri = true
|
119
|
-
@doc_dir = spec.doc_dir
|
120
|
-
@file_info = nil
|
121
|
-
@force = false
|
122
|
-
@rdoc = nil
|
123
|
-
@spec = spec
|
124
|
-
|
125
|
-
@generate_rdoc = generate_rdoc
|
126
|
-
@generate_ri = generate_ri
|
127
|
-
|
128
|
-
@rdoc_dir = spec.doc_dir 'rdoc'
|
129
|
-
@ri_dir = spec.doc_dir 'ri'
|
130
|
-
end
|
131
|
-
|
132
|
-
##
|
133
|
-
# Removes legacy rdoc arguments from +args+
|
134
|
-
#--
|
135
|
-
# TODO move to RDoc::Options
|
136
|
-
|
137
|
-
def delete_legacy_args args
|
138
|
-
args.delete '--inline-source'
|
139
|
-
args.delete '--promiscuous'
|
140
|
-
args.delete '-p'
|
141
|
-
args.delete '--one-file'
|
142
|
-
end
|
143
|
-
|
144
|
-
##
|
145
|
-
# Generates documentation using the named +generator+ ("darkfish" or "ri")
|
146
|
-
# and following the given +options+.
|
147
|
-
#
|
148
|
-
# Documentation will be generated into +destination+
|
149
|
-
|
150
|
-
def document generator, options, destination
|
151
|
-
generator_name = generator
|
152
|
-
|
153
|
-
options = options.dup
|
154
|
-
options.exclude ||= [] # TODO maybe move to RDoc::Options#finish
|
155
|
-
options.setup_generator generator
|
156
|
-
options.op_dir = destination
|
157
|
-
options.finish
|
158
|
-
|
159
|
-
generator = options.generator.new @rdoc.store, options
|
160
|
-
|
161
|
-
@rdoc.options = options
|
162
|
-
@rdoc.generator = generator
|
163
|
-
|
164
|
-
say "Installing #{generator_name} documentation for #{@spec.full_name}"
|
165
|
-
|
166
|
-
FileUtils.mkdir_p options.op_dir
|
167
|
-
|
168
|
-
Dir.chdir options.op_dir do
|
169
|
-
begin
|
170
|
-
@rdoc.class.current = @rdoc
|
171
|
-
@rdoc.generator.generate @file_info
|
172
|
-
ensure
|
173
|
-
@rdoc.class.current = nil
|
174
|
-
end
|
175
|
-
end
|
176
|
-
end
|
177
|
-
|
178
|
-
##
|
179
|
-
# Generates RDoc and ri data
|
180
|
-
|
181
|
-
def generate
|
182
|
-
return unless @generate_ri or @generate_rdoc
|
183
|
-
|
184
|
-
setup
|
185
|
-
|
186
|
-
options = nil
|
187
|
-
|
188
|
-
if Gem::Requirement.new('< 3').satisfied_by? self.class.rdoc_version then
|
189
|
-
generate_legacy
|
190
|
-
return
|
191
|
-
end
|
192
|
-
|
193
|
-
::RDoc::TopLevel.reset # TODO ::RDoc::RDoc.reset
|
194
|
-
::RDoc::Parser::C.reset
|
195
|
-
|
196
|
-
args = @spec.rdoc_options
|
197
|
-
args.concat @spec.source_paths
|
198
|
-
args.concat @spec.extra_rdoc_files
|
199
|
-
|
200
|
-
case config_args = Gem.configuration[:rdoc]
|
201
|
-
when String then
|
202
|
-
args = args.concat config_args.split
|
203
|
-
when Array then
|
204
|
-
args = args.concat config_args
|
205
|
-
end
|
206
|
-
|
207
|
-
delete_legacy_args args
|
208
|
-
|
209
|
-
Dir.chdir @spec.full_gem_path do
|
210
|
-
options = ::RDoc::Options.new
|
211
|
-
options.default_title = "#{@spec.full_name} Documentation"
|
212
|
-
options.parse args
|
213
|
-
end
|
214
|
-
|
215
|
-
options.quiet = !Gem.configuration.really_verbose
|
216
|
-
|
217
|
-
@rdoc = new_rdoc
|
218
|
-
@rdoc.options = options
|
219
|
-
|
220
|
-
say "Parsing documentation for #{@spec.full_name}"
|
221
|
-
|
222
|
-
Dir.chdir @spec.full_gem_path do
|
223
|
-
@file_info = @rdoc.parse_files options.files
|
224
|
-
end
|
225
|
-
|
226
|
-
document 'ri', options, @ri_dir if
|
227
|
-
@generate_ri and (@force or not File.exist? @ri_dir)
|
228
|
-
|
229
|
-
document 'darkfish', options, @rdoc_dir if
|
230
|
-
@generate_rdoc and (@force or not File.exist? @rdoc_dir)
|
231
|
-
end
|
232
|
-
|
233
|
-
##
|
234
|
-
# Generates RDoc and ri data for legacy RDoc versions. This method will not
|
235
|
-
# exist in future versions.
|
236
|
-
|
237
|
-
def generate_legacy
|
238
|
-
if @generate_rdoc then
|
239
|
-
FileUtils.rm_rf @rdoc_dir
|
240
|
-
say "Installing RDoc documentation for #{@spec.full_name}"
|
241
|
-
legacy_rdoc '--op', @rdoc_dir
|
242
|
-
end
|
243
|
-
|
244
|
-
if @generate_ri then
|
245
|
-
FileUtils.rm_rf @ri_dir
|
246
|
-
say "Installing ri documentation for #{@spec.full_name}"
|
247
|
-
legacy_rdoc '--ri', '--op', @ri_dir
|
248
|
-
end
|
249
|
-
end
|
250
|
-
|
251
|
-
##
|
252
|
-
# Generates RDoc using a legacy version of RDoc from the ARGV-like +args+.
|
253
|
-
# This method will not exist in future versions.
|
254
|
-
|
255
|
-
def legacy_rdoc *args
|
256
|
-
args << @spec.rdoc_options
|
257
|
-
args << '--quiet'
|
258
|
-
args << @spec.require_paths.clone
|
259
|
-
args << @spec.extra_rdoc_files
|
260
|
-
args << '--title' << "#{@spec.full_name} Documentation"
|
261
|
-
args = args.flatten.map do |arg| arg.to_s end
|
262
|
-
|
263
|
-
delete_legacy_args args if
|
264
|
-
Gem::Requirement.new('>= 2.4.0') =~ self.class.rdoc_version
|
265
|
-
|
266
|
-
r = new_rdoc
|
267
|
-
verbose { "rdoc #{args.join ' '}" }
|
268
|
-
|
269
|
-
Dir.chdir @spec.full_gem_path do
|
270
|
-
begin
|
271
|
-
r.document args
|
272
|
-
rescue Errno::EACCES => e
|
273
|
-
dirname = File.dirname e.message.split("-")[1].strip
|
274
|
-
raise Gem::FilePermissionError, dirname
|
275
|
-
rescue Interrupt => e
|
276
|
-
raise e
|
277
|
-
rescue Exception => ex
|
278
|
-
alert_error "While generating documentation for #{@spec.full_name}"
|
279
|
-
ui.errs.puts "... MESSAGE: #{ex}"
|
280
|
-
ui.errs.puts "... RDOC args: #{args.join(' ')}"
|
281
|
-
ui.backtrace ex
|
282
|
-
ui.errs.puts "(continuing with the rest of the installation)"
|
283
|
-
end
|
284
|
-
end
|
285
|
-
end
|
286
|
-
|
287
|
-
##
|
288
|
-
# #new_rdoc creates a new RDoc instance. This method is provided only to
|
289
|
-
# make testing easier.
|
290
|
-
|
291
|
-
def new_rdoc # :nodoc:
|
292
|
-
::RDoc::RDoc.new
|
293
|
-
end
|
294
|
-
|
295
|
-
##
|
296
|
-
# Is rdoc documentation installed?
|
297
|
-
|
298
|
-
def rdoc_installed?
|
299
|
-
File.exist? @rdoc_dir
|
300
|
-
end
|
301
|
-
|
302
|
-
##
|
303
|
-
# Removes generated RDoc and ri data
|
304
|
-
|
305
|
-
def remove
|
306
|
-
base_dir = @spec.base_dir
|
307
|
-
|
308
|
-
raise Gem::FilePermissionError, base_dir unless File.writable? base_dir
|
309
|
-
|
310
|
-
FileUtils.rm_rf @rdoc_dir
|
311
|
-
FileUtils.rm_rf @ri_dir
|
312
|
-
end
|
313
|
-
|
314
|
-
##
|
315
|
-
# Is ri data installed?
|
316
|
-
|
317
|
-
def ri_installed?
|
318
|
-
File.exist? @ri_dir
|
319
|
-
end
|
320
|
-
|
321
|
-
##
|
322
|
-
# Prepares the spec for documentation generation
|
323
|
-
|
324
|
-
def setup
|
325
|
-
self.class.load_rdoc
|
326
|
-
|
327
|
-
raise Gem::FilePermissionError, @doc_dir if
|
328
|
-
File.exist?(@doc_dir) and not File.writable?(@doc_dir)
|
329
|
-
|
330
|
-
FileUtils.mkdir_p @doc_dir unless File.exist? @doc_dir
|
331
|
-
end
|
332
|
-
|
333
|
-
end unless loaded_hook
|
334
|
-
|
335
|
-
Gem.done_installing(&Gem::RDoc.method(:generation_hook))
|
@@ -1,9 +1,10 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
require 'rubygems'
|
3
3
|
require 'rubygems/request'
|
4
|
+
require 'rubygems/request/connection_pools'
|
5
|
+
require 'rubygems/s3_uri_signer'
|
4
6
|
require 'rubygems/uri_formatter'
|
5
7
|
require 'rubygems/user_interaction'
|
6
|
-
require 'rubygems/request/connection_pools'
|
7
8
|
require 'resolv'
|
8
9
|
|
9
10
|
##
|
@@ -71,13 +72,10 @@ class Gem::RemoteFetcher
|
|
71
72
|
# HTTP_PROXY_PASS)
|
72
73
|
# * <tt>:no_proxy</tt>: ignore environment variables and _don't_ use a proxy
|
73
74
|
#
|
74
|
-
# +dns+: An object to use for DNS resolution of the API endpoint.
|
75
|
-
# By default, use Resolv::DNS.
|
76
|
-
#
|
77
75
|
# +headers+: A set of additional HTTP headers to be sent to the server when
|
78
76
|
# fetching the gem.
|
79
77
|
|
80
|
-
def initialize(proxy=nil, dns=
|
78
|
+
def initialize(proxy=nil, dns=nil, headers={})
|
81
79
|
require 'net/http'
|
82
80
|
require 'stringio'
|
83
81
|
require 'time'
|
@@ -90,34 +88,9 @@ class Gem::RemoteFetcher
|
|
90
88
|
@pool_lock = Mutex.new
|
91
89
|
@cert_files = Gem::Request.get_cert_files
|
92
90
|
|
93
|
-
@dns = dns
|
94
91
|
@headers = headers
|
95
92
|
end
|
96
93
|
|
97
|
-
##
|
98
|
-
# Given a source at +uri+, calculate what hostname to actually
|
99
|
-
# connect to query the data for it.
|
100
|
-
|
101
|
-
def api_endpoint(uri)
|
102
|
-
host = uri.host
|
103
|
-
|
104
|
-
begin
|
105
|
-
res = @dns.getresource "_rubygems._tcp.#{host}",
|
106
|
-
Resolv::DNS::Resource::IN::SRV
|
107
|
-
rescue Resolv::ResolvError => e
|
108
|
-
verbose "Getting SRV record failed: #{e}"
|
109
|
-
uri
|
110
|
-
else
|
111
|
-
target = res.target.to_s.strip
|
112
|
-
|
113
|
-
if URI("http://" + target).host.end_with?(".#{host}")
|
114
|
-
return URI.parse "#{uri.scheme}://#{target}#{uri.path}"
|
115
|
-
end
|
116
|
-
|
117
|
-
uri
|
118
|
-
end
|
119
|
-
end
|
120
|
-
|
121
94
|
##
|
122
95
|
# Given a name and requirement, downloads this gem into cache and returns the
|
123
96
|
# filename. Returns nil if the gem cannot be located.
|
@@ -125,7 +98,7 @@ class Gem::RemoteFetcher
|
|
125
98
|
# Should probably be integrated with #download below, but that will be a
|
126
99
|
# larger, more encompassing effort. -erikh
|
127
100
|
|
128
|
-
def download_to_cache
|
101
|
+
def download_to_cache(dependency)
|
129
102
|
found, _ = Gem::SpecFetcher.fetcher.spec_for_dependency dependency
|
130
103
|
|
131
104
|
return if found.empty?
|
@@ -142,9 +115,9 @@ class Gem::RemoteFetcher
|
|
142
115
|
|
143
116
|
def download(spec, source_uri, install_dir = Gem.dir)
|
144
117
|
cache_dir =
|
145
|
-
if Dir.pwd == install_dir
|
118
|
+
if Dir.pwd == install_dir # see fetch_command
|
146
119
|
install_dir
|
147
|
-
elsif File.writable? install_dir
|
120
|
+
elsif File.writable? install_dir
|
148
121
|
File.join install_dir, "cache"
|
149
122
|
else
|
150
123
|
File.join Gem.user_dir, "cache"
|
@@ -164,9 +137,7 @@ class Gem::RemoteFetcher
|
|
164
137
|
begin
|
165
138
|
source_uri = URI.parse(source_uri)
|
166
139
|
rescue
|
167
|
-
source_uri = URI.parse(URI.
|
168
|
-
URI::DEFAULT_PARSER.escape(source_uri.to_s) :
|
169
|
-
URI.escape(source_uri.to_s))
|
140
|
+
source_uri = URI.parse(URI::DEFAULT_PARSER.escape(source_uri.to_s))
|
170
141
|
end
|
171
142
|
end
|
172
143
|
|
@@ -179,7 +150,7 @@ class Gem::RemoteFetcher
|
|
179
150
|
# REFACTOR: be sure to clean up fake fetcher when you do this... cleaner
|
180
151
|
case scheme
|
181
152
|
when 'http', 'https', 's3' then
|
182
|
-
unless File.exist? local_gem_path
|
153
|
+
unless File.exist? local_gem_path
|
183
154
|
begin
|
184
155
|
verbose "Downloading gem #{gem_file_name}"
|
185
156
|
|
@@ -203,7 +174,7 @@ class Gem::RemoteFetcher
|
|
203
174
|
path = source_uri.path
|
204
175
|
path = File.dirname(path) if File.extname(path) == '.gem'
|
205
176
|
|
206
|
-
remote_gem_path = correct_for_windows_path(File.join(path, 'gems', gem_file_name))
|
177
|
+
remote_gem_path = Gem::Util.correct_for_windows_path(File.join(path, 'gems', gem_file_name))
|
207
178
|
|
208
179
|
FileUtils.cp(remote_gem_path, local_gem_path)
|
209
180
|
rescue Errno::EACCES
|
@@ -213,7 +184,7 @@ class Gem::RemoteFetcher
|
|
213
184
|
verbose "Using local gem #{local_gem_path}"
|
214
185
|
when nil then # TODO test for local overriding cache
|
215
186
|
source_path = if Gem.win_platform? && source_uri.scheme &&
|
216
|
-
!source_uri.path.include?(':')
|
187
|
+
!source_uri.path.include?(':')
|
217
188
|
"#{source_uri.scheme}:#{source_uri.path}"
|
218
189
|
else
|
219
190
|
source_uri.path
|
@@ -239,14 +210,14 @@ class Gem::RemoteFetcher
|
|
239
210
|
##
|
240
211
|
# File Fetcher. Dispatched by +fetch_path+. Use it instead.
|
241
212
|
|
242
|
-
def fetch_file
|
243
|
-
Gem.read_binary correct_for_windows_path uri.path
|
213
|
+
def fetch_file(uri, *_)
|
214
|
+
Gem.read_binary Gem::Util.correct_for_windows_path uri.path
|
244
215
|
end
|
245
216
|
|
246
217
|
##
|
247
218
|
# HTTP Fetcher. Dispatched by +fetch_path+. Use it instead.
|
248
219
|
|
249
|
-
def fetch_http
|
220
|
+
def fetch_http(uri, last_modified = nil, head = false, depth = 0)
|
250
221
|
fetch_type = head ? Net::HTTP::Head : Net::HTTP::Get
|
251
222
|
response = request uri, fetch_type, last_modified do |req|
|
252
223
|
headers.each { |k,v| req.add_field(k,v) }
|
@@ -304,7 +275,8 @@ class Gem::RemoteFetcher
|
|
304
275
|
raise
|
305
276
|
rescue Timeout::Error
|
306
277
|
raise UnknownHostError.new('timed out', uri.to_s)
|
307
|
-
rescue IOError, SocketError, SystemCallError
|
278
|
+
rescue IOError, SocketError, SystemCallError,
|
279
|
+
*(OpenSSL::SSL::SSLError if defined?(OpenSSL)) => e
|
308
280
|
if e.message =~ /getaddrinfo/
|
309
281
|
raise UnknownHostError.new('no such name', uri.to_s)
|
310
282
|
else
|
@@ -313,15 +285,24 @@ class Gem::RemoteFetcher
|
|
313
285
|
end
|
314
286
|
|
315
287
|
def fetch_s3(uri, mtime = nil, head = false)
|
316
|
-
|
288
|
+
begin
|
289
|
+
public_uri = s3_uri_signer(uri).sign
|
290
|
+
rescue Gem::S3URISigner::ConfigurationError, Gem::S3URISigner::InstanceProfileError => e
|
291
|
+
raise FetchError.new(e.message, "s3://#{uri.host}")
|
292
|
+
end
|
317
293
|
fetch_https public_uri, mtime, head
|
318
294
|
end
|
319
295
|
|
296
|
+
# we have our own signing code here to avoid a dependency on the aws-sdk gem
|
297
|
+
def s3_uri_signer(uri)
|
298
|
+
Gem::S3URISigner.new(uri)
|
299
|
+
end
|
300
|
+
|
320
301
|
##
|
321
302
|
# Downloads +uri+ to +path+ if necessary. If no path is given, it just
|
322
303
|
# passes the data.
|
323
304
|
|
324
|
-
def cache_update_path
|
305
|
+
def cache_update_path(uri, path = nil, update = true)
|
325
306
|
mtime = path && File.stat(path).mtime rescue nil
|
326
307
|
|
327
308
|
data = fetch_path(uri, mtime)
|
@@ -346,14 +327,6 @@ class Gem::RemoteFetcher
|
|
346
327
|
response['content-length'].to_i
|
347
328
|
end
|
348
329
|
|
349
|
-
def correct_for_windows_path(path)
|
350
|
-
if path[0].chr == '/' && path[1].chr =~ /[a-z]/i && path[2].chr == ':'
|
351
|
-
path[1..-1]
|
352
|
-
else
|
353
|
-
path
|
354
|
-
end
|
355
|
-
end
|
356
|
-
|
357
330
|
##
|
358
331
|
# Performs a Net::HTTP request of type +request_class+ on +uri+ returning
|
359
332
|
# a Net::HTTP response object. request maintains a table of persistent
|
@@ -378,42 +351,16 @@ class Gem::RemoteFetcher
|
|
378
351
|
@pools.each_value {|pool| pool.close_all}
|
379
352
|
end
|
380
353
|
|
381
|
-
protected
|
382
|
-
|
383
|
-
# we have our own signing code here to avoid a dependency on the aws-sdk gem
|
384
|
-
# fortunately, a simple GET request isn't too complex to sign properly
|
385
|
-
def sign_s3_url(uri, expiration = nil)
|
386
|
-
require 'base64'
|
387
|
-
require 'openssl'
|
388
|
-
|
389
|
-
unless uri.user && uri.password
|
390
|
-
raise FetchError.new("credentials needed in s3 source, like s3://key:secret@bucket-name/", uri.to_s)
|
391
|
-
end
|
392
|
-
|
393
|
-
expiration ||= s3_expiration
|
394
|
-
canonical_path = "/#{uri.host}#{uri.path}"
|
395
|
-
payload = "GET\n\n\n#{expiration}\n#{canonical_path}"
|
396
|
-
digest = OpenSSL::HMAC.digest('sha1', uri.password, payload)
|
397
|
-
# URI.escape is deprecated, and there isn't yet a replacement that does quite what we want
|
398
|
-
signature = Base64.encode64(digest).gsub("\n", '').gsub(/[\+\/=]/) { |c| BASE64_URI_TRANSLATE[c] }
|
399
|
-
URI.parse("https://#{uri.host}.s3.amazonaws.com#{uri.path}?AWSAccessKeyId=#{uri.user}&Expires=#{expiration}&Signature=#{signature}")
|
400
|
-
end
|
401
|
-
|
402
|
-
def s3_expiration
|
403
|
-
(Time.now + 3600).to_i # one hour from now
|
404
|
-
end
|
405
|
-
|
406
|
-
BASE64_URI_TRANSLATE = { '+' => '%2B', '/' => '%2F', '=' => '%3D' }.freeze
|
407
|
-
|
408
354
|
private
|
409
355
|
|
410
|
-
def proxy_for
|
356
|
+
def proxy_for(proxy, uri)
|
411
357
|
Gem::Request.proxy_uri(proxy || Gem::Request.get_proxy_from_env(uri.scheme))
|
412
358
|
end
|
413
359
|
|
414
|
-
def pools_for
|
360
|
+
def pools_for(proxy)
|
415
361
|
@pool_lock.synchronize do
|
416
362
|
@pools[proxy] ||= Gem::Request::ConnectionPools.new proxy, @cert_files
|
417
363
|
end
|
418
364
|
end
|
365
|
+
|
419
366
|
end
|