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
data/lib/rubygems/resolver.rb
CHANGED
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
|
|
3
3
|
require_relative "dependency"
|
|
4
4
|
require_relative "exceptions"
|
|
5
|
-
require_relative "util/list"
|
|
6
5
|
|
|
7
6
|
##
|
|
8
7
|
# Given a set of Gem::Dependency objects as +needed+ and a way to query the
|
|
@@ -11,7 +10,7 @@ require_relative "util/list"
|
|
|
11
10
|
# all the requirements.
|
|
12
11
|
|
|
13
12
|
class Gem::Resolver
|
|
14
|
-
require_relative "
|
|
13
|
+
require_relative "vendored_pub_grub"
|
|
15
14
|
|
|
16
15
|
##
|
|
17
16
|
# If the DEBUG_RESOLVER environment variable is set then debugging mode is
|
|
@@ -36,9 +35,17 @@ class Gem::Resolver
|
|
|
36
35
|
attr_accessor :ignore_dependencies
|
|
37
36
|
|
|
38
37
|
##
|
|
39
|
-
#
|
|
38
|
+
# The Gem::Cooldown applied to release candidates, if any.
|
|
40
39
|
|
|
41
|
-
|
|
40
|
+
attr_accessor :cooldown
|
|
41
|
+
|
|
42
|
+
##
|
|
43
|
+
# Per-gem summary entries for the newest versions the cooldown kept out
|
|
44
|
+
# of a successful resolution. See Gem::Cooldown.output_skipped_summary.
|
|
45
|
+
|
|
46
|
+
def cooldown_skipped
|
|
47
|
+
@cooldown_skipped || []
|
|
48
|
+
end
|
|
42
49
|
|
|
43
50
|
##
|
|
44
51
|
# Hash of gems to skip resolution. Keyed by gem name, with arrays of
|
|
@@ -100,224 +107,543 @@ class Gem::Resolver
|
|
|
100
107
|
@set = set || Gem::Resolver::IndexSet.new
|
|
101
108
|
@needed = needed
|
|
102
109
|
|
|
110
|
+
@cooldown = nil
|
|
103
111
|
@development = false
|
|
104
112
|
@development_shallow = false
|
|
105
113
|
@ignore_dependencies = false
|
|
106
114
|
@skip_gems = {}
|
|
107
115
|
@soft_missing = false
|
|
108
|
-
@stats = Gem::Resolver::Stats.new
|
|
109
|
-
end
|
|
110
116
|
|
|
111
|
-
|
|
112
|
-
|
|
117
|
+
@root_package = RootPackage.new
|
|
118
|
+
@root_version = Gem::PubGrub::Package.root_version
|
|
119
|
+
|
|
120
|
+
@packages = {}
|
|
113
121
|
|
|
114
|
-
|
|
115
|
-
|
|
122
|
+
@unfiltered_specs = Hash.new {|h, name| h[name] = find_unfiltered_specs_for(name) }
|
|
123
|
+
@all_specs = Hash.new {|h, name| h[name] = filter_specs(@unfiltered_specs[name]) }
|
|
124
|
+
@all_versions = Hash.new {|h, pkg| h[pkg] = @all_specs[pkg.to_s].map(&:version).uniq.sort }
|
|
125
|
+
@sorted_versions = Hash.new do |h, pkg|
|
|
126
|
+
h[pkg] = Gem::PubGrub::Package.root?(pkg) ? [@root_version] : @all_versions[pkg]
|
|
127
|
+
end
|
|
128
|
+
@cached_dependencies = Hash.new do |h, pkg|
|
|
129
|
+
h[pkg] = if Gem::PubGrub::Package.root?(pkg)
|
|
130
|
+
{ @root_version => root_dependencies }
|
|
131
|
+
else
|
|
132
|
+
Hash.new {|v, ver| v[ver] = compute_dependencies(pkg, ver) }
|
|
133
|
+
end
|
|
134
|
+
end
|
|
135
|
+
@version_to_index = Hash.new {|h, pkg| h[pkg] = @sorted_versions[pkg].each_with_index.to_h }
|
|
136
|
+
@versions_for_cache = Hash.new {|h, pkg| h[pkg] = {} }
|
|
137
|
+
@spec_for_cache = Hash.new {|h, name| h[name] = build_spec_for_cache(name) }
|
|
116
138
|
end
|
|
117
139
|
|
|
118
|
-
|
|
119
|
-
|
|
140
|
+
##
|
|
141
|
+
# Proceed with resolution! Returns an array of ActivationRequest objects.
|
|
120
142
|
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
143
|
+
def resolve
|
|
144
|
+
# Pre-check: raise UnsatisfiableDependencyError for root deps with no
|
|
145
|
+
# platform match. We filter by platform ONLY here (not required_ruby_version
|
|
146
|
+
# / required_rubygems_version): a foreign-platform gem is genuinely "not
|
|
147
|
+
# found", but a gem that exists yet is incompatible with the running Ruby
|
|
148
|
+
# should flow through the solver to a DependencyResolutionError that names
|
|
149
|
+
# the Ruby requirement. That matches Bundler (which models Ruby as a
|
|
150
|
+
# synthetic dependency, so this surfaces as a solve failure) and gives a
|
|
151
|
+
# clearer message than the platform-oriented UnsatisfiableDependencyError.
|
|
152
|
+
@needed.each do |dep|
|
|
153
|
+
next if @soft_missing
|
|
154
|
+
dep_request = DependencyRequest.new(dep, nil)
|
|
155
|
+
all = @set.find_all(dep_request)
|
|
156
|
+
matching = select_local_platforms(all)
|
|
157
|
+
|
|
158
|
+
next unless matching.empty?
|
|
159
|
+
|
|
160
|
+
exc = Gem::UnsatisfiableDependencyError.new(dep_request, all)
|
|
161
|
+
exc.errors = @set.errors
|
|
162
|
+
raise exc
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
solver = Gem::PubGrub::VersionSolver.new(
|
|
166
|
+
source: self,
|
|
167
|
+
root: @root_package,
|
|
168
|
+
strategy: Gem::Resolver::Strategy.new(self),
|
|
169
|
+
logger: make_logger
|
|
170
|
+
)
|
|
171
|
+
result = solver.solve
|
|
172
|
+
|
|
173
|
+
# Convert to Array<ActivationRequest>
|
|
174
|
+
needed_by_name = @needed.group_by(&:name)
|
|
175
|
+
requests = result.filter_map do |package, version|
|
|
176
|
+
next if Gem::PubGrub::Package.root?(package)
|
|
177
|
+
spec = spec_for(package.to_s, version)
|
|
178
|
+
dep = needed_by_name[package.to_s]&.first || Gem::Dependency.new(package.to_s)
|
|
179
|
+
dep_request = DependencyRequest.new(dep, nil)
|
|
180
|
+
ActivationRequest.new(spec, dep_request)
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
@cooldown_skipped = cooldown_skipped_summary(requests) if @cooldown&.active?
|
|
184
|
+
|
|
185
|
+
requests
|
|
186
|
+
rescue Gem::PubGrub::SolveFailure => e
|
|
187
|
+
extended = extract_extended_explanation(e.incompatibility)
|
|
188
|
+
if extended
|
|
189
|
+
message = "#{e.explanation}\n\n#{extended}"
|
|
190
|
+
raise Gem::DependencyResolutionError, Struct.new(:explanation).new(message)
|
|
191
|
+
else
|
|
192
|
+
raise Gem::DependencyResolutionError, e
|
|
126
193
|
end
|
|
127
194
|
end
|
|
128
195
|
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
196
|
+
# PubGrub source interface methods
|
|
197
|
+
|
|
198
|
+
def all_versions_for(package)
|
|
199
|
+
versions = @sorted_versions[package].reverse # highest first
|
|
200
|
+
name = package.to_s
|
|
201
|
+
|
|
202
|
+
if (skip_dep_gems = skip_gems[name]) && !skip_dep_gems.empty?
|
|
203
|
+
# Conservative mode: float the already-installed (skip) versions to the
|
|
204
|
+
# front so the solver prefers them. This sets *preference* only (it feeds
|
|
205
|
+
# the strategy's version-index map); it does not restrict availability, so
|
|
206
|
+
# every version stays selectable via versions_for. When an installed
|
|
207
|
+
# version is made impossible by a downstream conflict, the solver
|
|
208
|
+
# backtracks to a newer version instead of failing. Molinillo instead
|
|
209
|
+
# hard-restricted the candidate set to skip versions and raised.
|
|
210
|
+
#
|
|
211
|
+
# This reaches the same outcome as Bundler (upgrade-over-raise) for the
|
|
212
|
+
# common single-blocked-gem case, though the mechanism differs: Bundler
|
|
213
|
+
# hard-pins locked gems and selectively unlocks + re-solves on conflict,
|
|
214
|
+
# whereas we float as a preference and let PubGrub backtrack in one solve.
|
|
215
|
+
# The float can therefore over-upgrade when several installed gems are
|
|
216
|
+
# jointly involved in a conflict; that outcome-level divergence is
|
|
217
|
+
# accepted (see test_conservative_upgrades_when_installed_blocked).
|
|
218
|
+
skip_versions = skip_dep_gems.map(&:version)
|
|
219
|
+
preferred, rest = versions.partition {|v| skip_versions.include?(v) }
|
|
220
|
+
preferred + rest
|
|
221
|
+
else
|
|
222
|
+
# Prefer already-installed versions to avoid unnecessary upgrades
|
|
223
|
+
installed_versions = @all_specs[name].
|
|
224
|
+
select {|s| s.is_a?(Gem::Resolver::InstalledSpecification) }.
|
|
225
|
+
map(&:version)
|
|
226
|
+
if installed_versions.any?
|
|
227
|
+
preferred, rest = versions.partition {|v| installed_versions.include?(v) }
|
|
228
|
+
preferred + rest
|
|
229
|
+
else
|
|
230
|
+
versions
|
|
231
|
+
end
|
|
232
|
+
end
|
|
233
|
+
end
|
|
134
234
|
|
|
135
|
-
def
|
|
136
|
-
|
|
235
|
+
def versions_for(package, range = Gem::PubGrub::VersionRange.any)
|
|
236
|
+
@versions_for_cache[package][range] ||= begin
|
|
237
|
+
candidates = range.select_versions(@sorted_versions[package])
|
|
137
238
|
|
|
138
|
-
|
|
139
|
-
|
|
239
|
+
if Gem::PubGrub::Package.root?(package) ||
|
|
240
|
+
(@set.respond_to?(:prerelease) && @set.prerelease) ||
|
|
241
|
+
range_admits_prerelease?(range)
|
|
242
|
+
candidates
|
|
243
|
+
elsif @all_versions[package].any? {|v| !v.prerelease? }
|
|
244
|
+
candidates.reject(&:prerelease?)
|
|
245
|
+
else
|
|
246
|
+
# Only prereleases exist for this gem; fall back to them so
|
|
247
|
+
# dependencies like `>= 1.0` can still be satisfied.
|
|
248
|
+
candidates
|
|
249
|
+
end
|
|
250
|
+
end
|
|
251
|
+
end
|
|
252
|
+
|
|
253
|
+
def no_versions_incompatibility_for(_package, unsatisfied_term)
|
|
254
|
+
cause = Gem::PubGrub::Incompatibility::NoVersions.new(unsatisfied_term)
|
|
140
255
|
|
|
141
|
-
|
|
142
|
-
|
|
256
|
+
name = unsatisfied_term.package.to_s
|
|
257
|
+
constraint = unsatisfied_term.constraint
|
|
258
|
+
extended_explanation = build_extended_explanation(name, constraint)
|
|
143
259
|
|
|
144
|
-
|
|
260
|
+
custom_explanation = if extended_explanation
|
|
261
|
+
"#{constraint} could not be found in any repository"
|
|
262
|
+
end
|
|
263
|
+
|
|
264
|
+
Gem::Resolver::Incompatibility.new(
|
|
265
|
+
[unsatisfied_term],
|
|
266
|
+
cause: cause,
|
|
267
|
+
custom_explanation: custom_explanation,
|
|
268
|
+
extended_explanation: extended_explanation
|
|
269
|
+
)
|
|
145
270
|
end
|
|
146
271
|
|
|
147
|
-
def
|
|
148
|
-
|
|
272
|
+
def incompatibilities_for(package, version)
|
|
273
|
+
package_deps = @cached_dependencies[package]
|
|
274
|
+
sorted_versions = @sorted_versions[package]
|
|
275
|
+
package_deps[version].filter_map do |dep_package_name, dep_constraint|
|
|
276
|
+
dep_package = dep_constraint.package
|
|
149
277
|
|
|
150
|
-
|
|
278
|
+
low = high = @version_to_index[package][version]
|
|
151
279
|
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
280
|
+
# find version low such that all >= low share the same dep
|
|
281
|
+
while low > 0 &&
|
|
282
|
+
package_deps[sorted_versions[low - 1]][dep_package_name] == dep_constraint
|
|
283
|
+
low -= 1
|
|
284
|
+
end
|
|
285
|
+
low =
|
|
286
|
+
if low == 0
|
|
287
|
+
nil
|
|
288
|
+
else
|
|
289
|
+
sorted_versions[low]
|
|
290
|
+
end
|
|
291
|
+
|
|
292
|
+
# find version high such that all < high share the same dep
|
|
293
|
+
while high < sorted_versions.length &&
|
|
294
|
+
package_deps[sorted_versions[high]][dep_package_name] == dep_constraint
|
|
295
|
+
high += 1
|
|
296
|
+
end
|
|
297
|
+
high =
|
|
298
|
+
if high == sorted_versions.length
|
|
299
|
+
nil
|
|
300
|
+
else
|
|
301
|
+
sorted_versions[high]
|
|
302
|
+
end
|
|
303
|
+
|
|
304
|
+
range = Gem::PubGrub::VersionRange.new(min: low, max: high, include_min: !low.nil?)
|
|
305
|
+
self_constraint = Gem::PubGrub::VersionConstraint.new(package, range: range)
|
|
306
|
+
|
|
307
|
+
# No specs anywhere means an unknown package. Check @unfiltered_specs, not
|
|
308
|
+
# the filtered set, so a dep filtered out by platform/Ruby/prerelease falls
|
|
309
|
+
# through to NoVersions for proper hints instead. The band-scoped
|
|
310
|
+
# self_constraint lets clean sibling versions still resolve via backtracking.
|
|
311
|
+
if @unfiltered_specs[dep_package_name].empty?
|
|
312
|
+
cause = Gem::PubGrub::Incompatibility::InvalidDependency.new(dep_package, dep_constraint)
|
|
313
|
+
self_term = Gem::PubGrub::Term.new(self_constraint, true)
|
|
314
|
+
# PubGrub's default InvalidDependency rendering drops the version
|
|
315
|
+
# requirement ("depends on unknown package bar"). Supply a custom
|
|
316
|
+
# explanation so the missing dependency's constraint is preserved
|
|
317
|
+
# ("depends on bar = 0.5 which could not be found in any repository"),
|
|
318
|
+
# matching Molinillo's diagnostics.
|
|
319
|
+
return [Gem::PubGrub::Incompatibility.new(
|
|
320
|
+
[self_term],
|
|
321
|
+
cause: cause,
|
|
322
|
+
custom_explanation: "#{self_term.to_s(allow_every: true)} depends on #{dep_constraint} which could not be found in any repository"
|
|
323
|
+
)]
|
|
324
|
+
end
|
|
158
325
|
|
|
159
|
-
|
|
160
|
-
|
|
326
|
+
# An empty range means the requirement is self-contradictory (e.g. `> 2, < 1`).
|
|
327
|
+
if dep_constraint.range.empty?
|
|
328
|
+
return [Gem::Resolver::Incompatibility.new(
|
|
329
|
+
[Gem::PubGrub::Term.new(self_constraint, true)],
|
|
330
|
+
cause: Gem::PubGrub::Incompatibility::NoVersions.new(dep_constraint),
|
|
331
|
+
custom_explanation: "#{dep_package_name} cannot satisfy contradictory requirements #{dep_constraint.constraint_string}"
|
|
332
|
+
)]
|
|
333
|
+
end
|
|
334
|
+
|
|
335
|
+
Gem::PubGrub::Incompatibility.new(
|
|
336
|
+
[Gem::PubGrub::Term.new(self_constraint, true), Gem::PubGrub::Term.new(dep_constraint, false)],
|
|
337
|
+
cause: :dependency
|
|
338
|
+
)
|
|
161
339
|
end
|
|
340
|
+
end
|
|
341
|
+
|
|
342
|
+
##
|
|
343
|
+
# Returns the gems in +specs+ that match the local platform.
|
|
162
344
|
|
|
163
|
-
|
|
345
|
+
def select_local_platforms(specs) # :nodoc:
|
|
346
|
+
specs.select do |spec|
|
|
347
|
+
Gem::Platform.installable? spec
|
|
348
|
+
end
|
|
349
|
+
end
|
|
164
350
|
|
|
165
|
-
|
|
351
|
+
private
|
|
166
352
|
|
|
167
|
-
|
|
353
|
+
def package_for(name)
|
|
354
|
+
@packages[name] ||= Gem::PubGrub::Package.new(name)
|
|
168
355
|
end
|
|
169
356
|
|
|
170
|
-
|
|
357
|
+
def root_dependencies
|
|
358
|
+
deps = {}
|
|
359
|
+
@needed.each do |dep|
|
|
360
|
+
constraint = Gem::PubGrub::RubyGems.requirement_to_constraint(package_for(dep.name), dep.requirement)
|
|
361
|
+
deps[dep.name] = deps.key?(dep.name) ? deps[dep.name].intersect(constraint) : constraint
|
|
362
|
+
end
|
|
363
|
+
deps
|
|
364
|
+
end
|
|
171
365
|
|
|
172
|
-
|
|
173
|
-
|
|
366
|
+
# Only the min bound is inspected: `~>` synthesises a max like `X.A`
|
|
367
|
+
# whose suffix looks prerelease to Gem::Version but is not the user's
|
|
368
|
+
# intent, so checking max would mis-admit prereleases for every `~>`.
|
|
369
|
+
def range_admits_prerelease?(range)
|
|
370
|
+
range.ranges.any? do |r|
|
|
371
|
+
next false if r.empty?
|
|
372
|
+
r.min&.prerelease?
|
|
373
|
+
end
|
|
174
374
|
end
|
|
175
375
|
|
|
176
|
-
def
|
|
177
|
-
|
|
376
|
+
def find_unfiltered_specs_for(name)
|
|
377
|
+
dep = Gem::Dependency.new(name, ">= 0.a")
|
|
378
|
+
dep_request = DependencyRequest.new(dep, nil)
|
|
379
|
+
@set.find_all(dep_request)
|
|
178
380
|
end
|
|
179
381
|
|
|
180
|
-
|
|
382
|
+
def filter_specs(specs)
|
|
383
|
+
filtered = select_local_platforms(specs)
|
|
181
384
|
|
|
182
|
-
|
|
183
|
-
|
|
385
|
+
unless @soft_missing
|
|
386
|
+
filtered = filtered.select do |s|
|
|
387
|
+
s.required_ruby_version.satisfied_by?(Gem.ruby_version) &&
|
|
388
|
+
s.required_rubygems_version.satisfied_by?(Gem.rubygems_version)
|
|
389
|
+
rescue StandardError
|
|
390
|
+
true
|
|
391
|
+
end
|
|
392
|
+
end
|
|
184
393
|
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
conflict = e.conflicts.values.first
|
|
189
|
-
raise Gem::DependencyResolutionError, Conflict.new(conflict.requirement_trees.first.first, conflict.existing, conflict.requirement)
|
|
190
|
-
ensure
|
|
191
|
-
@output.close if defined?(@output) && !debug?
|
|
394
|
+
filtered = filter_cooldown_specs(filtered) if @cooldown&.active?
|
|
395
|
+
|
|
396
|
+
filtered
|
|
192
397
|
end
|
|
193
398
|
|
|
194
399
|
##
|
|
195
|
-
#
|
|
196
|
-
#
|
|
400
|
+
# Rejects specs published within the cooldown period. Specs with an
|
|
401
|
+
# unknown publish time (installed gems, lockfiles, sources without
|
|
402
|
+
# timestamps) are kept, so the cooldown fails open.
|
|
403
|
+
|
|
404
|
+
def filter_cooldown_specs(specs)
|
|
405
|
+
remote = specs.select do |s|
|
|
406
|
+
Gem::Resolver::APISpecification === s || Gem::Resolver::IndexSpecification === s
|
|
407
|
+
end
|
|
408
|
+
if remote.any? && remote.none?(&:created_at)
|
|
409
|
+
Gem::Cooldown.warn_missing_created_at remote.first.source
|
|
410
|
+
end
|
|
411
|
+
|
|
412
|
+
specs.reject do |s|
|
|
413
|
+
next false unless @cooldown.skip?(s.created_at)
|
|
197
414
|
|
|
198
|
-
|
|
199
|
-
|
|
415
|
+
(@cooldown_skipped_specs ||= {})[[s.name, s.version]] ||= s
|
|
416
|
+
true
|
|
417
|
+
end
|
|
418
|
+
end
|
|
200
419
|
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
420
|
+
##
|
|
421
|
+
# Reports, per gem, the newest version that the cooldown kept out of a
|
|
422
|
+
# successful resolution. A skipped version is only worth reporting when
|
|
423
|
+
# it is newer than the resolved version and satisfies every requirement
|
|
424
|
+
# the final resolution places on that gem, so we don't claim a version
|
|
425
|
+
# the resolver could never have picked anyway.
|
|
426
|
+
|
|
427
|
+
def cooldown_skipped_summary(requests)
|
|
428
|
+
skipped_specs = @cooldown_skipped_specs || {}
|
|
429
|
+
return [] if skipped_specs.empty?
|
|
430
|
+
|
|
431
|
+
requirements = Hash.new {|h, name| h[name] = [] }
|
|
432
|
+
@needed.each {|dep| requirements[dep.name] << dep.requirement }
|
|
433
|
+
requests.each do |request|
|
|
434
|
+
request.spec.dependencies.each do |dep|
|
|
435
|
+
next if dep.type == :development && !@development
|
|
436
|
+
requirements[dep.name] << dep.requirement
|
|
204
437
|
end
|
|
438
|
+
end
|
|
205
439
|
|
|
206
|
-
|
|
440
|
+
resolved = {}
|
|
441
|
+
requests.each do |request|
|
|
442
|
+
version = resolved[request.spec.name]
|
|
443
|
+
resolved[request.spec.name] = request.spec.version if version.nil? || request.spec.version > version
|
|
207
444
|
end
|
|
208
445
|
|
|
209
|
-
|
|
446
|
+
newest_skipped = {}
|
|
447
|
+
skipped_specs.each do |(name, version), spec|
|
|
448
|
+
resolved_version = resolved[name]
|
|
449
|
+
next unless resolved_version && version > resolved_version
|
|
450
|
+
next unless requirements[name].all? {|req| req.satisfied_by?(version) }
|
|
451
|
+
newest = newest_skipped[name]
|
|
452
|
+
newest_skipped[name] = spec if newest.nil? || version > newest.version
|
|
453
|
+
end
|
|
210
454
|
|
|
211
|
-
|
|
455
|
+
newest_skipped.values.sort_by(&:name).map do |spec|
|
|
456
|
+
{
|
|
457
|
+
name: spec.name,
|
|
458
|
+
version: spec.version,
|
|
459
|
+
resolved: resolved[spec.name],
|
|
460
|
+
available_in_days: @cooldown.remaining_days(spec.created_at),
|
|
461
|
+
}
|
|
462
|
+
end
|
|
212
463
|
end
|
|
213
464
|
|
|
214
|
-
|
|
215
|
-
|
|
465
|
+
def spec_for(name, version)
|
|
466
|
+
@spec_for_cache[name][version]
|
|
467
|
+
end
|
|
216
468
|
|
|
217
|
-
def
|
|
218
|
-
|
|
219
|
-
|
|
469
|
+
def build_spec_for_cache(name)
|
|
470
|
+
# Rank sources by the order they were first supplied so that, when multiple
|
|
471
|
+
# sources offer the same version and platform, the earlier source wins.
|
|
472
|
+
source_rank = {}
|
|
473
|
+
@all_specs[name].each do |s|
|
|
474
|
+
source_rank[s.source] ||= source_rank.size
|
|
220
475
|
end
|
|
221
|
-
end
|
|
222
476
|
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
477
|
+
@all_specs[name].group_by(&:version).transform_values do |candidates|
|
|
478
|
+
next candidates.first if candidates.length == 1
|
|
479
|
+
|
|
480
|
+
# Prefer already-installed specs to avoid unnecessary downloads
|
|
481
|
+
installed = candidates.select {|s| s.is_a?(Gem::Resolver::InstalledSpecification) }
|
|
482
|
+
next installed.first if installed.length == 1
|
|
483
|
+
candidates = installed if installed.any?
|
|
484
|
+
|
|
485
|
+
# Among remaining candidates, prefer a content-addressed candidate
|
|
486
|
+
# built for the running Ruby, then the most specific platform, then the
|
|
487
|
+
# earlier-supplied source. The Ruby ABI ranks before platform
|
|
488
|
+
# specificity so that gem install and bundle install choose the same
|
|
489
|
+
# artifact: Bundler prefers compatible content-addressed candidates
|
|
490
|
+
# before sorting by platform.
|
|
491
|
+
candidates.min_by do |s|
|
|
492
|
+
[Gem::ContentAddress.ruby_abi_specificity_match(s),
|
|
493
|
+
Gem::Platform.platform_specificity_match(s.platform, Gem::Platform.local),
|
|
494
|
+
source_rank[s.source]]
|
|
495
|
+
end
|
|
229
496
|
end
|
|
497
|
+
end
|
|
498
|
+
|
|
499
|
+
def compute_dependencies(package, version)
|
|
500
|
+
spec = spec_for(package.to_s, version)
|
|
501
|
+
return {} unless spec
|
|
502
|
+
return {} if @ignore_dependencies
|
|
230
503
|
|
|
231
|
-
|
|
504
|
+
spec.fetch_development_dependencies if @development && spec.respond_to?(:fetch_development_dependencies)
|
|
232
505
|
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
506
|
+
deps = {}
|
|
507
|
+
root_names = @needed.map(&:name)
|
|
508
|
+
|
|
509
|
+
spec.dependencies.each do |d|
|
|
510
|
+
next if d.name == package.to_s
|
|
511
|
+
next if d.type == :development && !@development
|
|
512
|
+
next if d.type == :development && @development_shallow && !root_names.include?(package.to_s)
|
|
239
513
|
|
|
240
|
-
|
|
514
|
+
dep_package = package_for(d.name)
|
|
241
515
|
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
516
|
+
# In force mode, skip deps that can't be satisfied - either no
|
|
517
|
+
# specs at all, or no specs matching the version requirement.
|
|
518
|
+
if @soft_missing
|
|
519
|
+
dep_specs = @all_specs[d.name]
|
|
520
|
+
matching = dep_specs.select {|s| d.requirement.satisfied_by?(s.version) }
|
|
521
|
+
next if matching.empty?
|
|
522
|
+
end
|
|
523
|
+
|
|
524
|
+
deps[d.name] = Gem::PubGrub::RubyGems.requirement_to_constraint(dep_package, d.requirement)
|
|
247
525
|
end
|
|
248
526
|
|
|
249
|
-
|
|
527
|
+
deps
|
|
250
528
|
end
|
|
251
529
|
|
|
252
|
-
def
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
requests(spec, specification)
|
|
256
|
-
end
|
|
530
|
+
def build_extended_explanation(name, constraint)
|
|
531
|
+
unfiltered = @unfiltered_specs[name]
|
|
532
|
+
return if unfiltered.empty?
|
|
257
533
|
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
return matches_spec if @soft_missing
|
|
534
|
+
filtered = @all_specs[name]
|
|
535
|
+
pkg = package_for(name)
|
|
261
536
|
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
537
|
+
# A prerelease hint applies when the source would strip prereleases for
|
|
538
|
+
# this constraint (global prerelease flag off and the constraint's range
|
|
539
|
+
# doesn't itself reach into prerelease territory) AND a prerelease of
|
|
540
|
+
# the gem exists somewhere.
|
|
541
|
+
prerelease_gated = !(@set.respond_to?(:prerelease) && @set.prerelease) &&
|
|
542
|
+
!range_admits_prerelease?(constraint.range)
|
|
543
|
+
has_prerelease_candidate = prerelease_gated &&
|
|
544
|
+
@all_versions[pkg].any?(&:prerelease?)
|
|
545
|
+
|
|
546
|
+
return if filtered.length == unfiltered.length && !has_prerelease_candidate
|
|
547
|
+
|
|
548
|
+
hints = []
|
|
549
|
+
|
|
550
|
+
# Check for specs that exist for other platforms
|
|
551
|
+
platform_specs = unfiltered.select do |s|
|
|
552
|
+
!Gem::Platform.installable?(s) && constraint.range.include?(s.version)
|
|
553
|
+
end
|
|
554
|
+
if platform_specs.any?
|
|
555
|
+
label = "#{name} (#{constraint.constraint_string})"
|
|
556
|
+
hints << "The source contains the following gems matching '#{label}':"
|
|
557
|
+
platform_specs.each do |s|
|
|
558
|
+
actual = s.respond_to?(:spec) ? s.spec : s
|
|
559
|
+
hints << " * #{actual.full_name}"
|
|
560
|
+
end
|
|
561
|
+
end
|
|
562
|
+
|
|
563
|
+
# Check for specs filtered by Ruby version
|
|
564
|
+
installable = select_local_platforms(unfiltered)
|
|
565
|
+
ruby_specs = installable.select do |s|
|
|
566
|
+
actual = s.respond_to?(:spec) ? s.spec : s
|
|
567
|
+
constraint.range.include?(s.version) &&
|
|
568
|
+
!actual.required_ruby_version.satisfied_by?(Gem.ruby_version)
|
|
569
|
+
rescue StandardError
|
|
570
|
+
false
|
|
571
|
+
end
|
|
572
|
+
if ruby_specs.any?
|
|
573
|
+
versions = ruby_specs.map(&:version).uniq.sort.reverse.first(3)
|
|
574
|
+
sample = ruby_specs.find {|s| s.version == versions.first }
|
|
575
|
+
actual = sample.respond_to?(:spec) ? sample.spec : sample
|
|
576
|
+
ruby_req = actual.required_ruby_version
|
|
577
|
+
hints << "#{name} #{versions.join(", ")} requires Ruby #{ruby_req} (you have #{Gem.ruby_version})"
|
|
578
|
+
end
|
|
579
|
+
|
|
580
|
+
# Check for specs filtered by the cooldown period
|
|
581
|
+
if @cooldown&.active?
|
|
582
|
+
cooldown_specs = installable.select do |s|
|
|
583
|
+
constraint.range.include?(s.version) && @cooldown.skip?(s.created_at)
|
|
584
|
+
end
|
|
585
|
+
if cooldown_specs.any?
|
|
586
|
+
versions = cooldown_specs.map(&:version).uniq.sort.reverse.first(3)
|
|
587
|
+
hints << "#{name} #{versions.join(", ")} published within the cooldown period (#{@cooldown.days} days). Use --cooldown 0 to bypass it."
|
|
588
|
+
end
|
|
589
|
+
end
|
|
590
|
+
|
|
591
|
+
# Check for specs filtered by prerelease status
|
|
592
|
+
if prerelease_gated
|
|
593
|
+
prerelease_versions = @all_versions[pkg].select(&:prerelease?)
|
|
594
|
+
if prerelease_versions.any?
|
|
595
|
+
versions = prerelease_versions.sort.reverse.first(3) # limit to avoid cluttering error output
|
|
596
|
+
hints << "#{name} #{versions.join(", ")} are pre-release versions. Use --prerelease to allow pre-release gems."
|
|
597
|
+
end
|
|
598
|
+
end
|
|
599
|
+
|
|
600
|
+
hints.empty? ? nil : hints.join("\n")
|
|
265
601
|
end
|
|
266
602
|
|
|
267
|
-
def
|
|
268
|
-
|
|
603
|
+
def extract_extended_explanation(incompatibility)
|
|
604
|
+
while incompatibility.cause.is_a?(Gem::PubGrub::Incompatibility::ConflictCause)
|
|
605
|
+
cause = incompatibility.cause
|
|
606
|
+
|
|
607
|
+
[cause.conflict, cause.other].each do |incompat|
|
|
608
|
+
if incompat.cause.is_a?(Gem::PubGrub::Incompatibility::NoVersions) &&
|
|
609
|
+
incompat.respond_to?(:extended_explanation) &&
|
|
610
|
+
incompat.extended_explanation
|
|
611
|
+
return incompat.extended_explanation
|
|
612
|
+
end
|
|
613
|
+
end
|
|
614
|
+
|
|
615
|
+
incompatibility = cause.conflict
|
|
616
|
+
end
|
|
617
|
+
|
|
618
|
+
nil
|
|
269
619
|
end
|
|
270
620
|
|
|
271
|
-
def
|
|
272
|
-
|
|
621
|
+
def make_logger
|
|
622
|
+
DEBUG_RESOLVER ? Gem::PubGrub::StderrLogger.new : Gem::PubGrub::NullLogger.new
|
|
273
623
|
end
|
|
274
624
|
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
amount_constrained(dependency),
|
|
281
|
-
conflicts[name] ? 0 : 1,
|
|
282
|
-
activated.vertex_named(name).payload ? 0 : search_for(dependency).count,
|
|
283
|
-
i, # for stable sort
|
|
284
|
-
]
|
|
625
|
+
# Custom root package so error messages say "your request depends on..."
|
|
626
|
+
# instead of PubGrub's default "root depends on...".
|
|
627
|
+
class RootPackage < Gem::PubGrub::Package
|
|
628
|
+
def initialize
|
|
629
|
+
super(:root)
|
|
285
630
|
end
|
|
286
|
-
end
|
|
287
631
|
|
|
288
|
-
|
|
289
|
-
|
|
632
|
+
def root?
|
|
633
|
+
true
|
|
634
|
+
end
|
|
290
635
|
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
#
|
|
294
|
-
# dependencies w/ 0 or 1 possibilities (ignoring version requirements)
|
|
295
|
-
# are given very negative values, so they _always_ sort first,
|
|
296
|
-
# before dependencies that are unconstrained
|
|
297
|
-
def amount_constrained(dependency)
|
|
298
|
-
@amount_constrained ||= {}
|
|
299
|
-
@amount_constrained[dependency.name] ||= begin
|
|
300
|
-
name_dependency = Gem::Dependency.new(dependency.name)
|
|
301
|
-
dependency_request_for_name = Gem::Resolver::DependencyRequest.new(name_dependency, dependency.requester)
|
|
302
|
-
all = @set.find_all(dependency_request_for_name).size
|
|
303
|
-
|
|
304
|
-
if all <= 1
|
|
305
|
-
all - SINGLE_POSSIBILITY_CONSTRAINT_PENALTY
|
|
306
|
-
else
|
|
307
|
-
search = search_for(dependency).size
|
|
308
|
-
search - all
|
|
309
|
-
end
|
|
636
|
+
def to_s
|
|
637
|
+
"your request"
|
|
310
638
|
end
|
|
311
639
|
end
|
|
312
|
-
private :amount_constrained
|
|
313
640
|
end
|
|
314
641
|
|
|
315
642
|
require_relative "resolver/activation_request"
|
|
316
|
-
require_relative "resolver/conflict"
|
|
317
643
|
require_relative "resolver/dependency_request"
|
|
644
|
+
require_relative "resolver/incompatibility"
|
|
645
|
+
require_relative "resolver/strategy"
|
|
318
646
|
require_relative "resolver/requirement_list"
|
|
319
|
-
require_relative "resolver/stats"
|
|
320
|
-
|
|
321
647
|
require_relative "resolver/set"
|
|
322
648
|
require_relative "resolver/api_set"
|
|
323
649
|
require_relative "resolver/composed_set"
|