rubygems-update 2.6.1 → 3.5.0
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 +5 -5
- data/CHANGELOG.md +5899 -0
- data/CODE_OF_CONDUCT.md +76 -35
- data/CONTRIBUTING.md +231 -0
- data/MAINTAINERS.txt +8 -0
- data/Manifest.txt +428 -216
- data/POLICIES.md +135 -0
- data/README.md +112 -0
- data/UPGRADING.md +15 -0
- data/bundler/CHANGELOG.md +4719 -0
- data/bundler/LICENSE.md +22 -0
- data/bundler/README.md +58 -0
- data/bundler/UPGRADING.md +222 -0
- data/bundler/bundler.gemspec +46 -0
- data/bundler/exe/bundle +29 -0
- data/bundler/exe/bundler +4 -0
- data/bundler/lib/bundler/.document +1 -0
- data/bundler/lib/bundler/build_metadata.rb +45 -0
- data/bundler/lib/bundler/capistrano.rb +22 -0
- data/bundler/lib/bundler/checksum.rb +245 -0
- data/bundler/lib/bundler/ci_detector.rb +75 -0
- data/bundler/lib/bundler/cli/add.rb +47 -0
- data/bundler/lib/bundler/cli/binstubs.rb +57 -0
- data/bundler/lib/bundler/cli/cache.rb +43 -0
- data/bundler/lib/bundler/cli/check.rb +40 -0
- data/bundler/lib/bundler/cli/clean.rb +25 -0
- data/bundler/lib/bundler/cli/common.rb +138 -0
- data/bundler/lib/bundler/cli/config.rb +204 -0
- data/bundler/lib/bundler/cli/console.rb +44 -0
- data/bundler/lib/bundler/cli/doctor.rb +157 -0
- data/bundler/lib/bundler/cli/exec.rb +88 -0
- data/bundler/lib/bundler/cli/fund.rb +36 -0
- data/bundler/lib/bundler/cli/gem.rb +471 -0
- data/bundler/lib/bundler/cli/info.rb +83 -0
- data/bundler/lib/bundler/cli/init.rb +51 -0
- data/bundler/lib/bundler/cli/inject.rb +60 -0
- data/bundler/lib/bundler/cli/install.rb +190 -0
- data/bundler/lib/bundler/cli/issue.rb +41 -0
- data/bundler/lib/bundler/cli/list.rb +66 -0
- data/bundler/lib/bundler/cli/lock.rb +73 -0
- data/bundler/lib/bundler/cli/open.rb +29 -0
- data/bundler/lib/bundler/cli/outdated.rb +297 -0
- data/bundler/lib/bundler/cli/platform.rb +48 -0
- data/bundler/lib/bundler/cli/plugin.rb +34 -0
- data/bundler/lib/bundler/cli/pristine.rb +60 -0
- data/bundler/lib/bundler/cli/remove.rb +17 -0
- data/bundler/lib/bundler/cli/show.rb +75 -0
- data/bundler/lib/bundler/cli/update.rb +123 -0
- data/bundler/lib/bundler/cli/viz.rb +31 -0
- data/bundler/lib/bundler/cli.rb +846 -0
- data/bundler/lib/bundler/compact_index_client/cache.rb +121 -0
- data/bundler/lib/bundler/compact_index_client/cache_file.rb +153 -0
- data/bundler/lib/bundler/compact_index_client/gem_parser.rb +32 -0
- data/bundler/lib/bundler/compact_index_client/updater.rb +115 -0
- data/bundler/lib/bundler/compact_index_client.rb +126 -0
- data/bundler/lib/bundler/constants.rb +7 -0
- data/bundler/lib/bundler/current_ruby.rb +92 -0
- data/bundler/lib/bundler/definition.rb +1005 -0
- data/bundler/lib/bundler/dependency.rb +101 -0
- data/bundler/lib/bundler/deployment.rb +69 -0
- data/bundler/lib/bundler/deprecate.rb +44 -0
- data/bundler/lib/bundler/digest.rb +71 -0
- data/bundler/lib/bundler/dsl.rb +601 -0
- data/bundler/lib/bundler/endpoint_specification.rb +147 -0
- data/bundler/lib/bundler/env.rb +148 -0
- data/bundler/lib/bundler/environment_preserver.rb +86 -0
- data/bundler/lib/bundler/errors.rb +233 -0
- data/bundler/lib/bundler/feature_flag.rb +53 -0
- data/bundler/lib/bundler/fetcher/base.rb +52 -0
- data/bundler/lib/bundler/fetcher/compact_index.rb +129 -0
- data/bundler/lib/bundler/fetcher/dependency.rb +78 -0
- data/bundler/lib/bundler/fetcher/downloader.rb +91 -0
- data/bundler/lib/bundler/fetcher/gem_remote_fetcher.rb +16 -0
- data/bundler/lib/bundler/fetcher/index.rb +25 -0
- data/bundler/lib/bundler/fetcher.rb +324 -0
- data/bundler/lib/bundler/force_platform.rb +18 -0
- data/bundler/lib/bundler/friendly_errors.rb +126 -0
- data/bundler/lib/bundler/gem_helper.rb +237 -0
- data/bundler/lib/bundler/gem_helpers.rb +127 -0
- data/bundler/lib/bundler/gem_tasks.rb +7 -0
- data/bundler/lib/bundler/gem_version_promoter.rb +145 -0
- data/bundler/lib/bundler/graph.rb +152 -0
- data/bundler/lib/bundler/index.rb +205 -0
- data/bundler/lib/bundler/injector.rb +287 -0
- data/bundler/lib/bundler/inline.rb +73 -0
- data/bundler/lib/bundler/installer/gem_installer.rb +84 -0
- data/bundler/lib/bundler/installer/parallel_installer.rb +202 -0
- data/bundler/lib/bundler/installer/standalone.rb +116 -0
- data/bundler/lib/bundler/installer.rb +267 -0
- data/bundler/lib/bundler/lazy_specification.rb +170 -0
- data/bundler/lib/bundler/lockfile_generator.rb +104 -0
- data/bundler/lib/bundler/lockfile_parser.rb +289 -0
- data/bundler/lib/bundler/man/.document +1 -0
- data/bundler/lib/bundler/man/bundle-add.1 +59 -0
- data/bundler/lib/bundler/man/bundle-add.1.ronn +58 -0
- data/bundler/lib/bundler/man/bundle-binstubs.1 +30 -0
- data/bundler/lib/bundler/man/bundle-binstubs.1.ronn +41 -0
- data/bundler/lib/bundler/man/bundle-cache.1 +40 -0
- data/bundler/lib/bundler/man/bundle-cache.1.ronn +79 -0
- data/bundler/lib/bundler/man/bundle-check.1 +22 -0
- data/bundler/lib/bundler/man/bundle-check.1.ronn +26 -0
- data/bundler/lib/bundler/man/bundle-clean.1 +17 -0
- data/bundler/lib/bundler/man/bundle-clean.1.ronn +18 -0
- data/bundler/lib/bundler/man/bundle-config.1 +321 -0
- data/bundler/lib/bundler/man/bundle-config.1.ronn +411 -0
- data/bundler/lib/bundler/man/bundle-console.1 +35 -0
- data/bundler/lib/bundler/man/bundle-console.1.ronn +44 -0
- data/bundler/lib/bundler/man/bundle-doctor.1 +30 -0
- data/bundler/lib/bundler/man/bundle-doctor.1.ronn +33 -0
- data/bundler/lib/bundler/man/bundle-exec.1 +104 -0
- data/bundler/lib/bundler/man/bundle-exec.1.ronn +151 -0
- data/bundler/lib/bundler/man/bundle-gem.1 +69 -0
- data/bundler/lib/bundler/man/bundle-gem.1.ronn +117 -0
- data/bundler/lib/bundler/man/bundle-help.1 +9 -0
- data/bundler/lib/bundler/man/bundle-help.1.ronn +12 -0
- data/bundler/lib/bundler/man/bundle-info.1 +14 -0
- data/bundler/lib/bundler/man/bundle-info.1.ronn +17 -0
- data/bundler/lib/bundler/man/bundle-init.1 +20 -0
- data/bundler/lib/bundler/man/bundle-init.1.ronn +31 -0
- data/bundler/lib/bundler/man/bundle-inject.1 +23 -0
- data/bundler/lib/bundler/man/bundle-inject.1.ronn +24 -0
- data/bundler/lib/bundler/man/bundle-install.1 +215 -0
- data/bundler/lib/bundler/man/bundle-install.1.ronn +383 -0
- data/bundler/lib/bundler/man/bundle-list.1 +35 -0
- data/bundler/lib/bundler/man/bundle-list.1.ronn +33 -0
- data/bundler/lib/bundler/man/bundle-lock.1 +60 -0
- data/bundler/lib/bundler/man/bundle-lock.1.ronn +94 -0
- data/bundler/lib/bundler/man/bundle-open.1 +32 -0
- data/bundler/lib/bundler/man/bundle-open.1.ronn +27 -0
- data/bundler/lib/bundler/man/bundle-outdated.1 +100 -0
- data/bundler/lib/bundler/man/bundle-outdated.1.ronn +106 -0
- data/bundler/lib/bundler/man/bundle-platform.1 +49 -0
- data/bundler/lib/bundler/man/bundle-platform.1.ronn +49 -0
- data/bundler/lib/bundler/man/bundle-plugin.1 +55 -0
- data/bundler/lib/bundler/man/bundle-plugin.1.ronn +59 -0
- data/bundler/lib/bundler/man/bundle-pristine.1 +23 -0
- data/bundler/lib/bundler/man/bundle-pristine.1.ronn +34 -0
- data/bundler/lib/bundler/man/bundle-remove.1 +21 -0
- data/bundler/lib/bundler/man/bundle-remove.1.ronn +23 -0
- data/bundler/lib/bundler/man/bundle-show.1 +16 -0
- data/bundler/lib/bundler/man/bundle-show.1.ronn +21 -0
- data/bundler/lib/bundler/man/bundle-update.1 +275 -0
- data/bundler/lib/bundler/man/bundle-update.1.ronn +351 -0
- data/bundler/lib/bundler/man/bundle-version.1 +22 -0
- data/bundler/lib/bundler/man/bundle-version.1.ronn +24 -0
- data/bundler/lib/bundler/man/bundle-viz.1 +30 -0
- data/bundler/lib/bundler/man/bundle-viz.1.ronn +32 -0
- data/bundler/lib/bundler/man/bundle.1 +102 -0
- data/bundler/lib/bundler/man/bundle.1.ronn +116 -0
- data/bundler/lib/bundler/man/gemfile.5 +470 -0
- data/bundler/lib/bundler/man/gemfile.5.ronn +552 -0
- data/bundler/lib/bundler/man/index.txt +29 -0
- data/bundler/lib/bundler/match_metadata.rb +17 -0
- data/bundler/lib/bundler/match_platform.rb +23 -0
- data/bundler/lib/bundler/match_remote_metadata.rb +29 -0
- data/bundler/lib/bundler/mirror.rb +221 -0
- data/bundler/lib/bundler/plugin/api/source.rb +321 -0
- data/bundler/lib/bundler/plugin/api.rb +81 -0
- data/bundler/lib/bundler/plugin/dsl.rb +53 -0
- data/bundler/lib/bundler/plugin/events.rb +61 -0
- data/bundler/lib/bundler/plugin/index.rb +193 -0
- data/bundler/lib/bundler/plugin/installer/git.rb +34 -0
- data/bundler/lib/bundler/plugin/installer/rubygems.rb +19 -0
- data/bundler/lib/bundler/plugin/installer.rb +112 -0
- data/bundler/lib/bundler/plugin/source_list.rb +31 -0
- data/bundler/lib/bundler/plugin.rb +359 -0
- data/bundler/lib/bundler/process_lock.rb +24 -0
- data/bundler/lib/bundler/remote_specification.rb +117 -0
- data/bundler/lib/bundler/resolver/base.rb +107 -0
- data/bundler/lib/bundler/resolver/candidate.rb +94 -0
- data/bundler/lib/bundler/resolver/incompatibility.rb +15 -0
- data/bundler/lib/bundler/resolver/package.rb +77 -0
- data/bundler/lib/bundler/resolver/root.rb +25 -0
- data/bundler/lib/bundler/resolver/spec_group.rb +79 -0
- data/bundler/lib/bundler/resolver.rb +462 -0
- data/bundler/lib/bundler/retry.rb +66 -0
- data/bundler/lib/bundler/ruby_dsl.rb +53 -0
- data/bundler/lib/bundler/ruby_version.rb +131 -0
- data/bundler/lib/bundler/rubygems_ext.rb +328 -0
- data/bundler/lib/bundler/rubygems_gem_installer.rb +137 -0
- data/bundler/lib/bundler/rubygems_integration.rb +493 -0
- data/bundler/lib/bundler/runtime.rb +307 -0
- data/bundler/lib/bundler/safe_marshal.rb +31 -0
- data/bundler/lib/bundler/self_manager.rb +186 -0
- data/bundler/lib/bundler/settings/validator.rb +102 -0
- data/bundler/lib/bundler/settings.rb +588 -0
- data/bundler/lib/bundler/setup.rb +33 -0
- data/bundler/lib/bundler/shared_helpers.rb +380 -0
- data/bundler/lib/bundler/similarity_detector.rb +63 -0
- data/bundler/lib/bundler/source/gemspec.rb +18 -0
- data/bundler/lib/bundler/source/git/git_proxy.rb +455 -0
- data/bundler/lib/bundler/source/git.rb +380 -0
- data/bundler/lib/bundler/source/metadata.rb +62 -0
- data/bundler/lib/bundler/source/path/installer.rb +53 -0
- data/bundler/lib/bundler/source/path.rb +261 -0
- data/bundler/lib/bundler/source/rubygems/remote.rb +68 -0
- data/bundler/lib/bundler/source/rubygems.rb +516 -0
- data/bundler/lib/bundler/source/rubygems_aggregate.rb +68 -0
- data/bundler/lib/bundler/source.rb +116 -0
- data/bundler/lib/bundler/source_list.rb +227 -0
- data/bundler/lib/bundler/source_map.rb +71 -0
- data/bundler/lib/bundler/spec_set.rb +247 -0
- data/bundler/lib/bundler/stub_specification.rb +119 -0
- data/bundler/lib/bundler/templates/.document +1 -0
- data/bundler/lib/bundler/templates/Executable +27 -0
- data/bundler/lib/bundler/templates/Executable.bundler +109 -0
- data/bundler/lib/bundler/templates/Executable.standalone +14 -0
- data/bundler/lib/bundler/templates/Gemfile +5 -0
- data/bundler/lib/bundler/templates/newgem/CHANGELOG.md.tt +5 -0
- data/bundler/lib/bundler/templates/newgem/CODE_OF_CONDUCT.md.tt +84 -0
- data/bundler/lib/bundler/templates/newgem/Cargo.toml.tt +7 -0
- data/bundler/lib/bundler/templates/newgem/Gemfile.tt +26 -0
- data/bundler/lib/bundler/templates/newgem/LICENSE.txt.tt +21 -0
- data/bundler/lib/bundler/templates/newgem/README.md.tt +45 -0
- data/bundler/lib/bundler/templates/newgem/Rakefile.tt +67 -0
- data/bundler/lib/bundler/templates/newgem/bin/console.tt +11 -0
- data/bundler/lib/bundler/templates/newgem/bin/setup.tt +8 -0
- data/bundler/lib/bundler/templates/newgem/circleci/config.yml.tt +25 -0
- data/bundler/lib/bundler/templates/newgem/exe/newgem.tt +3 -0
- data/bundler/lib/bundler/templates/newgem/ext/newgem/Cargo.toml.tt +15 -0
- data/bundler/lib/bundler/templates/newgem/ext/newgem/extconf-c.rb.tt +10 -0
- data/bundler/lib/bundler/templates/newgem/ext/newgem/extconf-rust.rb.tt +6 -0
- data/bundler/lib/bundler/templates/newgem/ext/newgem/newgem.c.tt +9 -0
- data/bundler/lib/bundler/templates/newgem/ext/newgem/newgem.h.tt +6 -0
- data/bundler/lib/bundler/templates/newgem/ext/newgem/src/lib.rs.tt +12 -0
- data/bundler/lib/bundler/templates/newgem/github/workflows/main.yml.tt +37 -0
- data/bundler/lib/bundler/templates/newgem/gitignore.tt +23 -0
- data/bundler/lib/bundler/templates/newgem/gitlab-ci.yml.tt +18 -0
- data/bundler/lib/bundler/templates/newgem/lib/newgem/version.rb.tt +9 -0
- data/bundler/lib/bundler/templates/newgem/lib/newgem.rb.tt +15 -0
- data/bundler/lib/bundler/templates/newgem/newgem.gemspec.tt +51 -0
- data/bundler/lib/bundler/templates/newgem/rspec.tt +3 -0
- data/bundler/lib/bundler/templates/newgem/rubocop.yml.tt +13 -0
- data/bundler/lib/bundler/templates/newgem/sig/newgem.rbs.tt +8 -0
- data/bundler/lib/bundler/templates/newgem/spec/newgem_spec.rb.tt +11 -0
- data/bundler/lib/bundler/templates/newgem/spec/spec_helper.rb.tt +15 -0
- data/bundler/lib/bundler/templates/newgem/standard.yml.tt +3 -0
- data/bundler/lib/bundler/templates/newgem/test/minitest/test_helper.rb.tt +6 -0
- data/bundler/lib/bundler/templates/newgem/test/minitest/test_newgem.rb.tt +13 -0
- data/bundler/lib/bundler/templates/newgem/test/test-unit/newgem_test.rb.tt +15 -0
- data/bundler/lib/bundler/templates/newgem/test/test-unit/test_helper.rb.tt +6 -0
- data/bundler/lib/bundler/ui/rg_proxy.rb +19 -0
- data/bundler/lib/bundler/ui/shell.rb +165 -0
- data/bundler/lib/bundler/ui/silent.rb +85 -0
- data/bundler/lib/bundler/ui.rb +9 -0
- data/bundler/lib/bundler/uri_credentials_filter.rb +43 -0
- data/bundler/lib/bundler/uri_normalizer.rb +23 -0
- data/bundler/lib/bundler/vendor/.document +1 -0
- data/bundler/lib/bundler/vendor/connection_pool/LICENSE +20 -0
- data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool/timed_stack.rb +174 -0
- data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool/version.rb +3 -0
- data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool/wrapper.rb +56 -0
- data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool.rb +175 -0
- data/bundler/lib/bundler/vendor/fileutils/LICENSE.txt +22 -0
- data/bundler/lib/bundler/vendor/fileutils/lib/fileutils.rb +2694 -0
- data/bundler/lib/bundler/vendor/net-http-persistent/README.rdoc +82 -0
- data/bundler/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/connection.rb +41 -0
- data/bundler/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/pool.rb +65 -0
- data/bundler/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/timed_stack_multi.rb +79 -0
- data/bundler/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb +1073 -0
- data/bundler/lib/bundler/vendor/pub_grub/LICENSE.txt +21 -0
- data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/assignment.rb +20 -0
- data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/basic_package_source.rb +189 -0
- data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/failure_writer.rb +182 -0
- data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/incompatibility.rb +150 -0
- data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/package.rb +43 -0
- data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/partial_solution.rb +121 -0
- data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/rubygems.rb +45 -0
- data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/solve_failure.rb +19 -0
- data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/static_package_source.rb +60 -0
- data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/term.rb +105 -0
- data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/version.rb +3 -0
- data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/version_constraint.rb +129 -0
- data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/version_range.rb +411 -0
- data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/version_solver.rb +248 -0
- data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/version_union.rb +178 -0
- data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub.rb +31 -0
- data/bundler/lib/bundler/vendor/thor/LICENSE.md +20 -0
- data/bundler/lib/bundler/vendor/thor/lib/thor/actions/create_file.rb +105 -0
- data/bundler/lib/bundler/vendor/thor/lib/thor/actions/create_link.rb +61 -0
- data/bundler/lib/bundler/vendor/thor/lib/thor/actions/directory.rb +108 -0
- data/bundler/lib/bundler/vendor/thor/lib/thor/actions/empty_directory.rb +143 -0
- data/bundler/lib/bundler/vendor/thor/lib/thor/actions/file_manipulation.rb +373 -0
- data/bundler/lib/bundler/vendor/thor/lib/thor/actions/inject_into_file.rb +130 -0
- data/bundler/lib/bundler/vendor/thor/lib/thor/actions.rb +340 -0
- data/bundler/lib/bundler/vendor/thor/lib/thor/base.rb +825 -0
- data/bundler/lib/bundler/vendor/thor/lib/thor/command.rb +151 -0
- data/bundler/lib/bundler/vendor/thor/lib/thor/core_ext/hash_with_indifferent_access.rb +107 -0
- data/bundler/lib/bundler/vendor/thor/lib/thor/error.rb +106 -0
- data/bundler/lib/bundler/vendor/thor/lib/thor/group.rb +281 -0
- data/bundler/lib/bundler/vendor/thor/lib/thor/invocation.rb +178 -0
- data/bundler/lib/bundler/vendor/thor/lib/thor/line_editor/basic.rb +37 -0
- data/bundler/lib/bundler/vendor/thor/lib/thor/line_editor/readline.rb +88 -0
- data/bundler/lib/bundler/vendor/thor/lib/thor/line_editor.rb +17 -0
- data/bundler/lib/bundler/vendor/thor/lib/thor/nested_context.rb +29 -0
- data/bundler/lib/bundler/vendor/thor/lib/thor/parser/argument.rb +89 -0
- data/bundler/lib/bundler/vendor/thor/lib/thor/parser/arguments.rb +195 -0
- data/bundler/lib/bundler/vendor/thor/lib/thor/parser/option.rb +178 -0
- data/bundler/lib/bundler/vendor/thor/lib/thor/parser/options.rb +293 -0
- data/bundler/lib/bundler/vendor/thor/lib/thor/parser.rb +4 -0
- data/bundler/lib/bundler/vendor/thor/lib/thor/rake_compat.rb +72 -0
- data/bundler/lib/bundler/vendor/thor/lib/thor/runner.rb +335 -0
- data/bundler/lib/bundler/vendor/thor/lib/thor/shell/basic.rb +388 -0
- data/bundler/lib/bundler/vendor/thor/lib/thor/shell/color.rb +115 -0
- data/bundler/lib/bundler/vendor/thor/lib/thor/shell/column_printer.rb +29 -0
- data/bundler/lib/bundler/vendor/thor/lib/thor/shell/html.rb +84 -0
- data/bundler/lib/bundler/vendor/thor/lib/thor/shell/lcs_diff.rb +49 -0
- data/bundler/lib/bundler/vendor/thor/lib/thor/shell/table_printer.rb +134 -0
- data/bundler/lib/bundler/vendor/thor/lib/thor/shell/terminal.rb +42 -0
- data/bundler/lib/bundler/vendor/thor/lib/thor/shell/wrapped_printer.rb +38 -0
- data/bundler/lib/bundler/vendor/thor/lib/thor/shell.rb +81 -0
- data/bundler/lib/bundler/vendor/thor/lib/thor/util.rb +285 -0
- data/bundler/lib/bundler/vendor/thor/lib/thor/version.rb +3 -0
- data/bundler/lib/bundler/vendor/thor/lib/thor.rb +663 -0
- data/bundler/lib/bundler/vendor/tsort/LICENSE.txt +22 -0
- data/bundler/lib/bundler/vendor/tsort/lib/tsort.rb +455 -0
- data/bundler/lib/bundler/vendor/uri/LICENSE.txt +22 -0
- data/bundler/lib/bundler/vendor/uri/lib/uri/common.rb +853 -0
- data/bundler/lib/bundler/vendor/uri/lib/uri/file.rb +100 -0
- data/bundler/lib/bundler/vendor/uri/lib/uri/ftp.rb +267 -0
- data/bundler/lib/bundler/vendor/uri/lib/uri/generic.rb +1588 -0
- data/bundler/lib/bundler/vendor/uri/lib/uri/http.rb +125 -0
- data/bundler/lib/bundler/vendor/uri/lib/uri/https.rb +23 -0
- data/bundler/lib/bundler/vendor/uri/lib/uri/ldap.rb +261 -0
- data/bundler/lib/bundler/vendor/uri/lib/uri/ldaps.rb +22 -0
- data/bundler/lib/bundler/vendor/uri/lib/uri/mailto.rb +293 -0
- data/bundler/lib/bundler/vendor/uri/lib/uri/rfc2396_parser.rb +539 -0
- data/bundler/lib/bundler/vendor/uri/lib/uri/rfc3986_parser.rb +183 -0
- data/bundler/lib/bundler/vendor/uri/lib/uri/version.rb +6 -0
- data/bundler/lib/bundler/vendor/uri/lib/uri/ws.rb +83 -0
- data/bundler/lib/bundler/vendor/uri/lib/uri/wss.rb +23 -0
- data/bundler/lib/bundler/vendor/uri/lib/uri.rb +104 -0
- data/bundler/lib/bundler/vendored_fileutils.rb +4 -0
- data/bundler/lib/bundler/vendored_net_http.rb +8 -0
- data/bundler/lib/bundler/vendored_persistent.rb +11 -0
- data/bundler/lib/bundler/vendored_pub_grub.rb +4 -0
- data/bundler/lib/bundler/vendored_thor.rb +8 -0
- data/bundler/lib/bundler/vendored_timeout.rb +8 -0
- data/bundler/lib/bundler/vendored_tsort.rb +4 -0
- data/bundler/lib/bundler/vendored_uri.rb +4 -0
- data/bundler/lib/bundler/version.rb +13 -0
- data/bundler/lib/bundler/vlad.rb +17 -0
- data/bundler/lib/bundler/worker.rb +117 -0
- data/bundler/lib/bundler/yaml_serializer.rb +93 -0
- data/bundler/lib/bundler.rb +665 -0
- data/{test/rubygems/bogussources.rb → exe/gem} +5 -2
- data/exe/update_rubygems +38 -0
- data/hide_lib_for_update/note.txt +0 -4
- data/lib/rubygems/available_set.rb +12 -12
- data/lib/rubygems/basic_specification.rb +75 -58
- data/lib/rubygems/bundler_version_finder.rb +77 -0
- data/lib/rubygems/ci_detector.rb +75 -0
- data/lib/rubygems/command.rb +144 -71
- data/lib/rubygems/command_manager.rb +64 -27
- data/lib/rubygems/commands/build_command.rb +88 -17
- data/lib/rubygems/commands/cert_command.rb +131 -83
- data/lib/rubygems/commands/check_command.rb +30 -27
- data/lib/rubygems/commands/cleanup_command.rb +57 -40
- data/lib/rubygems/commands/contents_command.rb +37 -39
- data/lib/rubygems/commands/dependency_command.rb +53 -65
- data/lib/rubygems/commands/environment_command.rb +32 -16
- data/lib/rubygems/commands/exec_command.rb +249 -0
- data/lib/rubygems/commands/fetch_command.rb +36 -19
- data/lib/rubygems/commands/generate_index_command.rb +40 -74
- data/lib/rubygems/commands/help_command.rb +22 -22
- data/lib/rubygems/commands/info_command.rb +38 -0
- data/lib/rubygems/commands/install_command.rb +67 -143
- data/lib/rubygems/commands/list_command.rb +10 -9
- data/lib/rubygems/commands/lock_command.rb +12 -14
- data/lib/rubygems/commands/mirror_command.rb +4 -4
- data/lib/rubygems/commands/open_command.rb +28 -26
- data/lib/rubygems/commands/outdated_command.rb +6 -6
- data/lib/rubygems/commands/owner_command.rb +51 -27
- data/lib/rubygems/commands/pristine_command.rb +99 -71
- data/lib/rubygems/commands/push_command.rb +53 -46
- data/lib/rubygems/commands/query_command.rb +21 -328
- data/lib/rubygems/commands/rdoc_command.rb +33 -33
- data/lib/rubygems/commands/search_command.rb +9 -9
- data/lib/rubygems/commands/server_command.rb +15 -76
- data/lib/rubygems/commands/setup_command.rb +370 -186
- data/lib/rubygems/commands/signin_command.rb +34 -0
- data/lib/rubygems/commands/signout_command.rb +32 -0
- data/lib/rubygems/commands/sources_command.rb +57 -41
- data/lib/rubygems/commands/specification_command.rb +38 -28
- data/lib/rubygems/commands/stale_command.rb +6 -5
- data/lib/rubygems/commands/uninstall_command.rb +96 -62
- data/lib/rubygems/commands/unpack_command.rb +44 -53
- data/lib/rubygems/commands/update_command.rb +155 -99
- data/lib/rubygems/commands/which_command.rb +14 -17
- data/lib/rubygems/commands/yank_command.rb +28 -32
- data/lib/rubygems/compatibility.rb +13 -32
- data/lib/rubygems/config_file.rb +214 -119
- data/lib/rubygems/core_ext/kernel_gem.rb +10 -16
- data/lib/rubygems/core_ext/kernel_require.rb +92 -90
- data/lib/rubygems/core_ext/kernel_warn.rb +49 -0
- data/lib/rubygems/core_ext/tcpsocket_init.rb +54 -0
- data/lib/rubygems/defaults.rb +184 -54
- data/lib/rubygems/dependency.rb +75 -62
- data/lib/rubygems/dependency_installer.rb +74 -230
- data/lib/rubygems/dependency_list.rb +32 -33
- data/lib/rubygems/deprecate.rb +113 -17
- data/lib/rubygems/doctor.rb +31 -31
- data/lib/rubygems/errors.rb +51 -13
- data/lib/rubygems/exceptions.rb +65 -35
- data/lib/rubygems/ext/build_error.rb +3 -1
- data/lib/rubygems/ext/builder.rb +103 -77
- data/lib/rubygems/ext/cargo_builder/link_flag_converter.rb +27 -0
- data/lib/rubygems/ext/cargo_builder.rb +360 -0
- data/lib/rubygems/ext/cmake_builder.rb +6 -7
- data/lib/rubygems/ext/configure_builder.rb +6 -9
- data/lib/rubygems/ext/ext_conf_builder.rb +40 -61
- data/lib/rubygems/ext/rake_builder.rb +18 -21
- data/lib/rubygems/ext.rb +8 -7
- data/lib/rubygems/gem_runner.rb +19 -21
- data/lib/rubygems/gemcutter_utilities/webauthn_listener/response.rb +163 -0
- data/lib/rubygems/gemcutter_utilities/webauthn_listener.rb +105 -0
- data/lib/rubygems/gemcutter_utilities/webauthn_poller.rb +78 -0
- data/lib/rubygems/gemcutter_utilities.rb +246 -43
- data/lib/rubygems/install_default_message.rb +3 -3
- data/lib/rubygems/install_message.rb +3 -3
- data/lib/rubygems/install_update_options.rb +104 -98
- data/lib/rubygems/installer.rb +407 -225
- data/lib/rubygems/installer_uninstaller_utils.rb +27 -0
- data/lib/rubygems/local_remote_options.rb +29 -32
- data/lib/rubygems/name_tuple.rb +18 -23
- data/lib/rubygems/net/http.rb +3 -0
- data/lib/rubygems/net-http/LICENSE.txt +22 -0
- data/lib/rubygems/net-http/lib/net/http/backward.rb +40 -0
- data/lib/rubygems/net-http/lib/net/http/exceptions.rb +34 -0
- data/lib/rubygems/net-http/lib/net/http/generic_request.rb +414 -0
- data/lib/rubygems/net-http/lib/net/http/header.rb +981 -0
- data/lib/rubygems/net-http/lib/net/http/proxy_delta.rb +17 -0
- data/lib/rubygems/net-http/lib/net/http/request.rb +88 -0
- data/lib/rubygems/net-http/lib/net/http/requests.rb +425 -0
- data/lib/rubygems/net-http/lib/net/http/response.rb +738 -0
- data/lib/rubygems/net-http/lib/net/http/responses.rb +1174 -0
- data/lib/rubygems/net-http/lib/net/http/status.rb +84 -0
- data/lib/rubygems/net-http/lib/net/http.rb +2496 -0
- data/lib/rubygems/net-http/lib/net/https.rb +23 -0
- data/lib/rubygems/net-protocol/LICENSE.txt +22 -0
- data/lib/rubygems/net-protocol/lib/net/protocol.rb +544 -0
- data/lib/rubygems/openssl.rb +7 -0
- data/lib/rubygems/optparse/.document +1 -0
- data/lib/rubygems/optparse/COPYING +56 -0
- data/lib/rubygems/optparse/lib/optionparser.rb +2 -0
- data/lib/rubygems/optparse/lib/optparse/ac.rb +54 -0
- data/lib/rubygems/optparse/lib/optparse/date.rb +18 -0
- data/lib/rubygems/optparse/lib/optparse/kwargs.rb +22 -0
- data/lib/rubygems/optparse/lib/optparse/shellwords.rb +7 -0
- data/lib/rubygems/optparse/lib/optparse/time.rb +11 -0
- data/lib/rubygems/optparse/lib/optparse/uri.rb +7 -0
- data/lib/rubygems/optparse/lib/optparse/version.rb +71 -0
- data/lib/rubygems/optparse/lib/optparse.rb +2330 -0
- data/lib/rubygems/optparse.rb +3 -0
- data/lib/rubygems/package/digest_io.rb +5 -7
- data/lib/rubygems/package/file_source.rb +6 -8
- data/lib/rubygems/package/io_source.rb +6 -4
- data/lib/rubygems/package/old.rb +19 -28
- data/lib/rubygems/package/source.rb +1 -1
- data/lib/rubygems/package/tar_header.rb +114 -93
- data/lib/rubygems/package/tar_reader/entry.rb +116 -22
- data/lib/rubygems/package/tar_reader.rb +18 -40
- data/lib/rubygems/package/tar_writer.rb +42 -56
- data/lib/rubygems/package.rb +245 -145
- data/lib/rubygems/package_task.rb +8 -14
- data/lib/rubygems/path_support.rb +21 -16
- data/lib/rubygems/platform.rb +135 -74
- data/lib/rubygems/psych_tree.rb +3 -2
- data/lib/rubygems/query_utils.rb +349 -0
- data/lib/rubygems/rdoc.rb +4 -326
- data/lib/rubygems/remote_fetcher.rb +99 -181
- data/lib/rubygems/request/connection_pools.rb +31 -24
- data/lib/rubygems/request/http_pool.rb +6 -7
- data/lib/rubygems/request/https_pool.rb +2 -3
- data/lib/rubygems/request.rb +103 -53
- data/lib/rubygems/request_set/gem_dependency_api.rb +182 -190
- data/lib/rubygems/request_set/lockfile/parser.rb +42 -52
- data/lib/rubygems/request_set/lockfile/tokenizer.rb +34 -24
- data/lib/rubygems/request_set/lockfile.rb +32 -35
- data/lib/rubygems/request_set.rb +115 -71
- data/lib/rubygems/requirement.rb +77 -68
- data/lib/rubygems/resolv/LICENSE.txt +22 -0
- data/lib/rubygems/resolv/lib/resolv.rb +3387 -0
- data/lib/rubygems/resolver/activation_request.rb +34 -61
- data/lib/rubygems/resolver/api_set/gem_parser.rb +24 -0
- data/lib/rubygems/resolver/api_set.rb +40 -32
- data/lib/rubygems/resolver/api_specification.rb +37 -18
- data/lib/rubygems/resolver/best_set.rb +15 -17
- data/lib/rubygems/resolver/composed_set.rb +9 -11
- data/lib/rubygems/resolver/conflict.rb +19 -33
- data/lib/rubygems/resolver/current_set.rb +2 -4
- data/lib/rubygems/resolver/dependency_request.rb +8 -9
- data/lib/rubygems/resolver/git_set.rb +8 -10
- data/lib/rubygems/resolver/git_specification.rb +11 -13
- data/lib/rubygems/resolver/index_set.rb +13 -15
- data/lib/rubygems/resolver/index_specification.rb +42 -11
- data/lib/rubygems/resolver/installed_specification.rb +9 -11
- data/lib/rubygems/resolver/installer_set.rb +87 -45
- data/lib/rubygems/resolver/local_specification.rb +5 -7
- data/lib/rubygems/resolver/lock_set.rb +13 -15
- data/lib/rubygems/resolver/lock_specification.rb +13 -15
- data/lib/rubygems/resolver/molinillo/LICENSE +9 -0
- data/lib/rubygems/resolver/molinillo/lib/molinillo/delegates/resolution_state.rb +57 -0
- data/lib/rubygems/resolver/molinillo/lib/molinillo/delegates/specification_provider.rb +88 -0
- data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/action.rb +36 -0
- data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/add_edge_no_circular.rb +66 -0
- data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/add_vertex.rb +62 -0
- data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/delete_edge.rb +63 -0
- data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/detach_vertex_named.rb +61 -0
- data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/log.rb +126 -0
- data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/set_payload.rb +46 -0
- data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/tag.rb +36 -0
- data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/vertex.rb +164 -0
- data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph.rb +110 -146
- data/lib/rubygems/resolver/molinillo/lib/molinillo/errors.rb +83 -9
- data/lib/rubygems/resolver/molinillo/lib/molinillo/gem_metadata.rb +2 -1
- data/lib/rubygems/resolver/molinillo/lib/molinillo/modules/specification_provider.rb +13 -1
- data/lib/rubygems/resolver/molinillo/lib/molinillo/modules/ui.rb +3 -1
- data/lib/rubygems/resolver/molinillo/lib/molinillo/resolution.rb +552 -172
- data/lib/rubygems/resolver/molinillo/lib/molinillo/resolver.rb +3 -2
- data/lib/rubygems/resolver/molinillo/lib/molinillo/state.rb +12 -6
- data/lib/rubygems/resolver/molinillo/lib/molinillo.rb +6 -5
- data/lib/rubygems/resolver/molinillo.rb +2 -1
- data/lib/rubygems/resolver/requirement_list.rb +2 -2
- data/lib/rubygems/resolver/set.rb +3 -5
- data/lib/rubygems/resolver/source_set.rb +6 -7
- data/lib/rubygems/resolver/spec_specification.rb +16 -4
- data/lib/rubygems/resolver/specification.rb +25 -10
- data/lib/rubygems/resolver/stats.rb +1 -0
- data/lib/rubygems/resolver/vendor_set.rb +6 -8
- data/lib/rubygems/resolver/vendor_specification.rb +6 -8
- data/lib/rubygems/resolver.rb +121 -72
- data/lib/rubygems/s3_uri_signer.rb +177 -0
- data/lib/rubygems/safe_marshal/elements.rb +138 -0
- data/lib/rubygems/safe_marshal/reader.rb +306 -0
- data/lib/rubygems/safe_marshal/visitors/stream_printer.rb +31 -0
- data/lib/rubygems/safe_marshal/visitors/to_ruby.rb +385 -0
- data/lib/rubygems/safe_marshal/visitors/visitor.rb +74 -0
- data/lib/rubygems/safe_marshal.rb +74 -0
- data/lib/rubygems/safe_yaml.rb +36 -0
- data/lib/rubygems/security/policies.rb +49 -51
- data/lib/rubygems/security/policy.rb +46 -53
- data/lib/rubygems/security/signer.rb +86 -29
- data/lib/rubygems/security/trust_dir.rb +22 -24
- data/lib/rubygems/security.rb +101 -82
- data/lib/rubygems/security_option.rb +43 -0
- data/lib/rubygems/shellwords.rb +3 -0
- data/lib/rubygems/source/git.rb +40 -42
- data/lib/rubygems/source/installed.rb +5 -9
- data/lib/rubygems/source/local.rb +30 -33
- data/lib/rubygems/source/lock.rb +10 -10
- data/lib/rubygems/source/specific_file.rb +7 -9
- data/lib/rubygems/source/vendor.rb +3 -7
- data/lib/rubygems/source.rb +78 -68
- data/lib/rubygems/source_list.rb +11 -15
- data/lib/rubygems/spec_fetcher.rb +71 -83
- data/lib/rubygems/specification.rb +833 -1115
- data/lib/rubygems/specification_policy.rb +538 -0
- data/lib/rubygems/ssl_certs/rubygems.org/GlobalSignRootCA.pem +21 -0
- data/lib/rubygems/ssl_certs/rubygems.org/GlobalSignRootCA_R3.pem +21 -0
- data/lib/rubygems/stub_specification.rb +55 -57
- data/lib/rubygems/text.rb +39 -27
- data/lib/rubygems/timeout/LICENSE.txt +22 -0
- data/lib/rubygems/timeout/lib/timeout.rb +199 -0
- data/lib/rubygems/timeout.rb +3 -0
- data/lib/rubygems/tsort/.document +1 -0
- data/lib/rubygems/tsort/LICENSE.txt +22 -0
- data/lib/rubygems/tsort/lib/tsort.rb +455 -0
- data/lib/rubygems/tsort.rb +3 -0
- data/lib/rubygems/uninstaller.rb +150 -87
- data/lib/rubygems/unknown_command_spell_checker.rb +21 -0
- data/lib/rubygems/update_suggestion.rb +56 -0
- data/lib/rubygems/uri.rb +126 -0
- data/lib/rubygems/uri_formatter.rb +4 -7
- data/lib/rubygems/user_interaction.rb +92 -146
- data/lib/rubygems/util/licenses.rb +712 -317
- data/lib/rubygems/util/list.rb +5 -2
- data/lib/rubygems/util.rb +58 -75
- data/lib/rubygems/validator.rb +26 -48
- data/lib/rubygems/version.rb +106 -56
- data/lib/rubygems/version_option.rb +22 -14
- data/lib/rubygems/yaml_serializer.rb +93 -0
- data/lib/rubygems.rb +427 -361
- data/rubygems-update.gemspec +38 -0
- data/setup.rb +13 -27
- metadata +500 -363
- data/.autotest +0 -71
- data/.document +0 -5
- data/.travis.yml +0 -46
- data/CONTRIBUTING.rdoc +0 -129
- data/CVE-2013-4287.txt +0 -35
- data/CVE-2013-4363.txt +0 -45
- data/CVE-2015-3900.txt +0 -40
- data/History.txt +0 -3105
- data/MAINTAINERS.md +0 -5
- data/POLICIES.rdoc +0 -61
- data/README.rdoc +0 -54
- data/Rakefile +0 -449
- data/UPGRADING.rdoc +0 -92
- data/appveyor.yml +0 -36
- data/bin/gem +0 -25
- data/bin/update_rubygems +0 -37
- data/lib/gauntlet_rubygems.rb +0 -51
- data/lib/rubygems/indexer.rb +0 -434
- data/lib/rubygems/installer_test_case.rb +0 -194
- data/lib/rubygems/mock_gem_ui.rb +0 -89
- data/lib/rubygems/package/tar_test_case.rb +0 -147
- data/lib/rubygems/psych_additions.rb +0 -10
- data/lib/rubygems/server.rb +0 -869
- data/lib/rubygems/source_local.rb +0 -6
- data/lib/rubygems/source_specific_file.rb +0 -5
- data/lib/rubygems/ssl_certs/AddTrustExternalCARoot-2048.pem +0 -25
- data/lib/rubygems/ssl_certs/AddTrustExternalCARoot.pem +0 -32
- data/lib/rubygems/ssl_certs/Class3PublicPrimaryCertificationAuthority.pem +0 -14
- data/lib/rubygems/ssl_certs/DigiCertHighAssuranceEVRootCA.pem +0 -23
- data/lib/rubygems/ssl_certs/EntrustnetSecureServerCertificationAuthority.pem +0 -28
- data/lib/rubygems/ssl_certs/GeoTrustGlobalCA.pem +0 -20
- data/lib/rubygems/syck_hack.rb +0 -77
- data/lib/rubygems/test_case.rb +0 -1496
- data/lib/rubygems/test_utilities.rb +0 -384
- data/lib/ubygems.rb +0 -11
- data/test/rubygems/alternate_cert.pem +0 -18
- data/test/rubygems/alternate_cert_32.pem +0 -18
- data/test/rubygems/alternate_key.pem +0 -27
- data/test/rubygems/bad_rake.rb +0 -2
- data/test/rubygems/ca_cert.pem +0 -68
- data/test/rubygems/child_cert.pem +0 -18
- data/test/rubygems/child_cert_32.pem +0 -18
- data/test/rubygems/child_key.pem +0 -27
- data/test/rubygems/client.pem +0 -49
- data/test/rubygems/data/gem-private_key.pem +0 -27
- data/test/rubygems/data/gem-public_cert.pem +0 -20
- data/test/rubygems/data/null-type.gemspec.rz +0 -0
- data/test/rubygems/encrypted_private_key.pem +0 -30
- data/test/rubygems/expired_cert.pem +0 -18
- data/test/rubygems/fake_certlib/openssl.rb +0 -8
- data/test/rubygems/fix_openssl_warnings.rb +0 -13
- data/test/rubygems/foo/discover.rb +0 -1
- data/test/rubygems/future_cert.pem +0 -18
- data/test/rubygems/future_cert_32.pem +0 -18
- data/test/rubygems/good_rake.rb +0 -2
- data/test/rubygems/grandchild_cert.pem +0 -18
- data/test/rubygems/grandchild_cert_32.pem +0 -18
- data/test/rubygems/grandchild_key.pem +0 -27
- data/test/rubygems/invalid_client.pem +0 -49
- data/test/rubygems/invalid_issuer_cert.pem +0 -18
- data/test/rubygems/invalid_issuer_cert_32.pem +0 -18
- data/test/rubygems/invalid_key.pem +0 -27
- data/test/rubygems/invalid_signer_cert.pem +0 -18
- data/test/rubygems/invalid_signer_cert_32.pem +0 -18
- data/test/rubygems/invalidchild_cert.pem +0 -18
- data/test/rubygems/invalidchild_cert_32.pem +0 -18
- data/test/rubygems/invalidchild_key.pem +0 -27
- data/test/rubygems/plugin/exception/rubygems_plugin.rb +0 -3
- data/test/rubygems/plugin/load/rubygems_plugin.rb +0 -4
- data/test/rubygems/plugin/standarderror/rubygems_plugin.rb +0 -3
- data/test/rubygems/private_key.pem +0 -27
- data/test/rubygems/public_cert.pem +0 -18
- data/test/rubygems/public_cert_32.pem +0 -18
- data/test/rubygems/public_key.pem +0 -9
- data/test/rubygems/rubygems/commands/crash_command.rb +0 -6
- data/test/rubygems/rubygems_plugin.rb +0 -22
- data/test/rubygems/sff/discover.rb +0 -1
- data/test/rubygems/simple_gem.rb +0 -67
- data/test/rubygems/specifications/bar-0.0.2.gemspec +0 -9
- data/test/rubygems/specifications/foo-0.0.1-x86-mswin32.gemspec +0 -0
- data/test/rubygems/ssl_cert.pem +0 -19
- data/test/rubygems/ssl_key.pem +0 -15
- data/test/rubygems/test_bundled_ca.rb +0 -59
- data/test/rubygems/test_config.rb +0 -24
- data/test/rubygems/test_deprecate.rb +0 -77
- data/test/rubygems/test_gem.rb +0 -1718
- data/test/rubygems/test_gem_available_set.rb +0 -130
- data/test/rubygems/test_gem_command.rb +0 -248
- data/test/rubygems/test_gem_command_manager.rb +0 -264
- data/test/rubygems/test_gem_commands_build_command.rb +0 -121
- data/test/rubygems/test_gem_commands_cert_command.rb +0 -671
- data/test/rubygems/test_gem_commands_check_command.rb +0 -69
- data/test/rubygems/test_gem_commands_cleanup_command.rb +0 -197
- data/test/rubygems/test_gem_commands_contents_command.rb +0 -240
- data/test/rubygems/test_gem_commands_dependency_command.rb +0 -230
- data/test/rubygems/test_gem_commands_environment_command.rb +0 -154
- data/test/rubygems/test_gem_commands_fetch_command.rb +0 -127
- data/test/rubygems/test_gem_commands_generate_index_command.rb +0 -51
- data/test/rubygems/test_gem_commands_help_command.rb +0 -75
- data/test/rubygems/test_gem_commands_install_command.rb +0 -1007
- data/test/rubygems/test_gem_commands_list_command.rb +0 -34
- data/test/rubygems/test_gem_commands_lock_command.rb +0 -69
- data/test/rubygems/test_gem_commands_mirror.rb +0 -20
- data/test/rubygems/test_gem_commands_open_command.rb +0 -70
- data/test/rubygems/test_gem_commands_outdated_command.rb +0 -33
- data/test/rubygems/test_gem_commands_owner_command.rb +0 -205
- data/test/rubygems/test_gem_commands_pristine_command.rb +0 -491
- data/test/rubygems/test_gem_commands_push_command.rb +0 -330
- data/test/rubygems/test_gem_commands_query_command.rb +0 -657
- data/test/rubygems/test_gem_commands_search_command.rb +0 -18
- data/test/rubygems/test_gem_commands_server_command.rb +0 -60
- data/test/rubygems/test_gem_commands_setup_command.rb +0 -136
- data/test/rubygems/test_gem_commands_sources_command.rb +0 -249
- data/test/rubygems/test_gem_commands_specification_command.rb +0 -251
- data/test/rubygems/test_gem_commands_stale_command.rb +0 -43
- data/test/rubygems/test_gem_commands_uninstall_command.rb +0 -283
- data/test/rubygems/test_gem_commands_unpack_command.rb +0 -209
- data/test/rubygems/test_gem_commands_update_command.rb +0 -514
- data/test/rubygems/test_gem_commands_which_command.rb +0 -87
- data/test/rubygems/test_gem_commands_yank_command.rb +0 -100
- data/test/rubygems/test_gem_config_file.rb +0 -491
- data/test/rubygems/test_gem_dependency.rb +0 -362
- data/test/rubygems/test_gem_dependency_installer.rb +0 -1235
- data/test/rubygems/test_gem_dependency_list.rb +0 -260
- data/test/rubygems/test_gem_dependency_resolution_error.rb +0 -29
- data/test/rubygems/test_gem_doctor.rb +0 -169
- data/test/rubygems/test_gem_ext_builder.rb +0 -341
- data/test/rubygems/test_gem_ext_cmake_builder.rb +0 -87
- data/test/rubygems/test_gem_ext_configure_builder.rb +0 -87
- data/test/rubygems/test_gem_ext_ext_conf_builder.rb +0 -211
- data/test/rubygems/test_gem_ext_rake_builder.rb +0 -65
- data/test/rubygems/test_gem_gem_runner.rb +0 -69
- data/test/rubygems/test_gem_gemcutter_utilities.rb +0 -235
- data/test/rubygems/test_gem_impossible_dependencies_error.rb +0 -62
- data/test/rubygems/test_gem_indexer.rb +0 -367
- data/test/rubygems/test_gem_install_update_options.rb +0 -197
- data/test/rubygems/test_gem_installer.rb +0 -1552
- data/test/rubygems/test_gem_local_remote_options.rb +0 -134
- data/test/rubygems/test_gem_name_tuple.rb +0 -45
- data/test/rubygems/test_gem_package.rb +0 -876
- data/test/rubygems/test_gem_package_old.rb +0 -90
- data/test/rubygems/test_gem_package_tar_header.rb +0 -147
- data/test/rubygems/test_gem_package_tar_reader.rb +0 -90
- data/test/rubygems/test_gem_package_tar_reader_entry.rb +0 -142
- data/test/rubygems/test_gem_package_tar_writer.rb +0 -264
- data/test/rubygems/test_gem_package_task.rb +0 -84
- data/test/rubygems/test_gem_path_support.rb +0 -121
- data/test/rubygems/test_gem_platform.rb +0 -308
- data/test/rubygems/test_gem_rdoc.rb +0 -270
- data/test/rubygems/test_gem_remote_fetcher.rb +0 -1051
- data/test/rubygems/test_gem_request.rb +0 -363
- data/test/rubygems/test_gem_request_connection_pools.rb +0 -130
- data/test/rubygems/test_gem_request_set.rb +0 -595
- data/test/rubygems/test_gem_request_set_gem_dependency_api.rb +0 -831
- data/test/rubygems/test_gem_request_set_lockfile.rb +0 -470
- data/test/rubygems/test_gem_request_set_lockfile_parser.rb +0 -549
- data/test/rubygems/test_gem_request_set_lockfile_tokenizer.rb +0 -306
- data/test/rubygems/test_gem_requirement.rb +0 -387
- data/test/rubygems/test_gem_resolver.rb +0 -715
- data/test/rubygems/test_gem_resolver_activation_request.rb +0 -74
- data/test/rubygems/test_gem_resolver_api_set.rb +0 -209
- data/test/rubygems/test_gem_resolver_api_specification.rb +0 -145
- data/test/rubygems/test_gem_resolver_best_set.rb +0 -138
- data/test/rubygems/test_gem_resolver_composed_set.rb +0 -46
- data/test/rubygems/test_gem_resolver_conflict.rb +0 -88
- data/test/rubygems/test_gem_resolver_dependency_request.rb +0 -85
- data/test/rubygems/test_gem_resolver_git_set.rb +0 -190
- data/test/rubygems/test_gem_resolver_git_specification.rb +0 -114
- data/test/rubygems/test_gem_resolver_index_set.rb +0 -90
- data/test/rubygems/test_gem_resolver_index_specification.rb +0 -90
- data/test/rubygems/test_gem_resolver_installed_specification.rb +0 -50
- data/test/rubygems/test_gem_resolver_installer_set.rb +0 -258
- data/test/rubygems/test_gem_resolver_local_specification.rb +0 -46
- data/test/rubygems/test_gem_resolver_lock_set.rb +0 -64
- data/test/rubygems/test_gem_resolver_lock_specification.rb +0 -100
- data/test/rubygems/test_gem_resolver_requirement_list.rb +0 -21
- data/test/rubygems/test_gem_resolver_specification.rb +0 -65
- data/test/rubygems/test_gem_resolver_vendor_set.rb +0 -84
- data/test/rubygems/test_gem_resolver_vendor_specification.rb +0 -84
- data/test/rubygems/test_gem_security.rb +0 -307
- data/test/rubygems/test_gem_security_policy.rb +0 -541
- data/test/rubygems/test_gem_security_signer.rb +0 -209
- data/test/rubygems/test_gem_security_trust_dir.rb +0 -101
- data/test/rubygems/test_gem_server.rb +0 -409
- data/test/rubygems/test_gem_silent_ui.rb +0 -117
- data/test/rubygems/test_gem_source.rb +0 -242
- data/test/rubygems/test_gem_source_fetch_problem.rb +0 -20
- data/test/rubygems/test_gem_source_git.rb +0 -309
- data/test/rubygems/test_gem_source_installed.rb +0 -37
- data/test/rubygems/test_gem_source_list.rb +0 -118
- data/test/rubygems/test_gem_source_local.rb +0 -107
- data/test/rubygems/test_gem_source_lock.rb +0 -115
- data/test/rubygems/test_gem_source_specific_file.rb +0 -76
- data/test/rubygems/test_gem_source_vendor.rb +0 -32
- data/test/rubygems/test_gem_spec_fetcher.rb +0 -311
- data/test/rubygems/test_gem_specification.rb +0 -3519
- data/test/rubygems/test_gem_stream_ui.rb +0 -239
- data/test/rubygems/test_gem_stub_specification.rb +0 -217
- data/test/rubygems/test_gem_text.rb +0 -77
- data/test/rubygems/test_gem_uninstaller.rb +0 -485
- data/test/rubygems/test_gem_unsatisfiable_dependency_error.rb +0 -33
- data/test/rubygems/test_gem_uri_formatter.rb +0 -29
- data/test/rubygems/test_gem_util.rb +0 -40
- data/test/rubygems/test_gem_validator.rb +0 -46
- data/test/rubygems/test_gem_version.rb +0 -222
- data/test/rubygems/test_gem_version_option.rb +0 -152
- data/test/rubygems/test_kernel.rb +0 -86
- data/test/rubygems/test_require.rb +0 -322
- data/test/rubygems/wrong_key_cert.pem +0 -18
- data/test/rubygems/wrong_key_cert_32.pem +0 -18
- data/util/CL2notes +0 -56
- data/util/create_certs.rb +0 -157
- data/util/create_encrypted_key.rb +0 -17
- data/util/generate_spdx_license_list.rb +0 -51
- data/util/update_bundled_ca_certificates.rb +0 -118
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
module Gem::Resolver::Molinillo
|
3
4
|
class Resolver
|
4
5
|
# A specific resolution from a given {Resolver}
|
@@ -8,22 +9,125 @@ module Gem::Resolver::Molinillo
|
|
8
9
|
# @attr [{String,Nil=>[Object]}] requirements the requirements that caused the conflict
|
9
10
|
# @attr [Object, nil] existing the existing spec that was in conflict with
|
10
11
|
# the {#possibility}
|
11
|
-
# @attr [Object]
|
12
|
-
# to a conflict
|
12
|
+
# @attr [Object] possibility_set the set of specs that was unable to be
|
13
|
+
# activated due to a conflict.
|
13
14
|
# @attr [Object] locked_requirement the relevant locking requirement.
|
14
15
|
# @attr [Array<Array<Object>>] requirement_trees the different requirement
|
15
16
|
# trees that led to every requirement for the conflicting name.
|
16
17
|
# @attr [{String=>Object}] activated_by_name the already-activated specs.
|
18
|
+
# @attr [Object] underlying_error an error that has occurred during resolution, and
|
19
|
+
# will be raised at the end of it if no resolution is found.
|
17
20
|
Conflict = Struct.new(
|
18
21
|
:requirement,
|
19
22
|
:requirements,
|
20
23
|
:existing,
|
21
|
-
:
|
24
|
+
:possibility_set,
|
22
25
|
:locked_requirement,
|
23
26
|
:requirement_trees,
|
24
|
-
:activated_by_name
|
27
|
+
:activated_by_name,
|
28
|
+
:underlying_error
|
25
29
|
)
|
26
30
|
|
31
|
+
class Conflict
|
32
|
+
# @return [Object] a spec that was unable to be activated due to a conflict
|
33
|
+
def possibility
|
34
|
+
possibility_set && possibility_set.latest_version
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
# A collection of possibility states that share the same dependencies
|
39
|
+
# @attr [Array] dependencies the dependencies for this set of possibilities
|
40
|
+
# @attr [Array] possibilities the possibilities
|
41
|
+
PossibilitySet = Struct.new(:dependencies, :possibilities)
|
42
|
+
|
43
|
+
class PossibilitySet
|
44
|
+
# String representation of the possibility set, for debugging
|
45
|
+
def to_s
|
46
|
+
"[#{possibilities.join(', ')}]"
|
47
|
+
end
|
48
|
+
|
49
|
+
# @return [Object] most up-to-date dependency in the possibility set
|
50
|
+
def latest_version
|
51
|
+
possibilities.last
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
# Details of the state to unwind to when a conflict occurs, and the cause of the unwind
|
56
|
+
# @attr [Integer] state_index the index of the state to unwind to
|
57
|
+
# @attr [Object] state_requirement the requirement of the state we're unwinding to
|
58
|
+
# @attr [Array] requirement_tree for the requirement we're relaxing
|
59
|
+
# @attr [Array] conflicting_requirements the requirements that combined to cause the conflict
|
60
|
+
# @attr [Array] requirement_trees for the conflict
|
61
|
+
# @attr [Array] requirements_unwound_to_instead array of unwind requirements that were chosen over this unwind
|
62
|
+
UnwindDetails = Struct.new(
|
63
|
+
:state_index,
|
64
|
+
:state_requirement,
|
65
|
+
:requirement_tree,
|
66
|
+
:conflicting_requirements,
|
67
|
+
:requirement_trees,
|
68
|
+
:requirements_unwound_to_instead
|
69
|
+
)
|
70
|
+
|
71
|
+
class UnwindDetails
|
72
|
+
include Comparable
|
73
|
+
|
74
|
+
# We compare UnwindDetails when choosing which state to unwind to. If
|
75
|
+
# two options have the same state_index we prefer the one most
|
76
|
+
# removed from a requirement that caused the conflict. Both options
|
77
|
+
# would unwind to the same state, but a `grandparent` option will
|
78
|
+
# filter out fewer of its possibilities after doing so - where a state
|
79
|
+
# is both a `parent` and a `grandparent` to requirements that have
|
80
|
+
# caused a conflict this is the correct behaviour.
|
81
|
+
# @param [UnwindDetail] other UnwindDetail to be compared
|
82
|
+
# @return [Integer] integer specifying ordering
|
83
|
+
def <=>(other)
|
84
|
+
if state_index > other.state_index
|
85
|
+
1
|
86
|
+
elsif state_index == other.state_index
|
87
|
+
reversed_requirement_tree_index <=> other.reversed_requirement_tree_index
|
88
|
+
else
|
89
|
+
-1
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
# @return [Integer] index of state requirement in reversed requirement tree
|
94
|
+
# (the conflicting requirement itself will be at position 0)
|
95
|
+
def reversed_requirement_tree_index
|
96
|
+
@reversed_requirement_tree_index ||=
|
97
|
+
if state_requirement
|
98
|
+
requirement_tree.reverse.index(state_requirement)
|
99
|
+
else
|
100
|
+
999_999
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
# @return [Boolean] where the requirement of the state we're unwinding
|
105
|
+
# to directly caused the conflict. Note: in this case, it is
|
106
|
+
# impossible for the state we're unwinding to to be a parent of
|
107
|
+
# any of the other conflicting requirements (or we would have
|
108
|
+
# circularity)
|
109
|
+
def unwinding_to_primary_requirement?
|
110
|
+
requirement_tree.last == state_requirement
|
111
|
+
end
|
112
|
+
|
113
|
+
# @return [Array] array of sub-dependencies to avoid when choosing a
|
114
|
+
# new possibility for the state we've unwound to. Only relevant for
|
115
|
+
# non-primary unwinds
|
116
|
+
def sub_dependencies_to_avoid
|
117
|
+
@requirements_to_avoid ||=
|
118
|
+
requirement_trees.map do |tree|
|
119
|
+
index = tree.index(state_requirement)
|
120
|
+
tree[index + 1] if index
|
121
|
+
end.compact
|
122
|
+
end
|
123
|
+
|
124
|
+
# @return [Array] array of all the requirements that led to the need for
|
125
|
+
# this unwind
|
126
|
+
def all_requirements
|
127
|
+
@all_requirements ||= requirement_trees.flatten(1)
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
27
131
|
# @return [SpecificationProvider] the provider that knows about
|
28
132
|
# dependencies, requirements, specifications, versions, etc.
|
29
133
|
attr_reader :specification_provider
|
@@ -52,6 +156,7 @@ module Gem::Resolver::Molinillo
|
|
52
156
|
@base = base
|
53
157
|
@states = []
|
54
158
|
@iteration_counter = 0
|
159
|
+
@parents_of = Hash.new { |h, k| h[k] = [] }
|
55
160
|
end
|
56
161
|
|
57
162
|
# Resolves the {#original_requested} dependencies into a full dependency
|
@@ -63,16 +168,21 @@ module Gem::Resolver::Molinillo
|
|
63
168
|
start_resolution
|
64
169
|
|
65
170
|
while state
|
66
|
-
break
|
171
|
+
break if !state.requirement && state.requirements.empty?
|
67
172
|
indicate_progress
|
68
173
|
if state.respond_to?(:pop_possibility_state) # DependencyState
|
69
174
|
debug(depth) { "Creating possibility state for #{requirement} (#{possibilities.count} remaining)" }
|
70
|
-
state.pop_possibility_state.tap
|
175
|
+
state.pop_possibility_state.tap do |s|
|
176
|
+
if s
|
177
|
+
states.push(s)
|
178
|
+
activated.tag(s)
|
179
|
+
end
|
180
|
+
end
|
71
181
|
end
|
72
182
|
process_topmost_state
|
73
183
|
end
|
74
184
|
|
75
|
-
|
185
|
+
resolve_activated_specs
|
76
186
|
ensure
|
77
187
|
end_resolution
|
78
188
|
end
|
@@ -97,12 +207,25 @@ module Gem::Resolver::Molinillo
|
|
97
207
|
def start_resolution
|
98
208
|
@started_at = Time.now
|
99
209
|
|
100
|
-
|
210
|
+
push_initial_state
|
101
211
|
|
102
|
-
debug { "Starting resolution (#{@started_at})" }
|
212
|
+
debug { "Starting resolution (#{@started_at})\nUser-requested dependencies: #{original_requested}" }
|
103
213
|
resolver_ui.before_resolution
|
104
214
|
end
|
105
215
|
|
216
|
+
def resolve_activated_specs
|
217
|
+
activated.vertices.each do |_, vertex|
|
218
|
+
next unless vertex.payload
|
219
|
+
|
220
|
+
latest_version = vertex.payload.possibilities.reverse_each.find do |possibility|
|
221
|
+
vertex.requirements.all? { |req| requirement_satisfied_by?(req, activated, possibility) }
|
222
|
+
end
|
223
|
+
|
224
|
+
activated.set_payload(vertex.name, latest_version)
|
225
|
+
end
|
226
|
+
activated.freeze
|
227
|
+
end
|
228
|
+
|
106
229
|
# Ends the resolution process
|
107
230
|
# @return [void]
|
108
231
|
def end_resolution
|
@@ -115,30 +238,14 @@ module Gem::Resolver::Molinillo
|
|
115
238
|
debug { 'Activated: ' + Hash[activated.vertices.select { |_n, v| v.payload }].keys.join(', ') } if state
|
116
239
|
end
|
117
240
|
|
118
|
-
|
119
|
-
|
241
|
+
require_relative 'state'
|
242
|
+
require_relative 'modules/specification_provider'
|
120
243
|
|
121
|
-
|
122
|
-
|
123
|
-
current_state = state || ResolutionState.empty
|
124
|
-
current_state.send(member, *args, &block)
|
125
|
-
end
|
126
|
-
end
|
244
|
+
require_relative 'delegates/resolution_state'
|
245
|
+
require_relative 'delegates/specification_provider'
|
127
246
|
|
128
|
-
|
129
|
-
|
130
|
-
begin
|
131
|
-
specification_provider.send(instance_method, *args, &block)
|
132
|
-
rescue NoSuchDependencyError => error
|
133
|
-
if state
|
134
|
-
vertex = activated.vertex_named(name_for error.dependency)
|
135
|
-
error.required_by += vertex.incoming_edges.map { |e| e.origin.name }
|
136
|
-
error.required_by << name_for_explicit_dependency_source unless vertex.explicit_requirements.empty?
|
137
|
-
end
|
138
|
-
raise
|
139
|
-
end
|
140
|
-
end
|
141
|
-
end
|
247
|
+
include Gem::Resolver::Molinillo::Delegates::ResolutionState
|
248
|
+
include Gem::Resolver::Molinillo::Delegates::SpecificationProvider
|
142
249
|
|
143
250
|
# Processes the topmost available {RequirementState} on the stack
|
144
251
|
# @return [void]
|
@@ -146,9 +253,12 @@ module Gem::Resolver::Molinillo
|
|
146
253
|
if possibility
|
147
254
|
attempt_to_activate
|
148
255
|
else
|
149
|
-
create_conflict
|
150
|
-
unwind_for_conflict
|
256
|
+
create_conflict
|
257
|
+
unwind_for_conflict
|
151
258
|
end
|
259
|
+
rescue CircularDependencyError => underlying_error
|
260
|
+
create_conflict(underlying_error)
|
261
|
+
unwind_for_conflict
|
152
262
|
end
|
153
263
|
|
154
264
|
# @return [Object] the current possibility that the resolution is trying
|
@@ -163,106 +273,349 @@ module Gem::Resolver::Molinillo
|
|
163
273
|
states.last
|
164
274
|
end
|
165
275
|
|
166
|
-
# Creates the initial state for the resolution, based upon the
|
276
|
+
# Creates and pushes the initial state for the resolution, based upon the
|
167
277
|
# {#requested} dependencies
|
168
|
-
# @return [
|
169
|
-
def
|
278
|
+
# @return [void]
|
279
|
+
def push_initial_state
|
170
280
|
graph = DependencyGraph.new.tap do |dg|
|
171
|
-
original_requested.each
|
281
|
+
original_requested.each do |requested|
|
282
|
+
vertex = dg.add_vertex(name_for(requested), nil, true)
|
283
|
+
vertex.explicit_requirements << requested
|
284
|
+
end
|
285
|
+
dg.tag(:initial_state)
|
172
286
|
end
|
173
287
|
|
174
|
-
|
175
|
-
initial_requirement = requirements.shift
|
176
|
-
DependencyState.new(
|
177
|
-
initial_requirement && name_for(initial_requirement),
|
178
|
-
requirements,
|
179
|
-
graph,
|
180
|
-
initial_requirement,
|
181
|
-
initial_requirement && search_for(initial_requirement),
|
182
|
-
0,
|
183
|
-
{}
|
184
|
-
)
|
288
|
+
push_state_for_requirements(original_requested, true, graph)
|
185
289
|
end
|
186
290
|
|
187
291
|
# Unwinds the states stack because a conflict has been encountered
|
188
292
|
# @return [void]
|
189
293
|
def unwind_for_conflict
|
190
|
-
|
294
|
+
details_for_unwind = build_details_for_unwind
|
295
|
+
unwind_options = unused_unwind_options
|
296
|
+
debug(depth) { "Unwinding for conflict: #{requirement} to #{details_for_unwind.state_index / 2}" }
|
191
297
|
conflicts.tap do |c|
|
192
|
-
states.slice!((
|
193
|
-
|
298
|
+
sliced_states = states.slice!((details_for_unwind.state_index + 1)..-1)
|
299
|
+
raise_error_unless_state(c)
|
300
|
+
activated.rewind_to(sliced_states.first || :initial_state) if sliced_states
|
194
301
|
state.conflicts = c
|
302
|
+
state.unused_unwind_options = unwind_options
|
303
|
+
filter_possibilities_after_unwind(details_for_unwind)
|
304
|
+
index = states.size - 1
|
305
|
+
@parents_of.each { |_, a| a.reject! { |i| i >= index } }
|
306
|
+
state.unused_unwind_options.reject! { |uw| uw.state_index >= index }
|
307
|
+
end
|
308
|
+
end
|
309
|
+
|
310
|
+
# Raises a VersionConflict error, or any underlying error, if there is no
|
311
|
+
# current state
|
312
|
+
# @return [void]
|
313
|
+
def raise_error_unless_state(conflicts)
|
314
|
+
return if state
|
315
|
+
|
316
|
+
error = conflicts.values.map(&:underlying_error).compact.first
|
317
|
+
raise error || VersionConflict.new(conflicts, specification_provider)
|
318
|
+
end
|
319
|
+
|
320
|
+
# @return [UnwindDetails] Details of the nearest index to which we could unwind
|
321
|
+
def build_details_for_unwind
|
322
|
+
# Get the possible unwinds for the current conflict
|
323
|
+
current_conflict = conflicts[name]
|
324
|
+
binding_requirements = binding_requirements_for_conflict(current_conflict)
|
325
|
+
unwind_details = unwind_options_for_requirements(binding_requirements)
|
326
|
+
|
327
|
+
last_detail_for_current_unwind = unwind_details.sort.last
|
328
|
+
current_detail = last_detail_for_current_unwind
|
329
|
+
|
330
|
+
# Look for past conflicts that could be unwound to affect the
|
331
|
+
# requirement tree for the current conflict
|
332
|
+
all_reqs = last_detail_for_current_unwind.all_requirements
|
333
|
+
all_reqs_size = all_reqs.size
|
334
|
+
relevant_unused_unwinds = unused_unwind_options.select do |alternative|
|
335
|
+
diff_reqs = all_reqs - alternative.requirements_unwound_to_instead
|
336
|
+
next if diff_reqs.size == all_reqs_size
|
337
|
+
# Find the highest index unwind whilst looping through
|
338
|
+
current_detail = alternative if alternative > current_detail
|
339
|
+
alternative
|
340
|
+
end
|
341
|
+
|
342
|
+
# Add the current unwind options to the `unused_unwind_options` array.
|
343
|
+
# The "used" option will be filtered out during `unwind_for_conflict`.
|
344
|
+
state.unused_unwind_options += unwind_details.reject { |detail| detail.state_index == -1 }
|
345
|
+
|
346
|
+
# Update the requirements_unwound_to_instead on any relevant unused unwinds
|
347
|
+
relevant_unused_unwinds.each do |d|
|
348
|
+
(d.requirements_unwound_to_instead << current_detail.state_requirement).uniq!
|
349
|
+
end
|
350
|
+
unwind_details.each do |d|
|
351
|
+
(d.requirements_unwound_to_instead << current_detail.state_requirement).uniq!
|
352
|
+
end
|
353
|
+
|
354
|
+
current_detail
|
355
|
+
end
|
356
|
+
|
357
|
+
# @param [Array<Object>] binding_requirements array of requirements that combine to create a conflict
|
358
|
+
# @return [Array<UnwindDetails>] array of UnwindDetails that have a chance
|
359
|
+
# of resolving the passed requirements
|
360
|
+
def unwind_options_for_requirements(binding_requirements)
|
361
|
+
unwind_details = []
|
362
|
+
|
363
|
+
trees = []
|
364
|
+
binding_requirements.reverse_each do |r|
|
365
|
+
partial_tree = [r]
|
366
|
+
trees << partial_tree
|
367
|
+
unwind_details << UnwindDetails.new(-1, nil, partial_tree, binding_requirements, trees, [])
|
368
|
+
|
369
|
+
# If this requirement has alternative possibilities, check if any would
|
370
|
+
# satisfy the other requirements that created this conflict
|
371
|
+
requirement_state = find_state_for(r)
|
372
|
+
if conflict_fixing_possibilities?(requirement_state, binding_requirements)
|
373
|
+
unwind_details << UnwindDetails.new(
|
374
|
+
states.index(requirement_state),
|
375
|
+
r,
|
376
|
+
partial_tree,
|
377
|
+
binding_requirements,
|
378
|
+
trees,
|
379
|
+
[]
|
380
|
+
)
|
381
|
+
end
|
382
|
+
|
383
|
+
# Next, look at the parent of this requirement, and check if the requirement
|
384
|
+
# could have been avoided if an alternative PossibilitySet had been chosen
|
385
|
+
parent_r = parent_of(r)
|
386
|
+
next if parent_r.nil?
|
387
|
+
partial_tree.unshift(parent_r)
|
388
|
+
requirement_state = find_state_for(parent_r)
|
389
|
+
if requirement_state.possibilities.any? { |set| !set.dependencies.include?(r) }
|
390
|
+
unwind_details << UnwindDetails.new(
|
391
|
+
states.index(requirement_state),
|
392
|
+
parent_r,
|
393
|
+
partial_tree,
|
394
|
+
binding_requirements,
|
395
|
+
trees,
|
396
|
+
[]
|
397
|
+
)
|
398
|
+
end
|
399
|
+
|
400
|
+
# Finally, look at the grandparent and up of this requirement, looking
|
401
|
+
# for any possibilities that wouldn't create their parent requirement
|
402
|
+
grandparent_r = parent_of(parent_r)
|
403
|
+
until grandparent_r.nil?
|
404
|
+
partial_tree.unshift(grandparent_r)
|
405
|
+
requirement_state = find_state_for(grandparent_r)
|
406
|
+
if requirement_state.possibilities.any? { |set| !set.dependencies.include?(parent_r) }
|
407
|
+
unwind_details << UnwindDetails.new(
|
408
|
+
states.index(requirement_state),
|
409
|
+
grandparent_r,
|
410
|
+
partial_tree,
|
411
|
+
binding_requirements,
|
412
|
+
trees,
|
413
|
+
[]
|
414
|
+
)
|
415
|
+
end
|
416
|
+
parent_r = grandparent_r
|
417
|
+
grandparent_r = parent_of(parent_r)
|
418
|
+
end
|
419
|
+
end
|
420
|
+
|
421
|
+
unwind_details
|
422
|
+
end
|
423
|
+
|
424
|
+
# @param [DependencyState] state
|
425
|
+
# @param [Array] binding_requirements array of requirements
|
426
|
+
# @return [Boolean] whether or not the given state has any possibilities
|
427
|
+
# that could satisfy the given requirements
|
428
|
+
def conflict_fixing_possibilities?(state, binding_requirements)
|
429
|
+
return false unless state
|
430
|
+
|
431
|
+
state.possibilities.any? do |possibility_set|
|
432
|
+
possibility_set.possibilities.any? do |poss|
|
433
|
+
possibility_satisfies_requirements?(poss, binding_requirements)
|
434
|
+
end
|
435
|
+
end
|
436
|
+
end
|
437
|
+
|
438
|
+
# Filter's a state's possibilities to remove any that would not fix the
|
439
|
+
# conflict we've just rewound from
|
440
|
+
# @param [UnwindDetails] unwind_details details of the conflict just
|
441
|
+
# unwound from
|
442
|
+
# @return [void]
|
443
|
+
def filter_possibilities_after_unwind(unwind_details)
|
444
|
+
return unless state && !state.possibilities.empty?
|
445
|
+
|
446
|
+
if unwind_details.unwinding_to_primary_requirement?
|
447
|
+
filter_possibilities_for_primary_unwind(unwind_details)
|
448
|
+
else
|
449
|
+
filter_possibilities_for_parent_unwind(unwind_details)
|
450
|
+
end
|
451
|
+
end
|
452
|
+
|
453
|
+
# Filter's a state's possibilities to remove any that would not satisfy
|
454
|
+
# the requirements in the conflict we've just rewound from
|
455
|
+
# @param [UnwindDetails] unwind_details details of the conflict just unwound from
|
456
|
+
# @return [void]
|
457
|
+
def filter_possibilities_for_primary_unwind(unwind_details)
|
458
|
+
unwinds_to_state = unused_unwind_options.select { |uw| uw.state_index == unwind_details.state_index }
|
459
|
+
unwinds_to_state << unwind_details
|
460
|
+
unwind_requirement_sets = unwinds_to_state.map(&:conflicting_requirements)
|
461
|
+
|
462
|
+
state.possibilities.reject! do |possibility_set|
|
463
|
+
possibility_set.possibilities.none? do |poss|
|
464
|
+
unwind_requirement_sets.any? do |requirements|
|
465
|
+
possibility_satisfies_requirements?(poss, requirements)
|
466
|
+
end
|
467
|
+
end
|
468
|
+
end
|
469
|
+
end
|
470
|
+
|
471
|
+
# @param [Object] possibility a single possibility
|
472
|
+
# @param [Array] requirements an array of requirements
|
473
|
+
# @return [Boolean] whether the possibility satisfies all of the
|
474
|
+
# given requirements
|
475
|
+
def possibility_satisfies_requirements?(possibility, requirements)
|
476
|
+
name = name_for(possibility)
|
477
|
+
|
478
|
+
activated.tag(:swap)
|
479
|
+
activated.set_payload(name, possibility) if activated.vertex_named(name)
|
480
|
+
satisfied = requirements.all? { |r| requirement_satisfied_by?(r, activated, possibility) }
|
481
|
+
activated.rewind_to(:swap)
|
482
|
+
|
483
|
+
satisfied
|
484
|
+
end
|
485
|
+
|
486
|
+
# Filter's a state's possibilities to remove any that would (eventually)
|
487
|
+
# create a requirement in the conflict we've just rewound from
|
488
|
+
# @param [UnwindDetails] unwind_details details of the conflict just unwound from
|
489
|
+
# @return [void]
|
490
|
+
def filter_possibilities_for_parent_unwind(unwind_details)
|
491
|
+
unwinds_to_state = unused_unwind_options.select { |uw| uw.state_index == unwind_details.state_index }
|
492
|
+
unwinds_to_state << unwind_details
|
493
|
+
|
494
|
+
primary_unwinds = unwinds_to_state.select(&:unwinding_to_primary_requirement?).uniq
|
495
|
+
parent_unwinds = unwinds_to_state.uniq - primary_unwinds
|
496
|
+
|
497
|
+
allowed_possibility_sets = primary_unwinds.flat_map do |unwind|
|
498
|
+
states[unwind.state_index].possibilities.select do |possibility_set|
|
499
|
+
possibility_set.possibilities.any? do |poss|
|
500
|
+
possibility_satisfies_requirements?(poss, unwind.conflicting_requirements)
|
501
|
+
end
|
502
|
+
end
|
503
|
+
end
|
504
|
+
|
505
|
+
requirements_to_avoid = parent_unwinds.flat_map(&:sub_dependencies_to_avoid)
|
506
|
+
|
507
|
+
state.possibilities.reject! do |possibility_set|
|
508
|
+
!allowed_possibility_sets.include?(possibility_set) &&
|
509
|
+
(requirements_to_avoid - possibility_set.dependencies).empty?
|
195
510
|
end
|
196
511
|
end
|
197
512
|
|
198
|
-
# @
|
199
|
-
#
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
513
|
+
# @param [Conflict] conflict
|
514
|
+
# @return [Array] minimal array of requirements that would cause the passed
|
515
|
+
# conflict to occur.
|
516
|
+
def binding_requirements_for_conflict(conflict)
|
517
|
+
return [conflict.requirement] if conflict.possibility.nil?
|
518
|
+
|
519
|
+
possible_binding_requirements = conflict.requirements.values.flatten(1).uniq
|
520
|
+
|
521
|
+
# When there's a `CircularDependency` error the conflicting requirement
|
522
|
+
# (the one causing the circular) won't be `conflict.requirement`
|
523
|
+
# (which won't be for the right state, because we won't have created it,
|
524
|
+
# because it's circular).
|
525
|
+
# We need to make sure we have that requirement in the conflict's list,
|
526
|
+
# otherwise we won't be able to unwind properly, so we just return all
|
527
|
+
# the requirements for the conflict.
|
528
|
+
return possible_binding_requirements if conflict.underlying_error
|
529
|
+
|
530
|
+
possibilities = search_for(conflict.requirement)
|
531
|
+
|
532
|
+
# If all the requirements together don't filter out all possibilities,
|
533
|
+
# then the only two requirements we need to consider are the initial one
|
534
|
+
# (where the dependency's version was first chosen) and the last
|
535
|
+
if binding_requirement_in_set?(nil, possible_binding_requirements, possibilities)
|
536
|
+
return [conflict.requirement, requirement_for_existing_name(name_for(conflict.requirement))].compact
|
207
537
|
end
|
208
538
|
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
539
|
+
# Loop through the possible binding requirements, removing each one
|
540
|
+
# that doesn't bind. Use a `reverse_each` as we want the earliest set of
|
541
|
+
# binding requirements, and don't use `reject!` as we wish to refine the
|
542
|
+
# array *on each iteration*.
|
543
|
+
binding_requirements = possible_binding_requirements.dup
|
544
|
+
possible_binding_requirements.reverse_each do |req|
|
545
|
+
next if req == conflict.requirement
|
546
|
+
unless binding_requirement_in_set?(req, binding_requirements, possibilities)
|
547
|
+
binding_requirements -= [req]
|
548
|
+
end
|
213
549
|
end
|
214
|
-
|
550
|
+
|
551
|
+
binding_requirements
|
215
552
|
end
|
216
553
|
|
554
|
+
# @param [Object] requirement we wish to check
|
555
|
+
# @param [Array] possible_binding_requirements array of requirements
|
556
|
+
# @param [Array] possibilities array of possibilities the requirements will be used to filter
|
557
|
+
# @return [Boolean] whether or not the given requirement is required to filter
|
558
|
+
# out all elements of the array of possibilities.
|
559
|
+
def binding_requirement_in_set?(requirement, possible_binding_requirements, possibilities)
|
560
|
+
possibilities.any? do |poss|
|
561
|
+
possibility_satisfies_requirements?(poss, possible_binding_requirements - [requirement])
|
562
|
+
end
|
563
|
+
end
|
564
|
+
|
565
|
+
# @param [Object] requirement
|
217
566
|
# @return [Object] the requirement that led to `requirement` being added
|
218
567
|
# to the list of requirements.
|
219
568
|
def parent_of(requirement)
|
220
|
-
return
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
seen && s.requirement != requirement && !s.requirements.include?(requirement)
|
225
|
-
end
|
226
|
-
state && state.requirement
|
569
|
+
return unless requirement
|
570
|
+
return unless index = @parents_of[requirement].last
|
571
|
+
return unless parent_state = @states[index]
|
572
|
+
parent_state.requirement
|
227
573
|
end
|
228
574
|
|
575
|
+
# @param [String] name
|
229
576
|
# @return [Object] the requirement that led to a version of a possibility
|
230
577
|
# with the given name being activated.
|
231
578
|
def requirement_for_existing_name(name)
|
232
|
-
return nil unless activated.vertex_named(name)
|
233
|
-
|
579
|
+
return nil unless vertex = activated.vertex_named(name)
|
580
|
+
return nil unless vertex.payload
|
581
|
+
states.find { |s| s.name == name }.requirement
|
234
582
|
end
|
235
583
|
|
584
|
+
# @param [Object] requirement
|
236
585
|
# @return [ResolutionState] the state whose `requirement` is the given
|
237
586
|
# `requirement`.
|
238
587
|
def find_state_for(requirement)
|
239
588
|
return nil unless requirement
|
240
|
-
states.
|
241
|
-
end
|
242
|
-
|
243
|
-
# @return [Boolean] whether or not the given state has any possibilities
|
244
|
-
# left.
|
245
|
-
def state_any?(state)
|
246
|
-
state && state.possibilities.any?
|
589
|
+
states.find { |i| requirement == i.requirement }
|
247
590
|
end
|
248
591
|
|
592
|
+
# @param [Object] underlying_error
|
249
593
|
# @return [Conflict] a {Conflict} that reflects the failure to activate
|
250
594
|
# the {#possibility} in conjunction with the current {#state}
|
251
|
-
def create_conflict
|
595
|
+
def create_conflict(underlying_error = nil)
|
252
596
|
vertex = activated.vertex_named(name)
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
597
|
+
locked_requirement = locked_requirement_named(name)
|
598
|
+
|
599
|
+
requirements = {}
|
600
|
+
unless vertex.explicit_requirements.empty?
|
601
|
+
requirements[name_for_explicit_dependency_source] = vertex.explicit_requirements
|
602
|
+
end
|
603
|
+
requirements[name_for_locking_dependency_source] = [locked_requirement] if locked_requirement
|
604
|
+
vertex.incoming_edges.each do |edge|
|
605
|
+
(requirements[edge.origin.payload.latest_version] ||= []).unshift(edge.requirement)
|
606
|
+
end
|
607
|
+
|
608
|
+
activated_by_name = {}
|
609
|
+
activated.each { |v| activated_by_name[v.name] = v.payload.latest_version if v.payload }
|
258
610
|
conflicts[name] = Conflict.new(
|
259
611
|
requirement,
|
260
|
-
|
261
|
-
vertex.payload,
|
612
|
+
requirements,
|
613
|
+
vertex.payload && vertex.payload.latest_version,
|
262
614
|
possibility,
|
263
|
-
|
615
|
+
locked_requirement,
|
264
616
|
requirement_trees,
|
265
|
-
|
617
|
+
activated_by_name,
|
618
|
+
underlying_error
|
266
619
|
)
|
267
620
|
end
|
268
621
|
|
@@ -273,6 +626,7 @@ module Gem::Resolver::Molinillo
|
|
273
626
|
vertex.requirements.map { |r| requirement_tree_for(r) }
|
274
627
|
end
|
275
628
|
|
629
|
+
# @param [Object] requirement
|
276
630
|
# @return [Array<Object>] the list of requirements that led to
|
277
631
|
# `requirement` being required.
|
278
632
|
def requirement_tree_for(requirement)
|
@@ -312,84 +666,47 @@ module Gem::Resolver::Molinillo
|
|
312
666
|
# @return [void]
|
313
667
|
def attempt_to_activate
|
314
668
|
debug(depth) { 'Attempting to activate ' + possibility.to_s }
|
315
|
-
|
316
|
-
if
|
317
|
-
debug(depth) { "Found existing spec (#{
|
318
|
-
|
669
|
+
existing_vertex = activated.vertex_named(name)
|
670
|
+
if existing_vertex.payload
|
671
|
+
debug(depth) { "Found existing spec (#{existing_vertex.payload})" }
|
672
|
+
attempt_to_filter_existing_spec(existing_vertex)
|
319
673
|
else
|
320
|
-
|
674
|
+
latest = possibility.latest_version
|
675
|
+
possibility.possibilities.select! do |possibility|
|
676
|
+
requirement_satisfied_by?(requirement, activated, possibility)
|
677
|
+
end
|
678
|
+
if possibility.latest_version.nil?
|
679
|
+
# ensure there's a possibility for better error messages
|
680
|
+
possibility.possibilities << latest if latest
|
681
|
+
create_conflict
|
682
|
+
unwind_for_conflict
|
683
|
+
else
|
684
|
+
activate_new_spec
|
685
|
+
end
|
321
686
|
end
|
322
687
|
end
|
323
688
|
|
324
|
-
# Attempts to
|
325
|
-
# already been activated)
|
689
|
+
# Attempts to update the existing vertex's `PossibilitySet` with a filtered version
|
326
690
|
# @return [void]
|
327
|
-
def
|
328
|
-
|
329
|
-
if
|
691
|
+
def attempt_to_filter_existing_spec(vertex)
|
692
|
+
filtered_set = filtered_possibility_set(vertex)
|
693
|
+
if !filtered_set.possibilities.empty?
|
694
|
+
activated.set_payload(name, filtered_set)
|
330
695
|
new_requirements = requirements.dup
|
331
696
|
push_state_for_requirements(new_requirements, false)
|
332
|
-
else
|
333
|
-
return if attempt_to_swap_possibility
|
334
|
-
create_conflict
|
335
|
-
debug(depth) { "Unsatisfied by existing spec (#{existing_node.payload})" }
|
336
|
-
unwind_for_conflict
|
337
|
-
end
|
338
|
-
end
|
339
|
-
|
340
|
-
# Attempts to swp the current {#possibility} with the already-activated
|
341
|
-
# spec with the given name
|
342
|
-
# @return [Boolean] Whether the possibility was swapped into {#activated}
|
343
|
-
def attempt_to_swap_possibility
|
344
|
-
swapped = activated.dup
|
345
|
-
vertex = swapped.vertex_named(name)
|
346
|
-
vertex.payload = possibility
|
347
|
-
return unless vertex.requirements.
|
348
|
-
all? { |r| requirement_satisfied_by?(r, swapped, possibility) }
|
349
|
-
return unless new_spec_satisfied?
|
350
|
-
actual_vertex = activated.vertex_named(name)
|
351
|
-
actual_vertex.payload = possibility
|
352
|
-
fixup_swapped_children(actual_vertex)
|
353
|
-
activate_spec
|
354
|
-
end
|
355
|
-
|
356
|
-
# Ensures there are no orphaned successors to the given {vertex}.
|
357
|
-
# @param [DependencyGraph::Vertex] vertex the vertex to fix up.
|
358
|
-
# @return [void]
|
359
|
-
def fixup_swapped_children(vertex)
|
360
|
-
payload = vertex.payload
|
361
|
-
dep_names = dependencies_for(payload).map(&method(:name_for))
|
362
|
-
vertex.successors.each do |succ|
|
363
|
-
if !dep_names.include?(succ.name) && !succ.root? && succ.predecessors.to_a == [vertex]
|
364
|
-
debug(depth) { "Removing orphaned spec #{succ.name} after swapping #{name}" }
|
365
|
-
activated.detach_vertex_named(succ.name)
|
366
|
-
requirements.delete_if { |r| name_for(r) == succ.name }
|
367
|
-
end
|
368
|
-
end
|
369
|
-
end
|
370
|
-
|
371
|
-
# Attempts to activate the current {#possibility} (given that it hasn't
|
372
|
-
# already been activated)
|
373
|
-
# @return [void]
|
374
|
-
def attempt_to_activate_new_spec
|
375
|
-
if new_spec_satisfied?
|
376
|
-
activate_spec
|
377
697
|
else
|
378
698
|
create_conflict
|
699
|
+
debug(depth) { "Unsatisfied by existing spec (#{vertex.payload})" }
|
379
700
|
unwind_for_conflict
|
380
701
|
end
|
381
702
|
end
|
382
703
|
|
383
|
-
#
|
384
|
-
#
|
385
|
-
|
386
|
-
|
387
|
-
|
388
|
-
|
389
|
-
requirement_satisfied_by?(locked_requirement, activated, possibility)
|
390
|
-
debug(depth) { 'Unsatisfied by requested spec' } unless requested_spec_satisfied
|
391
|
-
debug(depth) { 'Unsatisfied by locked spec' } unless locked_spec_satisfied
|
392
|
-
requested_spec_satisfied && locked_spec_satisfied
|
704
|
+
# Generates a filtered version of the existing vertex's `PossibilitySet` using the
|
705
|
+
# current state's `requirement`
|
706
|
+
# @param [Object] vertex existing vertex
|
707
|
+
# @return [PossibilitySet] filtered possibility set
|
708
|
+
def filtered_possibility_set(vertex)
|
709
|
+
PossibilitySet.new(vertex.payload.dependencies, vertex.payload.possibilities & possibility.possibilities)
|
393
710
|
end
|
394
711
|
|
395
712
|
# @param [String] requirement_name the spec name to search for
|
@@ -403,46 +720,109 @@ module Gem::Resolver::Molinillo
|
|
403
720
|
# Add the current {#possibility} to the dependency graph of the current
|
404
721
|
# {#state}
|
405
722
|
# @return [void]
|
406
|
-
def
|
723
|
+
def activate_new_spec
|
407
724
|
conflicts.delete(name)
|
408
|
-
debug(depth) {
|
409
|
-
|
410
|
-
vertex.payload = possibility
|
725
|
+
debug(depth) { "Activated #{name} at #{possibility}" }
|
726
|
+
activated.set_payload(name, possibility)
|
411
727
|
require_nested_dependencies_for(possibility)
|
412
728
|
end
|
413
729
|
|
414
730
|
# Requires the dependencies that the recently activated spec has
|
415
|
-
# @param [Object]
|
731
|
+
# @param [Object] possibility_set the PossibilitySet that has just been
|
416
732
|
# activated
|
417
733
|
# @return [void]
|
418
|
-
def require_nested_dependencies_for(
|
419
|
-
nested_dependencies = dependencies_for(
|
734
|
+
def require_nested_dependencies_for(possibility_set)
|
735
|
+
nested_dependencies = dependencies_for(possibility_set.latest_version)
|
420
736
|
debug(depth) { "Requiring nested dependencies (#{nested_dependencies.join(', ')})" }
|
421
|
-
nested_dependencies.each
|
737
|
+
nested_dependencies.each do |d|
|
738
|
+
activated.add_child_vertex(name_for(d), nil, [name_for(possibility_set.latest_version)], d)
|
739
|
+
parent_index = states.size - 1
|
740
|
+
parents = @parents_of[d]
|
741
|
+
parents << parent_index if parents.empty?
|
742
|
+
end
|
422
743
|
|
423
|
-
push_state_for_requirements(requirements + nested_dependencies, nested_dependencies.
|
744
|
+
push_state_for_requirements(requirements + nested_dependencies, !nested_dependencies.empty?)
|
424
745
|
end
|
425
746
|
|
426
747
|
# Pushes a new {DependencyState} that encapsulates both existing and new
|
427
748
|
# requirements
|
428
749
|
# @param [Array] new_requirements
|
750
|
+
# @param [Boolean] requires_sort
|
751
|
+
# @param [Object] new_activated
|
429
752
|
# @return [void]
|
430
|
-
def push_state_for_requirements(new_requirements, requires_sort = true, new_activated = activated
|
753
|
+
def push_state_for_requirements(new_requirements, requires_sort = true, new_activated = activated)
|
431
754
|
new_requirements = sort_dependencies(new_requirements.uniq, new_activated, conflicts) if requires_sort
|
432
|
-
new_requirement =
|
433
|
-
|
434
|
-
|
755
|
+
new_requirement = nil
|
756
|
+
loop do
|
757
|
+
new_requirement = new_requirements.shift
|
758
|
+
break if new_requirement.nil? || states.none? { |s| s.requirement == new_requirement }
|
759
|
+
end
|
760
|
+
new_name = new_requirement ? name_for(new_requirement) : ''.freeze
|
761
|
+
possibilities = possibilities_for_requirement(new_requirement)
|
435
762
|
handle_missing_or_push_dependency_state DependencyState.new(
|
436
763
|
new_name, new_requirements, new_activated,
|
437
|
-
new_requirement, possibilities, depth, conflicts.dup
|
764
|
+
new_requirement, possibilities, depth, conflicts.dup, unused_unwind_options.dup
|
438
765
|
)
|
439
766
|
end
|
440
767
|
|
768
|
+
# Checks a proposed requirement with any existing locked requirement
|
769
|
+
# before generating an array of possibilities for it.
|
770
|
+
# @param [Object] requirement the proposed requirement
|
771
|
+
# @param [Object] activated
|
772
|
+
# @return [Array] possibilities
|
773
|
+
def possibilities_for_requirement(requirement, activated = self.activated)
|
774
|
+
return [] unless requirement
|
775
|
+
if locked_requirement_named(name_for(requirement))
|
776
|
+
return locked_requirement_possibility_set(requirement, activated)
|
777
|
+
end
|
778
|
+
|
779
|
+
group_possibilities(search_for(requirement))
|
780
|
+
end
|
781
|
+
|
782
|
+
# @param [Object] requirement the proposed requirement
|
783
|
+
# @param [Object] activated
|
784
|
+
# @return [Array] possibility set containing only the locked requirement, if any
|
785
|
+
def locked_requirement_possibility_set(requirement, activated = self.activated)
|
786
|
+
all_possibilities = search_for(requirement)
|
787
|
+
locked_requirement = locked_requirement_named(name_for(requirement))
|
788
|
+
|
789
|
+
# Longwinded way to build a possibilities array with either the locked
|
790
|
+
# requirement or nothing in it. Required, since the API for
|
791
|
+
# locked_requirement isn't guaranteed.
|
792
|
+
locked_possibilities = all_possibilities.select do |possibility|
|
793
|
+
requirement_satisfied_by?(locked_requirement, activated, possibility)
|
794
|
+
end
|
795
|
+
|
796
|
+
group_possibilities(locked_possibilities)
|
797
|
+
end
|
798
|
+
|
799
|
+
# Build an array of PossibilitySets, with each element representing a group of
|
800
|
+
# dependency versions that all have the same sub-dependency version constraints
|
801
|
+
# and are contiguous.
|
802
|
+
# @param [Array] possibilities an array of possibilities
|
803
|
+
# @return [Array<PossibilitySet>] an array of possibility sets
|
804
|
+
def group_possibilities(possibilities)
|
805
|
+
possibility_sets = []
|
806
|
+
current_possibility_set = nil
|
807
|
+
|
808
|
+
possibilities.reverse_each do |possibility|
|
809
|
+
dependencies = dependencies_for(possibility)
|
810
|
+
if current_possibility_set && dependencies_equal?(current_possibility_set.dependencies, dependencies)
|
811
|
+
current_possibility_set.possibilities.unshift(possibility)
|
812
|
+
else
|
813
|
+
possibility_sets.unshift(PossibilitySet.new(dependencies, [possibility]))
|
814
|
+
current_possibility_set = possibility_sets.first
|
815
|
+
end
|
816
|
+
end
|
817
|
+
|
818
|
+
possibility_sets
|
819
|
+
end
|
820
|
+
|
441
821
|
# Pushes a new {DependencyState}.
|
442
822
|
# If the {#specification_provider} says to
|
443
823
|
# {SpecificationProvider#allow_missing?} that particular requirement, and
|
444
824
|
# there are no possibilities for that requirement, then `state` is not
|
445
|
-
# pushed, and the
|
825
|
+
# pushed, and the vertex in {#activated} is removed, and we continue
|
446
826
|
# resolving the remaining requirements.
|
447
827
|
# @param [DependencyState] state
|
448
828
|
# @return [void]
|
@@ -451,7 +831,7 @@ module Gem::Resolver::Molinillo
|
|
451
831
|
state.activated.detach_vertex_named(state.name)
|
452
832
|
push_state_for_requirements(state.requirements.dup, false, state.activated)
|
453
833
|
else
|
454
|
-
states.push state
|
834
|
+
states.push(state).tap { activated.tag(state) }
|
455
835
|
end
|
456
836
|
end
|
457
837
|
end
|