rubygems-update 4.0.21 → 4.1.0.beta1
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 +590 -53
- data/CONTRIBUTING.md +66 -5
- data/MIT.txt +4 -3
- data/Manifest.txt +332 -375
- data/README.md +26 -6
- data/bundler.gemspec +63 -0
- data/doc/POLICIES.md +147 -0
- data/doc/UPGRADING.md +4 -4
- data/{bundler/lib → lib}/bundler/build_metadata.rb +2 -2
- data/{bundler/lib → lib}/bundler/checksum.rb +40 -25
- data/{bundler/lib → lib}/bundler/ci_detector.rb +1 -1
- data/{bundler/lib → lib}/bundler/cli/add.rb +3 -4
- data/{bundler/lib → lib}/bundler/cli/cache.rb +4 -0
- data/{bundler/lib → lib}/bundler/cli/clean.rb +5 -0
- data/{bundler/lib → lib}/bundler/cli/common.rb +37 -1
- data/{bundler/lib → lib}/bundler/cli/config.rb +4 -2
- data/{bundler/lib → lib}/bundler/cli/gem.rb +0 -17
- data/{bundler/lib → lib}/bundler/cli/install.rb +4 -5
- data/{bundler/lib → lib}/bundler/cli/lock.rb +1 -2
- data/{bundler/lib → lib}/bundler/cli/outdated.rb +8 -3
- data/{bundler/lib → lib}/bundler/cli/pristine.rb +2 -1
- data/{bundler/lib → lib}/bundler/cli/update.rb +21 -12
- data/{bundler/lib → lib}/bundler/cli.rb +14 -11
- data/{bundler/lib → lib}/bundler/definition.rb +61 -24
- data/{bundler/lib → lib}/bundler/dependency.rb +4 -0
- data/{bundler/lib → lib}/bundler/dsl.rb +77 -11
- data/{bundler/lib → lib}/bundler/endpoint_specification.rb +51 -14
- data/{bundler/lib → lib}/bundler/env.rb +7 -24
- data/{bundler/lib → lib}/bundler/errors.rb +34 -5
- data/{bundler/lib → lib}/bundler/fetcher/compact_index.rb +14 -5
- data/lib/bundler/fetcher/connection_pools.rb +150 -0
- data/{bundler/lib → lib}/bundler/fetcher/downloader.rb +31 -16
- data/{bundler/lib → lib}/bundler/fetcher.rb +8 -47
- data/{bundler/lib → lib}/bundler/injector.rb +3 -3
- data/{bundler/lib → lib}/bundler/inline.rb +44 -4
- data/{bundler/lib → lib}/bundler/installer/parallel_installer.rb +25 -30
- data/{bundler/lib → lib}/bundler/installer.rb +20 -6
- data/{bundler/lib → lib}/bundler/lazy_specification.rb +44 -17
- data/{bundler/lib → lib}/bundler/lockfile_generator.rb +24 -2
- data/{bundler/lib → lib}/bundler/lockfile_parser.rb +43 -5
- data/{bundler/lib → lib}/bundler/man/bundle-add.1 +7 -4
- data/{bundler/lib → lib}/bundler/man/bundle-add.1.ronn +8 -4
- data/{bundler/lib → lib}/bundler/man/bundle-binstubs.1 +1 -1
- data/{bundler/lib → lib}/bundler/man/bundle-cache.1 +2 -2
- data/{bundler/lib → lib}/bundler/man/bundle-cache.1.ronn +2 -2
- data/{bundler/lib → lib}/bundler/man/bundle-check.1 +1 -1
- data/{bundler/lib → lib}/bundler/man/bundle-clean.1 +1 -1
- data/{bundler/lib → lib}/bundler/man/bundle-config.1 +38 -6
- data/{bundler/lib → lib}/bundler/man/bundle-config.1.ronn +143 -10
- data/{bundler/lib → lib}/bundler/man/bundle-console.1 +1 -1
- data/{bundler/lib → lib}/bundler/man/bundle-doctor.1 +1 -1
- data/{bundler/lib → lib}/bundler/man/bundle-env.1 +1 -1
- data/{bundler/lib → lib}/bundler/man/bundle-exec.1 +1 -1
- data/{bundler/lib → lib}/bundler/man/bundle-fund.1 +1 -1
- data/{bundler/lib → lib}/bundler/man/bundle-gem.1 +1 -1
- data/{bundler/lib → lib}/bundler/man/bundle-help.1 +1 -1
- data/{bundler/lib → lib}/bundler/man/bundle-info.1 +1 -1
- data/{bundler/lib → lib}/bundler/man/bundle-init.1 +1 -1
- data/{bundler/lib → lib}/bundler/man/bundle-install.1 +2 -2
- data/{bundler/lib → lib}/bundler/man/bundle-install.1.ronn +4 -4
- data/{bundler/lib → lib}/bundler/man/bundle-issue.1 +1 -1
- data/{bundler/lib → lib}/bundler/man/bundle-licenses.1 +1 -1
- data/{bundler/lib → lib}/bundler/man/bundle-list.1 +1 -1
- data/{bundler/lib → lib}/bundler/man/bundle-lock.1 +3 -3
- data/{bundler/lib → lib}/bundler/man/bundle-lock.1.ronn +5 -5
- data/{bundler/lib → lib}/bundler/man/bundle-open.1 +1 -1
- data/{bundler/lib → lib}/bundler/man/bundle-outdated.1 +1 -1
- data/{bundler/lib → lib}/bundler/man/bundle-platform.1 +1 -1
- data/{bundler/lib → lib}/bundler/man/bundle-plugin.1 +1 -1
- data/{bundler/lib → lib}/bundler/man/bundle-pristine.1 +1 -1
- data/{bundler/lib → lib}/bundler/man/bundle-remove.1 +1 -1
- data/{bundler/lib → lib}/bundler/man/bundle-show.1 +1 -1
- data/{bundler/lib → lib}/bundler/man/bundle-update.1 +3 -3
- data/{bundler/lib → lib}/bundler/man/bundle-update.1.ronn +3 -5
- data/{bundler/lib → lib}/bundler/man/bundle-version.1 +1 -1
- data/{bundler/lib → lib}/bundler/man/bundle.1 +1 -1
- data/{bundler/lib → lib}/bundler/man/gemfile.5 +45 -1
- data/{bundler/lib → lib}/bundler/man/gemfile.5.ronn +53 -0
- data/lib/bundler/match_metadata.rb +50 -0
- data/{bundler/lib → lib}/bundler/match_platform.rb +25 -2
- data/lib/bundler/match_remote_metadata.rb +44 -0
- data/{bundler/lib → lib}/bundler/materialization.rb +2 -1
- data/lib/bundler/override.rb +69 -0
- data/{bundler/lib → lib}/bundler/plugin/dsl.rb +3 -5
- data/{bundler/lib → lib}/bundler/plugin/events.rb +55 -13
- data/{bundler/lib → lib}/bundler/plugin/index.rb +87 -11
- data/{bundler/lib → lib}/bundler/plugin/installer/path.rb +1 -1
- data/{bundler/lib → lib}/bundler/plugin/installer.rb +13 -5
- data/{bundler/lib → lib}/bundler/plugin.rb +58 -30
- data/{bundler/lib → lib}/bundler/remote_specification.rb +6 -3
- data/{bundler/lib → lib}/bundler/resolver/base.rb +2 -1
- data/{bundler/lib → lib}/bundler/resolver/incompatibility.rb +1 -1
- data/{bundler/lib → lib}/bundler/resolver.rb +73 -23
- data/{bundler/lib → lib}/bundler/ruby_version.rb +0 -2
- data/{bundler/lib → lib}/bundler/rubygems_ext.rb +71 -1
- data/{bundler/lib → lib}/bundler/rubygems_gem_installer.rb +41 -2
- data/{bundler/lib → lib}/bundler/rubygems_integration.rb +7 -2
- data/{bundler/lib → lib}/bundler/runtime.rb +69 -2
- data/{bundler/lib → lib}/bundler/self_manager.rb +9 -15
- data/{bundler/lib → lib}/bundler/settings.rb +373 -30
- data/{bundler/lib → lib}/bundler/shared_helpers.rb +2 -1
- data/{bundler/lib → lib}/bundler/source/git/git_proxy.rb +2 -10
- data/{bundler/lib → lib}/bundler/source/git.rb +15 -6
- data/{bundler/lib → lib}/bundler/source/path/installer.rb +1 -1
- data/{bundler/lib → lib}/bundler/source/rubygems/remote.rb +10 -5
- data/{bundler/lib → lib}/bundler/source/rubygems.rb +48 -12
- data/{bundler/lib → lib}/bundler/spec_set.rb +16 -4
- data/{bundler/lib → lib}/bundler/stub_specification.rb +2 -1
- data/{bundler/lib → lib}/bundler/templates/newgem/Gemfile.tt +4 -4
- data/{bundler/lib → lib}/bundler/templates/newgem/newgem.gemspec.tt +3 -3
- data/{bundler/lib → lib}/bundler/templates/newgem/spec/newgem_spec.rb.tt +1 -1
- data/{bundler/lib → lib}/bundler/templates/newgem/test/minitest/test_newgem.rb.tt +1 -1
- data/{bundler/lib → lib}/bundler/ui/shell.rb +0 -4
- data/{bundler/lib → lib}/bundler/ui/silent.rb +0 -4
- data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/actions/inject_into_file.rb +35 -2
- data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/base.rb +2 -1
- data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/shell/basic.rb +14 -6
- data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/shell/color.rb +2 -0
- data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/version.rb +1 -1
- data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor.rb +34 -1
- data/lib/bundler/vendored_pub_grub.rb +7 -0
- data/lib/bundler/vendored_securerandom.rb +15 -0
- data/lib/bundler/vendored_uri.rb +21 -0
- data/{bundler/lib → lib}/bundler/version.rb +1 -1
- data/{bundler/lib → lib}/bundler/worker.rb +3 -2
- data/{bundler/lib → lib}/bundler.rb +1 -1
- data/lib/rubygems/basic_specification.rb +15 -14
- data/lib/rubygems/bundler_settings.rb +137 -0
- data/lib/rubygems/bundler_version_finder.rb +13 -55
- data/lib/rubygems/ci_detector.rb +1 -1
- data/lib/rubygems/commands/build_command.rb +8 -1
- data/lib/rubygems/commands/cert_command.rb +9 -7
- data/lib/rubygems/commands/contents_command.rb +1 -1
- data/lib/rubygems/commands/dependency_command.rb +15 -3
- data/lib/rubygems/commands/environment_command.rb +1 -0
- data/lib/rubygems/commands/exec_command.rb +3 -0
- data/lib/rubygems/commands/fetch_command.rb +1 -1
- data/lib/rubygems/commands/help_command.rb +3 -1
- data/lib/rubygems/commands/install_command.rb +13 -3
- data/lib/rubygems/commands/lock_command.rb +2 -2
- data/lib/rubygems/commands/outdated_command.rb +77 -2
- data/lib/rubygems/commands/owner_command.rb +1 -1
- data/lib/rubygems/commands/push_command.rb +159 -21
- data/lib/rubygems/commands/setup_command.rb +20 -23
- data/lib/rubygems/commands/signin_command.rb +3 -1
- data/lib/rubygems/commands/signout_command.rb +26 -6
- data/lib/rubygems/commands/specification_command.rb +1 -1
- data/lib/rubygems/commands/uninstall_command.rb +1 -1
- data/lib/rubygems/commands/update_command.rb +84 -2
- data/lib/rubygems/commands/yank_command.rb +10 -7
- data/lib/rubygems/compact_index_client/cache.rb +122 -0
- data/lib/rubygems/compact_index_client/cache_file.rb +147 -0
- data/lib/rubygems/compact_index_client/http_fetcher.rb +88 -0
- data/lib/rubygems/compact_index_client/parser.rb +90 -0
- data/lib/rubygems/compact_index_client/updater.rb +113 -0
- data/lib/rubygems/compact_index_client.rb +111 -0
- data/lib/rubygems/config_file.rb +304 -22
- data/lib/rubygems/content_address.rb +194 -0
- data/lib/rubygems/cooldown.rb +173 -0
- data/lib/rubygems/cooldown_option.rb +27 -0
- data/lib/rubygems/cooldown_settings.rb +57 -0
- data/lib/rubygems/credential_store/native/linux.rb +97 -0
- data/lib/rubygems/credential_store/native/macos.rb +88 -0
- data/lib/rubygems/credential_store/native/windows.rb +130 -0
- data/lib/rubygems/credential_store.rb +332 -0
- data/lib/rubygems/defaults.rb +9 -0
- data/lib/rubygems/dependency_installer.rb +15 -0
- data/lib/rubygems/doctor.rb +23 -6
- data/lib/rubygems/exceptions.rb +11 -43
- data/lib/rubygems/ext/builder.rb +70 -5
- data/lib/rubygems/ext/cargo_builder.rb +0 -9
- data/lib/rubygems/ext/ext_conf_builder.rb +8 -15
- data/lib/rubygems/gemcutter_utilities.rb +44 -2
- data/lib/rubygems/install_update_options.rb +16 -0
- data/lib/rubygems/installer.rb +90 -11
- data/lib/rubygems/installer_uninstaller_utils.rb +24 -3
- data/lib/rubygems/name_tuple.rb +55 -18
- data/lib/rubygems/package/old.rb +1 -1
- data/lib/rubygems/package.rb +200 -47
- data/lib/rubygems/package_task.rb +2 -2
- data/lib/rubygems/platform.rb +2 -2
- data/lib/rubygems/query_utils.rb +84 -24
- data/lib/rubygems/remote_fetcher.rb +65 -17
- data/lib/rubygems/request/connection_pools.rb +3 -0
- data/lib/rubygems/request_set/gem_dependency_api.rb +1 -1
- data/lib/rubygems/request_set/lockfile.rb +0 -2
- data/lib/rubygems/request_set.rb +105 -17
- data/lib/rubygems/resolver/api_set.rb +14 -26
- data/lib/rubygems/resolver/api_specification.rb +56 -15
- data/lib/rubygems/resolver/incompatibility.rb +10 -0
- data/lib/rubygems/resolver/index_specification.rb +6 -4
- data/lib/rubygems/resolver/installer_set.rb +2 -2
- data/lib/rubygems/resolver/lock_specification.rb +5 -1
- data/lib/rubygems/resolver/spec_specification.rb +4 -0
- data/lib/rubygems/resolver/specification.rb +16 -1
- data/lib/rubygems/resolver/strategy.rb +44 -0
- data/lib/rubygems/resolver.rb +471 -145
- data/lib/rubygems/safe_marshal.rb +2 -1
- data/lib/rubygems/safe_yaml.rb +20 -3
- data/lib/rubygems/security/policy.rb +11 -3
- data/lib/rubygems/security/signer.rb +15 -7
- data/lib/rubygems/security.rb +111 -17
- data/lib/rubygems/source/local.rb +7 -2
- data/lib/rubygems/source.rb +270 -23
- data/lib/rubygems/spec_fetcher.rb +47 -12
- data/lib/rubygems/specification.rb +76 -32
- data/lib/rubygems/specification_policy.rb +33 -6
- data/lib/rubygems/specification_record.rb +41 -2
- data/lib/rubygems/stub_specification.rb +39 -16
- data/lib/rubygems/uninstaller.rb +2 -0
- data/lib/rubygems/util/atomic_file_writer.rb +109 -0
- data/lib/rubygems/vendor/net-http/lib/net/http/exceptions.rb +2 -1
- data/lib/rubygems/vendor/net-http/lib/net/http/generic_request.rb +5 -6
- data/lib/rubygems/vendor/net-http/lib/net/http/header.rb +8 -4
- data/lib/rubygems/vendor/net-http/lib/net/http/requests.rb +15 -1
- data/lib/rubygems/vendor/net-http/lib/net/http/response.rb +2 -1
- data/lib/rubygems/vendor/net-http/lib/net/http/responses.rb +68 -0
- data/lib/rubygems/vendor/net-http/lib/net/http.rb +60 -49
- data/lib/rubygems/vendor/optparse/lib/optparse.rb +23 -30
- data/{bundler/lib/bundler → lib/rubygems}/vendor/pub_grub/lib/pub_grub/assignment.rb +1 -1
- data/{bundler/lib/bundler → lib/rubygems}/vendor/pub_grub/lib/pub_grub/basic_package_source.rb +7 -7
- data/{bundler/lib/bundler → lib/rubygems}/vendor/pub_grub/lib/pub_grub/failure_writer.rb +1 -1
- data/{bundler/lib/bundler → lib/rubygems}/vendor/pub_grub/lib/pub_grub/incompatibility.rb +4 -4
- data/{bundler/lib/bundler → lib/rubygems}/vendor/pub_grub/lib/pub_grub/package.rb +1 -1
- data/{bundler/lib/bundler → lib/rubygems}/vendor/pub_grub/lib/pub_grub/partial_solution.rb +1 -1
- data/{bundler/lib/bundler → lib/rubygems}/vendor/pub_grub/lib/pub_grub/rubygems.rb +3 -3
- data/{bundler/lib/bundler → lib/rubygems}/vendor/pub_grub/lib/pub_grub/solve_failure.rb +1 -1
- data/{bundler/lib/bundler → lib/rubygems}/vendor/pub_grub/lib/pub_grub/static_package_source.rb +3 -3
- data/{bundler/lib/bundler → lib/rubygems}/vendor/pub_grub/lib/pub_grub/strategy.rb +2 -2
- data/{bundler/lib/bundler → lib/rubygems}/vendor/pub_grub/lib/pub_grub/term.rb +1 -1
- data/{bundler/lib/bundler → lib/rubygems}/vendor/pub_grub/lib/pub_grub/version.rb +1 -1
- data/{bundler/lib/bundler → lib/rubygems}/vendor/pub_grub/lib/pub_grub/version_constraint.rb +3 -3
- data/{bundler/lib/bundler → lib/rubygems}/vendor/pub_grub/lib/pub_grub/version_range.rb +1 -1
- data/{bundler/lib/bundler → lib/rubygems}/vendor/pub_grub/lib/pub_grub/version_solver.rb +2 -2
- data/{bundler/lib/bundler → lib/rubygems}/vendor/pub_grub/lib/pub_grub/version_union.rb +1 -1
- data/lib/rubygems/vendor/pub_grub/lib/pub_grub.rb +57 -0
- data/lib/rubygems/vendor/resolv/lib/resolv.rb +3508 -0
- data/lib/rubygems/vendor/securerandom/lib/securerandom.rb +4 -0
- data/lib/rubygems/vendor/timeout/lib/timeout.rb +190 -77
- data/lib/rubygems/vendor/uri/lib/uri.rb +4 -0
- data/{bundler/lib/bundler → lib/rubygems}/vendored_pub_grub.rb +0 -1
- data/lib/rubygems/version.rb +129 -111
- data/lib/rubygems/version_option.rb +14 -0
- data/lib/rubygems/yaml_serializer.rb +853 -71
- data/lib/rubygems.rb +45 -11
- data/rubygems-update.gemspec +3 -4
- data/setup.rb +1 -0
- metadata +365 -410
- data/bundler/CHANGELOG.md +0 -5784
- data/bundler/LICENSE.md +0 -22
- data/bundler/README.md +0 -58
- data/bundler/bundler.gemspec +0 -46
- data/bundler/lib/bundler/compact_index_client/cache.rb +0 -107
- data/bundler/lib/bundler/compact_index_client/cache_file.rb +0 -148
- data/bundler/lib/bundler/compact_index_client/parser.rb +0 -87
- data/bundler/lib/bundler/compact_index_client/updater.rb +0 -105
- data/bundler/lib/bundler/compact_index_client.rb +0 -92
- data/bundler/lib/bundler/match_metadata.rb +0 -30
- data/bundler/lib/bundler/match_remote_metadata.rb +0 -29
- data/bundler/lib/bundler/vendor/connection_pool/LICENSE +0 -20
- data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool/timed_stack.rb +0 -227
- data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool/version.rb +0 -3
- data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool/wrapper.rb +0 -56
- data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool.rb +0 -230
- data/bundler/lib/bundler/vendor/net-http-persistent/README.rdoc +0 -82
- data/bundler/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/connection.rb +0 -41
- data/bundler/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/pool.rb +0 -65
- data/bundler/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/timed_stack_multi.rb +0 -80
- data/bundler/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb +0 -1153
- data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub.rb +0 -31
- data/bundler/lib/bundler/vendor/securerandom/lib/securerandom.rb +0 -102
- data/bundler/lib/bundler/vendor/uri/COPYING +0 -56
- data/bundler/lib/bundler/vendor/uri/lib/uri/common.rb +0 -922
- data/bundler/lib/bundler/vendor/uri/lib/uri/file.rb +0 -100
- data/bundler/lib/bundler/vendor/uri/lib/uri/ftp.rb +0 -267
- data/bundler/lib/bundler/vendor/uri/lib/uri/generic.rb +0 -1592
- data/bundler/lib/bundler/vendor/uri/lib/uri/http.rb +0 -137
- data/bundler/lib/bundler/vendor/uri/lib/uri/https.rb +0 -23
- data/bundler/lib/bundler/vendor/uri/lib/uri/ldap.rb +0 -261
- data/bundler/lib/bundler/vendor/uri/lib/uri/ldaps.rb +0 -22
- data/bundler/lib/bundler/vendor/uri/lib/uri/mailto.rb +0 -293
- data/bundler/lib/bundler/vendor/uri/lib/uri/rfc2396_parser.rb +0 -547
- data/bundler/lib/bundler/vendor/uri/lib/uri/rfc3986_parser.rb +0 -206
- data/bundler/lib/bundler/vendor/uri/lib/uri/version.rb +0 -6
- data/bundler/lib/bundler/vendor/uri/lib/uri/ws.rb +0 -83
- data/bundler/lib/bundler/vendor/uri/lib/uri/wss.rb +0 -23
- data/bundler/lib/bundler/vendor/uri/lib/uri.rb +0 -104
- data/bundler/lib/bundler/vendored_persistent.rb +0 -11
- data/bundler/lib/bundler/vendored_securerandom.rb +0 -12
- data/bundler/lib/bundler/vendored_uri.rb +0 -21
- data/bundler/lib/bundler/yaml_serializer.rb +0 -98
- data/doc/rubygems/CONTRIBUTING.md +0 -231
- data/doc/rubygems/POLICIES.md +0 -60
- data/lib/rubygems/request_set/lockfile/parser.rb +0 -344
- data/lib/rubygems/request_set/lockfile/tokenizer.rb +0 -122
- data/lib/rubygems/resolver/conflict.rb +0 -146
- data/lib/rubygems/resolver/stats.rb +0 -46
- data/lib/rubygems/util/list.rb +0 -40
- data/lib/rubygems/vendor/molinillo/LICENSE +0 -9
- data/lib/rubygems/vendor/molinillo/lib/molinillo/delegates/resolution_state.rb +0 -57
- data/lib/rubygems/vendor/molinillo/lib/molinillo/delegates/specification_provider.rb +0 -88
- data/lib/rubygems/vendor/molinillo/lib/molinillo/dependency_graph/action.rb +0 -36
- data/lib/rubygems/vendor/molinillo/lib/molinillo/dependency_graph/add_edge_no_circular.rb +0 -66
- data/lib/rubygems/vendor/molinillo/lib/molinillo/dependency_graph/add_vertex.rb +0 -62
- data/lib/rubygems/vendor/molinillo/lib/molinillo/dependency_graph/delete_edge.rb +0 -63
- data/lib/rubygems/vendor/molinillo/lib/molinillo/dependency_graph/detach_vertex_named.rb +0 -61
- data/lib/rubygems/vendor/molinillo/lib/molinillo/dependency_graph/log.rb +0 -126
- data/lib/rubygems/vendor/molinillo/lib/molinillo/dependency_graph/set_payload.rb +0 -46
- data/lib/rubygems/vendor/molinillo/lib/molinillo/dependency_graph/tag.rb +0 -36
- data/lib/rubygems/vendor/molinillo/lib/molinillo/dependency_graph/vertex.rb +0 -164
- data/lib/rubygems/vendor/molinillo/lib/molinillo/dependency_graph.rb +0 -255
- data/lib/rubygems/vendor/molinillo/lib/molinillo/errors.rb +0 -149
- data/lib/rubygems/vendor/molinillo/lib/molinillo/gem_metadata.rb +0 -6
- data/lib/rubygems/vendor/molinillo/lib/molinillo/modules/specification_provider.rb +0 -112
- data/lib/rubygems/vendor/molinillo/lib/molinillo/modules/ui.rb +0 -67
- data/lib/rubygems/vendor/molinillo/lib/molinillo/resolution.rb +0 -839
- data/lib/rubygems/vendor/molinillo/lib/molinillo/resolver.rb +0 -46
- data/lib/rubygems/vendor/molinillo/lib/molinillo/state.rb +0 -58
- data/lib/rubygems/vendor/molinillo/lib/molinillo.rb +0 -11
- data/lib/rubygems/vendored_molinillo.rb +0 -3
- /data/{bundler/exe → exe}/bundle +0 -0
- /data/{bundler/exe → exe}/bundler +0 -0
- /data/{bundler/lib → lib}/bundler/.document +0 -0
- /data/{bundler/lib → lib}/bundler/capistrano.rb +0 -0
- /data/{bundler/lib → lib}/bundler/cli/binstubs.rb +0 -0
- /data/{bundler/lib → lib}/bundler/cli/check.rb +0 -0
- /data/{bundler/lib → lib}/bundler/cli/console.rb +0 -0
- /data/{bundler/lib → lib}/bundler/cli/doctor/diagnose.rb +0 -0
- /data/{bundler/lib → lib}/bundler/cli/doctor/ssl.rb +0 -0
- /data/{bundler/lib → lib}/bundler/cli/doctor.rb +0 -0
- /data/{bundler/lib → lib}/bundler/cli/exec.rb +0 -0
- /data/{bundler/lib → lib}/bundler/cli/fund.rb +0 -0
- /data/{bundler/lib → lib}/bundler/cli/info.rb +0 -0
- /data/{bundler/lib → lib}/bundler/cli/init.rb +0 -0
- /data/{bundler/lib → lib}/bundler/cli/issue.rb +0 -0
- /data/{bundler/lib → lib}/bundler/cli/list.rb +0 -0
- /data/{bundler/lib → lib}/bundler/cli/open.rb +0 -0
- /data/{bundler/lib → lib}/bundler/cli/platform.rb +0 -0
- /data/{bundler/lib → lib}/bundler/cli/plugin.rb +0 -0
- /data/{bundler/lib → lib}/bundler/cli/remove.rb +0 -0
- /data/{bundler/lib → lib}/bundler/cli/show.rb +0 -0
- /data/{bundler/lib → lib}/bundler/constants.rb +0 -0
- /data/{bundler/lib → lib}/bundler/current_ruby.rb +0 -0
- /data/{bundler/lib → lib}/bundler/deployment.rb +0 -0
- /data/{bundler/lib → lib}/bundler/deprecate.rb +0 -0
- /data/{bundler/lib → lib}/bundler/digest.rb +0 -0
- /data/{bundler/lib → lib}/bundler/environment_preserver.rb +0 -0
- /data/{bundler/lib → lib}/bundler/feature_flag.rb +0 -0
- /data/{bundler/lib → lib}/bundler/fetcher/base.rb +0 -0
- /data/{bundler/lib → lib}/bundler/fetcher/dependency.rb +0 -0
- /data/{bundler/lib → lib}/bundler/fetcher/gem_remote_fetcher.rb +0 -0
- /data/{bundler/lib → lib}/bundler/fetcher/index.rb +0 -0
- /data/{bundler/lib → lib}/bundler/force_platform.rb +0 -0
- /data/{bundler/lib → lib}/bundler/friendly_errors.rb +0 -0
- /data/{bundler/lib → lib}/bundler/gem_helper.rb +0 -0
- /data/{bundler/lib → lib}/bundler/gem_tasks.rb +0 -0
- /data/{bundler/lib → lib}/bundler/gem_version_promoter.rb +0 -0
- /data/{bundler/lib → lib}/bundler/index.rb +0 -0
- /data/{bundler/lib → lib}/bundler/installer/gem_installer.rb +0 -0
- /data/{bundler/lib → lib}/bundler/installer/standalone.rb +0 -0
- /data/{bundler/lib → lib}/bundler/man/.document +0 -0
- /data/{bundler/lib → lib}/bundler/man/bundle-binstubs.1.ronn +0 -0
- /data/{bundler/lib → lib}/bundler/man/bundle-check.1.ronn +0 -0
- /data/{bundler/lib → lib}/bundler/man/bundle-clean.1.ronn +0 -0
- /data/{bundler/lib → lib}/bundler/man/bundle-console.1.ronn +0 -0
- /data/{bundler/lib → lib}/bundler/man/bundle-doctor.1.ronn +0 -0
- /data/{bundler/lib → lib}/bundler/man/bundle-env.1.ronn +0 -0
- /data/{bundler/lib → lib}/bundler/man/bundle-exec.1.ronn +0 -0
- /data/{bundler/lib → lib}/bundler/man/bundle-fund.1.ronn +0 -0
- /data/{bundler/lib → lib}/bundler/man/bundle-gem.1.ronn +0 -0
- /data/{bundler/lib → lib}/bundler/man/bundle-help.1.ronn +0 -0
- /data/{bundler/lib → lib}/bundler/man/bundle-info.1.ronn +0 -0
- /data/{bundler/lib → lib}/bundler/man/bundle-init.1.ronn +0 -0
- /data/{bundler/lib → lib}/bundler/man/bundle-issue.1.ronn +0 -0
- /data/{bundler/lib → lib}/bundler/man/bundle-licenses.1.ronn +0 -0
- /data/{bundler/lib → lib}/bundler/man/bundle-list.1.ronn +0 -0
- /data/{bundler/lib → lib}/bundler/man/bundle-open.1.ronn +0 -0
- /data/{bundler/lib → lib}/bundler/man/bundle-outdated.1.ronn +0 -0
- /data/{bundler/lib → lib}/bundler/man/bundle-platform.1.ronn +0 -0
- /data/{bundler/lib → lib}/bundler/man/bundle-plugin.1.ronn +0 -0
- /data/{bundler/lib → lib}/bundler/man/bundle-pristine.1.ronn +0 -0
- /data/{bundler/lib → lib}/bundler/man/bundle-remove.1.ronn +0 -0
- /data/{bundler/lib → lib}/bundler/man/bundle-show.1.ronn +0 -0
- /data/{bundler/lib → lib}/bundler/man/bundle-version.1.ronn +0 -0
- /data/{bundler/lib → lib}/bundler/man/bundle.1.ronn +0 -0
- /data/{bundler/lib → lib}/bundler/man/index.txt +0 -0
- /data/{bundler/lib → lib}/bundler/mirror.rb +0 -0
- /data/{bundler/lib → lib}/bundler/plugin/api/source.rb +0 -0
- /data/{bundler/lib → lib}/bundler/plugin/api.rb +0 -0
- /data/{bundler/lib → lib}/bundler/plugin/installer/git.rb +0 -0
- /data/{bundler/lib → lib}/bundler/plugin/installer/rubygems.rb +0 -0
- /data/{bundler/lib → lib}/bundler/plugin/source_list.rb +0 -0
- /data/{bundler/lib → lib}/bundler/plugin/unloaded_source.rb +0 -0
- /data/{bundler/lib → lib}/bundler/process_lock.rb +0 -0
- /data/{bundler/lib → lib}/bundler/resolver/candidate.rb +0 -0
- /data/{bundler/lib → lib}/bundler/resolver/package.rb +0 -0
- /data/{bundler/lib → lib}/bundler/resolver/root.rb +0 -0
- /data/{bundler/lib → lib}/bundler/resolver/spec_group.rb +0 -0
- /data/{bundler/lib → lib}/bundler/resolver/strategy.rb +0 -0
- /data/{bundler/lib → lib}/bundler/retry.rb +0 -0
- /data/{bundler/lib → lib}/bundler/ruby_dsl.rb +0 -0
- /data/{bundler/lib → lib}/bundler/safe_marshal.rb +0 -0
- /data/{bundler/lib → lib}/bundler/settings/validator.rb +0 -0
- /data/{bundler/lib → lib}/bundler/setup.rb +0 -0
- /data/{bundler/lib → lib}/bundler/source/gemspec.rb +0 -0
- /data/{bundler/lib → lib}/bundler/source/metadata.rb +0 -0
- /data/{bundler/lib → lib}/bundler/source/path.rb +0 -0
- /data/{bundler/lib → lib}/bundler/source/rubygems_aggregate.rb +0 -0
- /data/{bundler/lib → lib}/bundler/source.rb +0 -0
- /data/{bundler/lib → lib}/bundler/source_list.rb +0 -0
- /data/{bundler/lib → lib}/bundler/source_map.rb +0 -0
- /data/{bundler/lib → lib}/bundler/templates/.document +0 -0
- /data/{bundler/lib → lib}/bundler/templates/Executable +0 -0
- /data/{bundler/lib → lib}/bundler/templates/Executable.standalone +0 -0
- /data/{bundler/lib → lib}/bundler/templates/Gemfile +0 -0
- /data/{bundler/lib → lib}/bundler/templates/newgem/CHANGELOG.md.tt +0 -0
- /data/{bundler/lib → lib}/bundler/templates/newgem/CODE_OF_CONDUCT.md.tt +0 -0
- /data/{bundler/lib → lib}/bundler/templates/newgem/Cargo.toml.tt +0 -0
- /data/{bundler/lib → lib}/bundler/templates/newgem/LICENSE.txt.tt +0 -0
- /data/{bundler/lib → lib}/bundler/templates/newgem/README.md.tt +0 -0
- /data/{bundler/lib → lib}/bundler/templates/newgem/Rakefile.tt +0 -0
- /data/{bundler/lib → lib}/bundler/templates/newgem/bin/console.tt +0 -0
- /data/{bundler/lib → lib}/bundler/templates/newgem/bin/setup.tt +0 -0
- /data/{bundler/lib → lib}/bundler/templates/newgem/circleci/config.yml.tt +0 -0
- /data/{bundler/lib → lib}/bundler/templates/newgem/exe/newgem.tt +0 -0
- /data/{bundler/lib → lib}/bundler/templates/newgem/ext/newgem/Cargo.toml.tt +0 -0
- /data/{bundler/lib → lib}/bundler/templates/newgem/ext/newgem/build.rs.tt +0 -0
- /data/{bundler/lib → lib}/bundler/templates/newgem/ext/newgem/extconf-c.rb.tt +0 -0
- /data/{bundler/lib → lib}/bundler/templates/newgem/ext/newgem/extconf-go.rb.tt +0 -0
- /data/{bundler/lib → lib}/bundler/templates/newgem/ext/newgem/extconf-rust.rb.tt +0 -0
- /data/{bundler/lib → lib}/bundler/templates/newgem/ext/newgem/go.mod.tt +0 -0
- /data/{bundler/lib → lib}/bundler/templates/newgem/ext/newgem/newgem-go.c.tt +0 -0
- /data/{bundler/lib → lib}/bundler/templates/newgem/ext/newgem/newgem.c.tt +0 -0
- /data/{bundler/lib → lib}/bundler/templates/newgem/ext/newgem/newgem.go.tt +0 -0
- /data/{bundler/lib → lib}/bundler/templates/newgem/ext/newgem/newgem.h.tt +0 -0
- /data/{bundler/lib → lib}/bundler/templates/newgem/ext/newgem/src/lib.rs.tt +0 -0
- /data/{bundler/lib → lib}/bundler/templates/newgem/github/workflows/build-gems.yml.tt +0 -0
- /data/{bundler/lib → lib}/bundler/templates/newgem/github/workflows/main.yml.tt +0 -0
- /data/{bundler/lib → lib}/bundler/templates/newgem/gitignore.tt +0 -0
- /data/{bundler/lib → lib}/bundler/templates/newgem/gitlab-ci.yml.tt +0 -0
- /data/{bundler/lib → lib}/bundler/templates/newgem/lib/newgem/version.rb.tt +0 -0
- /data/{bundler/lib → lib}/bundler/templates/newgem/lib/newgem.rb.tt +0 -0
- /data/{bundler/lib → lib}/bundler/templates/newgem/rspec.tt +0 -0
- /data/{bundler/lib → lib}/bundler/templates/newgem/rubocop.yml.tt +0 -0
- /data/{bundler/lib → lib}/bundler/templates/newgem/sig/newgem.rbs.tt +0 -0
- /data/{bundler/lib → lib}/bundler/templates/newgem/spec/spec_helper.rb.tt +0 -0
- /data/{bundler/lib → lib}/bundler/templates/newgem/standard.yml.tt +0 -0
- /data/{bundler/lib → lib}/bundler/templates/newgem/test/minitest/test_helper.rb.tt +0 -0
- /data/{bundler/lib → lib}/bundler/templates/newgem/test/test-unit/newgem_test.rb.tt +0 -0
- /data/{bundler/lib → lib}/bundler/templates/newgem/test/test-unit/test_helper.rb.tt +0 -0
- /data/{bundler/lib → lib}/bundler/ui/rg_proxy.rb +0 -0
- /data/{bundler/lib → lib}/bundler/ui.rb +0 -0
- /data/{bundler/lib → lib}/bundler/uri_credentials_filter.rb +0 -0
- /data/{bundler/lib → lib}/bundler/uri_normalizer.rb +0 -0
- /data/{bundler/lib → lib}/bundler/vendor/.document +0 -0
- /data/{bundler/lib → lib}/bundler/vendor/fileutils/COPYING +0 -0
- /data/{bundler/lib → lib}/bundler/vendor/fileutils/lib/fileutils.rb +0 -0
- /data/{bundler/lib → lib}/bundler/vendor/thor/LICENSE.md +0 -0
- /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/actions/create_file.rb +0 -0
- /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/actions/create_link.rb +0 -0
- /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/actions/directory.rb +0 -0
- /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/actions/empty_directory.rb +0 -0
- /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/actions/file_manipulation.rb +0 -0
- /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/actions.rb +0 -0
- /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/command.rb +0 -0
- /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/core_ext/hash_with_indifferent_access.rb +0 -0
- /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/error.rb +0 -0
- /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/group.rb +0 -0
- /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/invocation.rb +0 -0
- /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/line_editor/basic.rb +0 -0
- /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/line_editor/readline.rb +0 -0
- /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/line_editor.rb +0 -0
- /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/nested_context.rb +0 -0
- /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/parser/argument.rb +0 -0
- /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/parser/arguments.rb +0 -0
- /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/parser/option.rb +0 -0
- /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/parser/options.rb +0 -0
- /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/parser.rb +0 -0
- /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/rake_compat.rb +0 -0
- /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/runner.rb +0 -0
- /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/shell/column_printer.rb +0 -0
- /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/shell/html.rb +0 -0
- /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/shell/table_printer.rb +0 -0
- /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/shell/terminal.rb +0 -0
- /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/shell/wrapped_printer.rb +0 -0
- /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/shell.rb +0 -0
- /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/util.rb +0 -0
- /data/{bundler/lib → lib}/bundler/vendored_fileutils.rb +0 -0
- /data/{bundler/lib → lib}/bundler/vendored_net_http.rb +0 -0
- /data/{bundler/lib → lib}/bundler/vendored_thor.rb +0 -0
- /data/{bundler/lib → lib}/bundler/vendored_timeout.rb +0 -0
- /data/{bundler/lib → lib}/bundler/vendored_tsort.rb +0 -0
- /data/{bundler/lib → lib}/bundler/vlad.rb +0 -0
- /data/{bundler/lib/bundler → lib/rubygems}/vendor/pub_grub/LICENSE.txt +0 -0
- /data/{bundler/lib/bundler/vendor/securerandom → lib/rubygems/vendor/resolv}/COPYING +0 -0
|
@@ -0,0 +1,332 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# Skip reloading when an identical copy (e.g. the one shipped inside the Bundler
|
|
4
|
+
# gem) was already required from a different path, to avoid redefinition warnings.
|
|
5
|
+
return if defined?(Gem::CredentialStore::SERVICE_NAME)
|
|
6
|
+
|
|
7
|
+
##
|
|
8
|
+
# Gem::CredentialStore is opt-in storage for authentication secrets (API
|
|
9
|
+
# keys, host credentials) in the operating system's native secret store
|
|
10
|
+
# instead of a plain text file:
|
|
11
|
+
#
|
|
12
|
+
# * macOS: Keychain, via the +security+ command line tool.
|
|
13
|
+
# * Linux: the Secret Service API (GNOME Keyring, KWallet, ...), via
|
|
14
|
+
# +secret-tool+.
|
|
15
|
+
# * Windows: Credential Manager, via the +Windows.Security.Credentials.PasswordVault+
|
|
16
|
+
# API from PowerShell.
|
|
17
|
+
#
|
|
18
|
+
# A third party can add another backend (1Password, pass, HashiCorp Vault,
|
|
19
|
+
# ...) by shipping a gem that provides
|
|
20
|
+
# <tt>rubygems/credential_store/backends/<name></tt> and calls
|
|
21
|
+
# .register_backend from it. Users then select it by name instead of +true+
|
|
22
|
+
# (see .resolve_backend).
|
|
23
|
+
#
|
|
24
|
+
# Every public method traps all errors and returns +nil+/+false+ instead of
|
|
25
|
+
# raising, so that callers can transparently fall back to their existing
|
|
26
|
+
# file-based storage when the native store is unavailable or fails (a
|
|
27
|
+
# locked keychain over SSH, a headless Linux session without a keyring
|
|
28
|
+
# daemon, ...).
|
|
29
|
+
|
|
30
|
+
class Gem::CredentialStore
|
|
31
|
+
SERVICE_NAME = "rubygems"
|
|
32
|
+
|
|
33
|
+
##
|
|
34
|
+
# Returns the store to use for +spec+, or +nil+ when the credential store
|
|
35
|
+
# is off. +spec+ is either +true+ (use this platform's native backend) or
|
|
36
|
+
# the name of a registered backend such as "1password". +service+ names
|
|
37
|
+
# the account namespace within the backend, so RubyGems and Bundler keep
|
|
38
|
+
# separate credentials in one native store. The store is memoized per
|
|
39
|
+
# +spec+ and +service+ for the life of the process, so the read cache and
|
|
40
|
+
# any expensive backend startup are shared across callers. A test may
|
|
41
|
+
# install a stand-in via #instance= that is returned here for any enabled
|
|
42
|
+
# +spec+, or inject a shared backend via #backend=.
|
|
43
|
+
|
|
44
|
+
def self.for(spec, service: SERVICE_NAME)
|
|
45
|
+
return nil unless spec
|
|
46
|
+
return @override if defined?(@override) && @override
|
|
47
|
+
|
|
48
|
+
backend = defined?(@override_backend) && @override_backend ? @override_backend : backend_for(spec)
|
|
49
|
+
(@instances ||= {})[[spec, service]] ||= new(backend: backend, service: service)
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
##
|
|
53
|
+
# The default-backed store for this platform, i.e. <tt>for(true)</tt>.
|
|
54
|
+
# Kept for callers and tests that only care about the native backend.
|
|
55
|
+
|
|
56
|
+
def self.instance
|
|
57
|
+
self.for(true)
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
##
|
|
61
|
+
# Installs a stand-in store that .for returns for any enabled setting.
|
|
62
|
+
# Intended for tests that inject a fake backend.
|
|
63
|
+
|
|
64
|
+
def self.instance=(store)
|
|
65
|
+
@override = store
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
##
|
|
69
|
+
# Installs a shared backend that .for wraps for every spec and service.
|
|
70
|
+
# Intended for tests that need RubyGems and Bundler credentials to land in
|
|
71
|
+
# one backend under their own service names.
|
|
72
|
+
|
|
73
|
+
def self.backend=(backend)
|
|
74
|
+
@override_backend = backend
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
##
|
|
78
|
+
# Clears the memoized stores, the injected overrides, and the warned
|
|
79
|
+
# messages. Intended for tests only.
|
|
80
|
+
|
|
81
|
+
def self.reset!
|
|
82
|
+
@override = nil
|
|
83
|
+
@override_backend = nil
|
|
84
|
+
@instances = nil
|
|
85
|
+
@warned = nil
|
|
86
|
+
@warn_handler = nil
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
##
|
|
90
|
+
# Warns once per distinct message. A single flag for every message would
|
|
91
|
+
# let an early warning about, say, a misspelled backend name suppress the
|
|
92
|
+
# later warning that a secret was written in plain text.
|
|
93
|
+
|
|
94
|
+
def self.warn_once(message)
|
|
95
|
+
@warned ||= {}
|
|
96
|
+
return if @warned.key?(message)
|
|
97
|
+
|
|
98
|
+
@warned[message] = true
|
|
99
|
+
|
|
100
|
+
if defined?(@warn_handler) && @warn_handler
|
|
101
|
+
@warn_handler.call(message)
|
|
102
|
+
else
|
|
103
|
+
Gem.ui.alert_warning message
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
##
|
|
108
|
+
# Sends warnings to +handler+ (anything responding to #call) instead of
|
|
109
|
+
# Gem.ui. Bundler sets this because it replaces Gem.ui with a subclass of
|
|
110
|
+
# Gem::SilentUI, which discards alert_warning entirely, so a credential
|
|
111
|
+
# store failure would otherwise be silent for the whole bundle command.
|
|
112
|
+
|
|
113
|
+
def self.warn_handler=(handler)
|
|
114
|
+
@warn_handler = handler
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
##
|
|
118
|
+
# Registers +backend+ under +name+ so it can be selected with
|
|
119
|
+
# <tt>credential_store = <name></tt>. A third-party backend gem calls this
|
|
120
|
+
# from the file RubyGems loads for that name (see .resolve_backend).
|
|
121
|
+
|
|
122
|
+
def self.register_backend(name, backend)
|
|
123
|
+
(@backends ||= {})[name.to_s] = backend
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
BACKEND_NAME = /\A[a-z0-9_-]+\z/
|
|
127
|
+
|
|
128
|
+
##
|
|
129
|
+
# Resolves a registered backend by +name+, requiring
|
|
130
|
+
# <tt>rubygems/credential_store/backends/<name></tt> on first use so a
|
|
131
|
+
# backend shipped as its own gem loads only when actually selected.
|
|
132
|
+
# Returns +nil+ (warning once) when the name is malformed or no gem
|
|
133
|
+
# provides it, which makes callers fall back to file storage. The fixed
|
|
134
|
+
# require prefix and the restricted name charset keep the setting a piece
|
|
135
|
+
# of data, never a path or a command.
|
|
136
|
+
|
|
137
|
+
def self.resolve_backend(name)
|
|
138
|
+
# The setting can carry bytes Regexp#match? would reject. A name that gets
|
|
139
|
+
# past the match is ASCII only, so the require path it builds stays sound.
|
|
140
|
+
name = name.to_s.b
|
|
141
|
+
unless BACKEND_NAME.match?(name)
|
|
142
|
+
warn_once "Ignoring invalid credential store backend name #{name.inspect}."
|
|
143
|
+
return nil
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
return @backends[name] if @backends&.key?(name)
|
|
147
|
+
|
|
148
|
+
begin
|
|
149
|
+
require "rubygems/credential_store/backends/#{name}"
|
|
150
|
+
rescue LoadError
|
|
151
|
+
warn_once "Credential store backend #{name.inspect} is not installed. " \
|
|
152
|
+
"Install a gem that provides rubygems/credential_store/backends/#{name}, " \
|
|
153
|
+
"or unset the credential_store setting. Falling back to file storage."
|
|
154
|
+
return nil
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
@backends && @backends[name]
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
def self.backend_for(spec)
|
|
161
|
+
spec == true ? default_backend : resolve_backend(spec)
|
|
162
|
+
end
|
|
163
|
+
private_class_method :backend_for
|
|
164
|
+
|
|
165
|
+
def self.default_backend
|
|
166
|
+
if Gem.win_platform?
|
|
167
|
+
require_relative "credential_store/native/windows"
|
|
168
|
+
WindowsBackend
|
|
169
|
+
elsif RUBY_PLATFORM.include?("darwin")
|
|
170
|
+
require_relative "credential_store/native/macos"
|
|
171
|
+
MacOSBackend
|
|
172
|
+
elsif RUBY_PLATFORM.include?("linux")
|
|
173
|
+
require_relative "credential_store/native/linux"
|
|
174
|
+
LinuxBackend if LinuxBackend.available?
|
|
175
|
+
end
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
##
|
|
179
|
+
# +backend+ is only used by tests to inject a fake backend regardless of
|
|
180
|
+
# the platform the test suite happens to run on. +service+ is the account
|
|
181
|
+
# namespace this store reads and writes under.
|
|
182
|
+
|
|
183
|
+
def initialize(backend: self.class.default_backend, service: SERVICE_NAME)
|
|
184
|
+
@backend = backend
|
|
185
|
+
@service = service
|
|
186
|
+
@cache = {}
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
##
|
|
190
|
+
# True if a native credential backend is usable on this platform.
|
|
191
|
+
|
|
192
|
+
def available?
|
|
193
|
+
!@backend.nil?
|
|
194
|
+
end
|
|
195
|
+
|
|
196
|
+
##
|
|
197
|
+
# Returns the secret stored for +account+, or +nil+ if there is none or
|
|
198
|
+
# the backend is unavailable/fails.
|
|
199
|
+
|
|
200
|
+
def get(account)
|
|
201
|
+
return nil unless @backend
|
|
202
|
+
return @cache[account] if @cache.key?(account)
|
|
203
|
+
|
|
204
|
+
@cache[account] = @backend.get(@service, account)
|
|
205
|
+
rescue StandardError => e
|
|
206
|
+
warn_failure(:read, e)
|
|
207
|
+
# Retrying means another subprocess and, on some platforms, another
|
|
208
|
+
# authorization prompt. #read_failed? keeps this apart from an absent one.
|
|
209
|
+
(@failed ||= {})[account] = true
|
|
210
|
+
@cache[account] = nil
|
|
211
|
+
end
|
|
212
|
+
|
|
213
|
+
##
|
|
214
|
+
# True when #get returned +nil+ for +account+ because the backend could not
|
|
215
|
+
# answer, rather than because nothing is stored under it. Callers that would
|
|
216
|
+
# otherwise fall back to a different credential need the difference: a
|
|
217
|
+
# missing entry means "use something else", an unreadable one does not.
|
|
218
|
+
|
|
219
|
+
def read_failed?(account)
|
|
220
|
+
return false unless defined?(@failed) && @failed
|
|
221
|
+
|
|
222
|
+
@failed.key?(account)
|
|
223
|
+
end
|
|
224
|
+
|
|
225
|
+
##
|
|
226
|
+
# Stores +secret+ for +account+. Returns +true+ on success.
|
|
227
|
+
|
|
228
|
+
def set(account, secret)
|
|
229
|
+
return false unless @backend
|
|
230
|
+
|
|
231
|
+
validate_credential(account, secret)
|
|
232
|
+
|
|
233
|
+
if @backend.set(@service, account, secret)
|
|
234
|
+
@cache[account] = secret
|
|
235
|
+
@failed&.delete(account)
|
|
236
|
+
invalidate_list
|
|
237
|
+
true
|
|
238
|
+
else
|
|
239
|
+
false
|
|
240
|
+
end
|
|
241
|
+
rescue StandardError => e
|
|
242
|
+
warn_failure(:write, e)
|
|
243
|
+
false
|
|
244
|
+
end
|
|
245
|
+
|
|
246
|
+
##
|
|
247
|
+
# Removes the secret stored for +account+. Returns +true+ if the entry is
|
|
248
|
+
# gone, whether or not it existed beforehand.
|
|
249
|
+
|
|
250
|
+
def delete(account)
|
|
251
|
+
return false unless @backend
|
|
252
|
+
|
|
253
|
+
result = @backend.delete(@service, account)
|
|
254
|
+
@cache.delete(account)
|
|
255
|
+
@failed&.delete(account)
|
|
256
|
+
invalidate_list
|
|
257
|
+
result
|
|
258
|
+
rescue StandardError => e
|
|
259
|
+
warn_failure(:remove, e)
|
|
260
|
+
false
|
|
261
|
+
end
|
|
262
|
+
|
|
263
|
+
##
|
|
264
|
+
# The accounts this store holds, or +nil+ when the backend cannot
|
|
265
|
+
# enumerate them. Listing is optional in the backend protocol: the native
|
|
266
|
+
# backends implement it, but a third-party backend that only resolves
|
|
267
|
+
# credentials on demand has nothing to enumerate. Callers must treat +nil+
|
|
268
|
+
# as "unknown", not as "empty". Secrets are never returned.
|
|
269
|
+
|
|
270
|
+
def list
|
|
271
|
+
return nil unless @backend.respond_to?(:list)
|
|
272
|
+
return @list if defined?(@list)
|
|
273
|
+
|
|
274
|
+
@list = @backend.list(@service)
|
|
275
|
+
rescue StandardError => e
|
|
276
|
+
warn_failure(:list, e)
|
|
277
|
+
# Remembered for the same reason #get remembers a failed read.
|
|
278
|
+
@list = nil
|
|
279
|
+
end
|
|
280
|
+
|
|
281
|
+
##
|
|
282
|
+
# Removes every entry this store owns (all accounts under its service).
|
|
283
|
+
# Returns +true+ when the store is now clear. Used by +gem signout+ to end
|
|
284
|
+
# every session at once, mirroring deletion of the whole credentials file.
|
|
285
|
+
|
|
286
|
+
def delete_all
|
|
287
|
+
return false unless @backend
|
|
288
|
+
|
|
289
|
+
result = @backend.delete_all(@service)
|
|
290
|
+
@cache.clear
|
|
291
|
+
@failed = nil
|
|
292
|
+
invalidate_list
|
|
293
|
+
result
|
|
294
|
+
rescue StandardError => e
|
|
295
|
+
warn_failure(:remove, e)
|
|
296
|
+
false
|
|
297
|
+
end
|
|
298
|
+
|
|
299
|
+
private
|
|
300
|
+
|
|
301
|
+
# The listing is memoized, so a write has to drop it.
|
|
302
|
+
def invalidate_list
|
|
303
|
+
remove_instance_variable(:@list) if defined?(@list)
|
|
304
|
+
end
|
|
305
|
+
|
|
306
|
+
# The macOS keychain hands non-printable bytes back as hex through the only
|
|
307
|
+
# read-back its CLI offers. Applied to every backend so the same value is
|
|
308
|
+
# stored, or refused for the same reason, everywhere.
|
|
309
|
+
PRINTABLE_ASCII = /\A[\x20-\x7e]*\z/
|
|
310
|
+
|
|
311
|
+
# What happens after a failure depends on the operation, so the warning has
|
|
312
|
+
# to say the right thing for each.
|
|
313
|
+
OUTCOMES = {
|
|
314
|
+
read: "any copy left in the config file will be used instead",
|
|
315
|
+
write: "falling back to file storage",
|
|
316
|
+
remove: "the credential is still in the store",
|
|
317
|
+
list: "stored credentials will not be listed",
|
|
318
|
+
}.freeze
|
|
319
|
+
|
|
320
|
+
# A newline in an account would start a second command in the macOS batch
|
|
321
|
+
# input. #set turns the raise back into a warning and a false.
|
|
322
|
+
def validate_credential(account, secret)
|
|
323
|
+
raise ArgumentError, "credential secret must be printable ASCII" unless secret.to_s.b.match?(PRINTABLE_ASCII)
|
|
324
|
+
raise ArgumentError, "credential account must not contain a newline" if account.to_s.include?("\n")
|
|
325
|
+
raise ArgumentError, "credential service must not contain a newline" if @service.to_s.include?("\n")
|
|
326
|
+
end
|
|
327
|
+
|
|
328
|
+
def warn_failure(operation, error)
|
|
329
|
+
self.class.warn_once "Credential store #{operation} failed for #{@service}" \
|
|
330
|
+
" (#{error.class}: #{error.message}); #{OUTCOMES[operation]}."
|
|
331
|
+
end
|
|
332
|
+
end
|
data/lib/rubygems/defaults.rb
CHANGED
|
@@ -148,6 +148,15 @@ module Gem
|
|
|
148
148
|
@cache_home ||= ENV["XDG_CACHE_HOME"] || File.join(Gem.user_home, ".cache")
|
|
149
149
|
end
|
|
150
150
|
|
|
151
|
+
##
|
|
152
|
+
# The path to the global gem cache directory.
|
|
153
|
+
# This is used when global_gem_cache is enabled to share .gem files
|
|
154
|
+
# across all Ruby installations.
|
|
155
|
+
|
|
156
|
+
def self.global_gem_cache_path
|
|
157
|
+
File.join(cache_home, "gem", "gems")
|
|
158
|
+
end
|
|
159
|
+
|
|
151
160
|
##
|
|
152
161
|
# The path to standard location of the user's data directory.
|
|
153
162
|
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
require_relative "../rubygems"
|
|
4
|
+
require_relative "cooldown"
|
|
4
5
|
require_relative "dependency_list"
|
|
5
6
|
require_relative "package"
|
|
6
7
|
require_relative "installer"
|
|
@@ -43,6 +44,12 @@ class Gem::DependencyInstaller
|
|
|
43
44
|
|
|
44
45
|
attr_reader :installed_gems
|
|
45
46
|
|
|
47
|
+
##
|
|
48
|
+
# Per-gem summary entries for the newest versions the cooldown kept out
|
|
49
|
+
# of the last resolution. See Gem::Cooldown.output_skipped_summary.
|
|
50
|
+
|
|
51
|
+
attr_reader :cooldown_skipped
|
|
52
|
+
|
|
46
53
|
##
|
|
47
54
|
# Creates a new installer instance.
|
|
48
55
|
#
|
|
@@ -88,6 +95,10 @@ class Gem::DependencyInstaller
|
|
|
88
95
|
@dir_mode = options[:dir_mode]
|
|
89
96
|
@data_mode = options[:data_mode]
|
|
90
97
|
@prog_mode = options[:prog_mode]
|
|
98
|
+
@build_extension = options[:build_extension]
|
|
99
|
+
@install_plugin = options[:install_plugin]
|
|
100
|
+
@cooldown = Gem::Cooldown.from_options options
|
|
101
|
+
@cooldown_skipped = []
|
|
91
102
|
|
|
92
103
|
# Indicates that we should not try to update any deps unless
|
|
93
104
|
# we absolutely must.
|
|
@@ -169,6 +180,8 @@ class Gem::DependencyInstaller
|
|
|
169
180
|
dir_mode: @dir_mode,
|
|
170
181
|
data_mode: @data_mode,
|
|
171
182
|
prog_mode: @prog_mode,
|
|
183
|
+
build_extension: @build_extension,
|
|
184
|
+
install_plugin: @install_plugin,
|
|
172
185
|
}
|
|
173
186
|
options[:install_dir] = @install_dir if @only_install_dir
|
|
174
187
|
|
|
@@ -206,6 +219,7 @@ class Gem::DependencyInstaller
|
|
|
206
219
|
request_set.development_shallow = @dev_shallow
|
|
207
220
|
request_set.soft_missing = @force
|
|
208
221
|
request_set.prerelease = @prerelease
|
|
222
|
+
request_set.cooldown = @cooldown
|
|
209
223
|
|
|
210
224
|
installer_set = Gem::Resolver::InstallerSet.new @domain
|
|
211
225
|
installer_set.ignore_installed = (@minimal_deps == false) || @only_install_dir
|
|
@@ -254,6 +268,7 @@ class Gem::DependencyInstaller
|
|
|
254
268
|
request_set.resolve installer_set
|
|
255
269
|
|
|
256
270
|
@errors.concat request_set.errors
|
|
271
|
+
@cooldown_skipped = request_set.resolver&.cooldown_skipped || []
|
|
257
272
|
|
|
258
273
|
request_set
|
|
259
274
|
end
|
data/lib/rubygems/doctor.rb
CHANGED
|
@@ -21,7 +21,7 @@ class Gem::Doctor
|
|
|
21
21
|
|
|
22
22
|
REPOSITORY_EXTENSION_MAP = [ # :nodoc:
|
|
23
23
|
["specifications", ".gemspec"],
|
|
24
|
-
["build_info", ".info"],
|
|
24
|
+
["build_info", ".info", ".mkmf.log", ".gem_make.out"],
|
|
25
25
|
["cache", ".gem"],
|
|
26
26
|
["doc", ""],
|
|
27
27
|
["extensions", ""],
|
|
@@ -92,15 +92,15 @@ class Gem::Doctor
|
|
|
92
92
|
# Cleans up children of this gem repository
|
|
93
93
|
|
|
94
94
|
def doctor_children # :nodoc:
|
|
95
|
-
REPOSITORY_EXTENSION_MAP.each do |sub_directory,
|
|
96
|
-
doctor_child sub_directory,
|
|
95
|
+
REPOSITORY_EXTENSION_MAP.each do |sub_directory, *extensions|
|
|
96
|
+
doctor_child sub_directory, *extensions
|
|
97
97
|
end
|
|
98
98
|
end
|
|
99
99
|
|
|
100
100
|
##
|
|
101
|
-
# Removes files in +sub_directory+ with +
|
|
101
|
+
# Removes files in +sub_directory+ with any of +extensions+
|
|
102
102
|
|
|
103
|
-
def doctor_child(sub_directory,
|
|
103
|
+
def doctor_child(sub_directory, *extensions) # :nodoc:
|
|
104
104
|
directory = File.join(@gem_repository, sub_directory)
|
|
105
105
|
|
|
106
106
|
Dir.entries(directory).sort.each do |ent|
|
|
@@ -109,12 +109,18 @@ class Gem::Doctor
|
|
|
109
109
|
child = File.join(directory, ent)
|
|
110
110
|
next unless File.exist?(child)
|
|
111
111
|
|
|
112
|
-
basename = File.basename(child,
|
|
112
|
+
basename = strip_extension File.basename(child), extensions
|
|
113
113
|
next if installed_specs.include? basename
|
|
114
114
|
next if /^rubygems-\d/.match?(basename)
|
|
115
115
|
next if sub_directory == "specifications" && basename == "default"
|
|
116
116
|
next if sub_directory == "plugins" && Gem.plugin_suffix_regexp =~ basename
|
|
117
117
|
|
|
118
|
+
if sub_directory == "specifications" && File.directory?(child) &&
|
|
119
|
+
Gem::ContentAddress.valid_ruby_abi?(ent)
|
|
120
|
+
doctor_child(File.join(sub_directory, ent), *extensions) if ent == Gem.ruby_abi && !File.symlink?(child)
|
|
121
|
+
next
|
|
122
|
+
end
|
|
123
|
+
|
|
118
124
|
type = File.directory?(child) ? "directory" : "file"
|
|
119
125
|
|
|
120
126
|
action = if @dry_run
|
|
@@ -129,4 +135,15 @@ class Gem::Doctor
|
|
|
129
135
|
rescue Errno::ENOENT
|
|
130
136
|
# ignore
|
|
131
137
|
end
|
|
138
|
+
|
|
139
|
+
##
|
|
140
|
+
# Removes the first of +extensions+ that +name+ ends with
|
|
141
|
+
|
|
142
|
+
def strip_extension(name, extensions) # :nodoc:
|
|
143
|
+
extension = extensions.find do |ext|
|
|
144
|
+
!ext.empty? && name.end_with?(ext)
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
extension ? name.delete_suffix(extension) : name
|
|
148
|
+
end
|
|
132
149
|
end
|
data/lib/rubygems/exceptions.rb
CHANGED
|
@@ -33,22 +33,24 @@ class Gem::DependencyError < Gem::Exception; end
|
|
|
33
33
|
class Gem::DependencyRemovalException < Gem::Exception; end
|
|
34
34
|
|
|
35
35
|
##
|
|
36
|
-
# Raised by Gem::Resolver when
|
|
37
|
-
# toplevel. Indicates which dependencies were incompatible through #conflict
|
|
38
|
-
# and #conflicting_dependencies
|
|
36
|
+
# Raised by Gem::Resolver when dependency resolution fails.
|
|
39
37
|
|
|
40
38
|
class Gem::DependencyResolutionError < Gem::DependencyError
|
|
41
|
-
attr_reader :conflict
|
|
42
|
-
|
|
43
39
|
def initialize(conflict)
|
|
44
|
-
@
|
|
45
|
-
|
|
40
|
+
@explanation = conflict.explanation
|
|
41
|
+
super @explanation
|
|
42
|
+
end
|
|
46
43
|
|
|
47
|
-
|
|
44
|
+
def explanation
|
|
45
|
+
@explanation
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def conflict
|
|
49
|
+
nil
|
|
48
50
|
end
|
|
49
51
|
|
|
50
52
|
def conflicting_dependencies
|
|
51
|
-
|
|
53
|
+
[]
|
|
52
54
|
end
|
|
53
55
|
end
|
|
54
56
|
|
|
@@ -126,40 +128,6 @@ end
|
|
|
126
128
|
|
|
127
129
|
Gem.deprecate_constant :SpecificGemNotFoundException
|
|
128
130
|
|
|
129
|
-
##
|
|
130
|
-
# Raised by Gem::Resolver when dependencies conflict and create the
|
|
131
|
-
# inability to find a valid possible spec for a request.
|
|
132
|
-
|
|
133
|
-
class Gem::ImpossibleDependenciesError < Gem::Exception
|
|
134
|
-
attr_reader :conflicts
|
|
135
|
-
attr_reader :request
|
|
136
|
-
|
|
137
|
-
def initialize(request, conflicts)
|
|
138
|
-
@request = request
|
|
139
|
-
@conflicts = conflicts
|
|
140
|
-
|
|
141
|
-
super build_message
|
|
142
|
-
end
|
|
143
|
-
|
|
144
|
-
def build_message # :nodoc:
|
|
145
|
-
requester = @request.requester
|
|
146
|
-
requester = requester ? requester.spec.full_name : "The user"
|
|
147
|
-
dependency = @request.dependency
|
|
148
|
-
|
|
149
|
-
message = "#{requester} requires #{dependency} but it conflicted:\n".dup
|
|
150
|
-
|
|
151
|
-
@conflicts.each do |_, conflict|
|
|
152
|
-
message << conflict.explanation
|
|
153
|
-
end
|
|
154
|
-
|
|
155
|
-
message
|
|
156
|
-
end
|
|
157
|
-
|
|
158
|
-
def dependency
|
|
159
|
-
@request.dependency
|
|
160
|
-
end
|
|
161
|
-
end
|
|
162
|
-
|
|
163
131
|
class Gem::InstallError < Gem::Exception; end
|
|
164
132
|
|
|
165
133
|
class Gem::RuntimeRequirementNotMetError < Gem::InstallError
|
data/lib/rubygems/ext/builder.rb
CHANGED
|
@@ -220,9 +220,11 @@ ERROR: Failed to build gem native extension.
|
|
|
220
220
|
#{output}
|
|
221
221
|
|
|
222
222
|
Gem files will remain installed in #{@gem_dir} for inspection.
|
|
223
|
-
Results logged to #{gem_make_out}
|
|
224
223
|
EOF
|
|
225
224
|
|
|
225
|
+
# Losing the log must not cost the user the build error itself.
|
|
226
|
+
message += "Results logged to #{gem_make_out}\n" if gem_make_out
|
|
227
|
+
|
|
226
228
|
raise Gem::Ext::BuildError, message, backtrace
|
|
227
229
|
end
|
|
228
230
|
|
|
@@ -243,13 +245,72 @@ EOF
|
|
|
243
245
|
|
|
244
246
|
verbose { results.join("\n") }
|
|
245
247
|
|
|
246
|
-
|
|
248
|
+
# Build logs are noisy, non-reproducible artifacts that are not meant to
|
|
249
|
+
# be installed. Drop the ones this build left behind, plus any written
|
|
250
|
+
# into the extension directory by a RubyGems old enough to put them there.
|
|
251
|
+
FileUtils.rm_f mkmf_log_candidates(extension_dir, dest_path)
|
|
252
|
+
FileUtils.rm_f File.join(dest_path, "gem_make.out")
|
|
253
|
+
FileUtils.rm_f [build_log_path("mkmf.log"), build_log_path("gem_make.out")]
|
|
254
|
+
rescue Gem::Ext::Builder::NoMakefileError => e
|
|
255
|
+
# extconf ran fine but produced no Makefile, so the extension was skipped
|
|
256
|
+
# rather than built and installing carries on. Keep the log that says why
|
|
257
|
+
# it was skipped, out of the installation tree but still reachable.
|
|
258
|
+
results << e.message
|
|
259
|
+
results << "Skipping make for #{extension} as no Makefile was found."
|
|
260
|
+
|
|
261
|
+
verbose { results.join("\n") }
|
|
262
|
+
|
|
263
|
+
preserve_mkmf_log extension_dir, dest_path
|
|
264
|
+
write_gem_make_out results.join("\n")
|
|
247
265
|
rescue StandardError => e
|
|
248
266
|
results << e.message
|
|
267
|
+
|
|
268
|
+
mkmf_log_dest = preserve_mkmf_log(extension_dir, dest_path)
|
|
269
|
+
if mkmf_log_dest
|
|
270
|
+
results << "To see why this extension failed to compile, please check the mkmf.log which can be found here:"
|
|
271
|
+
results << " #{mkmf_log_dest}"
|
|
272
|
+
end
|
|
273
|
+
|
|
249
274
|
build_error(results.join("\n"), $@)
|
|
250
275
|
end
|
|
251
276
|
end
|
|
252
277
|
|
|
278
|
+
##
|
|
279
|
+
# Where a build log of +kind+ for this gem lives in the build_info directory.
|
|
280
|
+
|
|
281
|
+
def build_log_path(kind) # :nodoc:
|
|
282
|
+
File.join @spec.build_info_dir, "#{@spec.full_name}.#{kind}"
|
|
283
|
+
end
|
|
284
|
+
|
|
285
|
+
##
|
|
286
|
+
# Moves the mkmf.log this build left behind into the build_info directory and
|
|
287
|
+
# returns its new path, or nil when there is none or it cannot be kept.
|
|
288
|
+
# Keeping a log must never replace the build error the caller is reporting,
|
|
289
|
+
# so a filesystem failure here is swallowed.
|
|
290
|
+
|
|
291
|
+
def preserve_mkmf_log(extension_dir, dest_path) # :nodoc:
|
|
292
|
+
mkmf_log = mkmf_log_candidates(extension_dir, dest_path).find {|log| File.exist?(log) }
|
|
293
|
+
return unless mkmf_log
|
|
294
|
+
|
|
295
|
+
destination = build_log_path "mkmf.log"
|
|
296
|
+
|
|
297
|
+
FileUtils.mkdir_p @spec.build_info_dir
|
|
298
|
+
FileUtils.mv mkmf_log, destination
|
|
299
|
+
|
|
300
|
+
destination
|
|
301
|
+
rescue SystemCallError
|
|
302
|
+
nil
|
|
303
|
+
end
|
|
304
|
+
|
|
305
|
+
##
|
|
306
|
+
# Places a completed build may have left an mkmf.log, most specific first.
|
|
307
|
+
# Gem::Ext::ExtConfBuilder parks it in +dest_path+ so that the "clean" target
|
|
308
|
+
# cannot delete it; the other builders leave it where extconf ran.
|
|
309
|
+
|
|
310
|
+
def mkmf_log_candidates(extension_dir, dest_path) # :nodoc:
|
|
311
|
+
[File.join(dest_path, "mkmf.log"), File.join(extension_dir, "mkmf.log")]
|
|
312
|
+
end
|
|
313
|
+
|
|
253
314
|
##
|
|
254
315
|
# Builds extensions. Valid types of extensions are extconf.rb files,
|
|
255
316
|
# configure scripts and rakefiles or mkrf_conf files.
|
|
@@ -277,17 +338,21 @@ EOF
|
|
|
277
338
|
end
|
|
278
339
|
|
|
279
340
|
##
|
|
280
|
-
# Writes +output+ to gem_make.out in the
|
|
341
|
+
# Writes +output+ to gem_make.out in the build_info directory and returns its
|
|
342
|
+
# path, or nil when it cannot be written. Only called when the extension was
|
|
343
|
+
# not built, to keep build logs out of the installation tree.
|
|
281
344
|
|
|
282
345
|
def write_gem_make_out(output) # :nodoc:
|
|
283
|
-
destination =
|
|
346
|
+
destination = build_log_path "gem_make.out"
|
|
284
347
|
|
|
285
|
-
FileUtils.mkdir_p @spec.
|
|
348
|
+
FileUtils.mkdir_p @spec.build_info_dir
|
|
286
349
|
|
|
287
350
|
File.open destination, "wb" do |io|
|
|
288
351
|
io.puts output
|
|
289
352
|
end
|
|
290
353
|
|
|
291
354
|
destination
|
|
355
|
+
rescue SystemCallError
|
|
356
|
+
nil
|
|
292
357
|
end
|
|
293
358
|
end
|
|
@@ -269,10 +269,6 @@ EOF
|
|
|
269
269
|
LinkFlagConverter.convert(arg)
|
|
270
270
|
end
|
|
271
271
|
|
|
272
|
-
def msvc_target?
|
|
273
|
-
makefile_config("target_os").include?("msvc")
|
|
274
|
-
end
|
|
275
|
-
|
|
276
272
|
def darwin_target?
|
|
277
273
|
makefile_config("target_os").include?("darwin")
|
|
278
274
|
end
|
|
@@ -281,11 +277,6 @@ EOF
|
|
|
281
277
|
makefile_config("target_os").include?("mingw")
|
|
282
278
|
end
|
|
283
279
|
|
|
284
|
-
def win_target?
|
|
285
|
-
target_platform = RbConfig::CONFIG["target_os"]
|
|
286
|
-
!!Gem::WIN_PATTERNS.find {|r| target_platform =~ r }
|
|
287
|
-
end
|
|
288
|
-
|
|
289
280
|
# Interpolate substitution vars in the arg (i.e. $(DEFFILE))
|
|
290
281
|
def maybe_resolve_ldflag_variable(input_arg, dest_dir, crate_name)
|
|
291
282
|
var_matches = input_arg.match(/\$\((\w+)\)/)
|