bundler-clone 4.0.15
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 +7 -0
- data/CHANGELOG.md +5670 -0
- data/LICENSE.md +22 -0
- data/README.md +58 -0
- data/bundler.gemspec +46 -0
- data/exe/bundle +29 -0
- data/exe/bundler +4 -0
- data/lib/bundler/.document +1 -0
- data/lib/bundler/build_metadata.rb +44 -0
- data/lib/bundler/capistrano.rb +4 -0
- data/lib/bundler/checksum.rb +270 -0
- data/lib/bundler/ci_detector.rb +75 -0
- data/lib/bundler/cli/add.rb +62 -0
- data/lib/bundler/cli/binstubs.rb +57 -0
- data/lib/bundler/cli/cache.rb +32 -0
- data/lib/bundler/cli/check.rb +40 -0
- data/lib/bundler/cli/clean.rb +25 -0
- data/lib/bundler/cli/common.rb +161 -0
- data/lib/bundler/cli/config.rb +208 -0
- data/lib/bundler/cli/console.rb +47 -0
- data/lib/bundler/cli/doctor/diagnose.rb +167 -0
- data/lib/bundler/cli/doctor/ssl.rb +249 -0
- data/lib/bundler/cli/doctor.rb +33 -0
- data/lib/bundler/cli/exec.rb +114 -0
- data/lib/bundler/cli/fund.rb +36 -0
- data/lib/bundler/cli/gem.rb +493 -0
- data/lib/bundler/cli/info.rb +83 -0
- data/lib/bundler/cli/init.rb +51 -0
- data/lib/bundler/cli/install.rb +127 -0
- data/lib/bundler/cli/issue.rb +41 -0
- data/lib/bundler/cli/list.rb +97 -0
- data/lib/bundler/cli/lock.rb +94 -0
- data/lib/bundler/cli/open.rb +29 -0
- data/lib/bundler/cli/outdated.rb +337 -0
- data/lib/bundler/cli/platform.rb +48 -0
- data/lib/bundler/cli/plugin.rb +39 -0
- data/lib/bundler/cli/pristine.rb +64 -0
- data/lib/bundler/cli/remove.rb +17 -0
- data/lib/bundler/cli/show.rb +71 -0
- data/lib/bundler/cli/update.rb +125 -0
- data/lib/bundler/cli.rb +829 -0
- data/lib/bundler/compact_index_client/cache.rb +96 -0
- data/lib/bundler/compact_index_client/cache_file.rb +148 -0
- data/lib/bundler/compact_index_client/parser.rb +87 -0
- data/lib/bundler/compact_index_client/updater.rb +105 -0
- data/lib/bundler/compact_index_client.rb +92 -0
- data/lib/bundler/constants.rb +14 -0
- data/lib/bundler/current_ruby.rb +94 -0
- data/lib/bundler/definition.rb +1304 -0
- data/lib/bundler/dependency.rb +151 -0
- data/lib/bundler/deployment.rb +6 -0
- data/lib/bundler/deprecate.rb +44 -0
- data/lib/bundler/digest.rb +71 -0
- data/lib/bundler/dsl.rb +642 -0
- data/lib/bundler/endpoint_specification.rb +184 -0
- data/lib/bundler/env.rb +148 -0
- data/lib/bundler/environment_preserver.rb +69 -0
- data/lib/bundler/errors.rb +277 -0
- data/lib/bundler/feature_flag.rb +20 -0
- data/lib/bundler/fetcher/base.rb +55 -0
- data/lib/bundler/fetcher/compact_index.rb +133 -0
- data/lib/bundler/fetcher/dependency.rb +85 -0
- data/lib/bundler/fetcher/downloader.rb +116 -0
- data/lib/bundler/fetcher/gem_remote_fetcher.rb +24 -0
- data/lib/bundler/fetcher/index.rb +25 -0
- data/lib/bundler/fetcher.rb +365 -0
- data/lib/bundler/force_platform.rb +16 -0
- data/lib/bundler/friendly_errors.rb +127 -0
- data/lib/bundler/gem_helper.rb +237 -0
- data/lib/bundler/gem_tasks.rb +7 -0
- data/lib/bundler/gem_version_promoter.rb +147 -0
- data/lib/bundler/index.rb +203 -0
- data/lib/bundler/injector.rb +284 -0
- data/lib/bundler/inline.rb +106 -0
- data/lib/bundler/installer/gem_installer.rb +88 -0
- data/lib/bundler/installer/parallel_installer.rb +280 -0
- data/lib/bundler/installer/standalone.rb +113 -0
- data/lib/bundler/installer.rb +241 -0
- data/lib/bundler/lazy_specification.rb +270 -0
- data/lib/bundler/lockfile_generator.rb +119 -0
- data/lib/bundler/lockfile_parser.rb +328 -0
- data/lib/bundler/man/.document +1 -0
- data/lib/bundler/man/bundle-add.1 +79 -0
- data/lib/bundler/man/bundle-add.1.ronn +92 -0
- data/lib/bundler/man/bundle-binstubs.1 +30 -0
- data/lib/bundler/man/bundle-binstubs.1.ronn +42 -0
- data/lib/bundler/man/bundle-cache.1 +56 -0
- data/lib/bundler/man/bundle-cache.1.ronn +95 -0
- data/lib/bundler/man/bundle-check.1 +21 -0
- data/lib/bundler/man/bundle-check.1.ronn +26 -0
- data/lib/bundler/man/bundle-clean.1 +17 -0
- data/lib/bundler/man/bundle-clean.1.ronn +18 -0
- data/lib/bundler/man/bundle-config.1 +339 -0
- data/lib/bundler/man/bundle-config.1.ronn +455 -0
- data/lib/bundler/man/bundle-console.1 +33 -0
- data/lib/bundler/man/bundle-console.1.ronn +39 -0
- data/lib/bundler/man/bundle-doctor.1 +69 -0
- data/lib/bundler/man/bundle-doctor.1.ronn +77 -0
- data/lib/bundler/man/bundle-env.1 +9 -0
- data/lib/bundler/man/bundle-env.1.ronn +10 -0
- data/lib/bundler/man/bundle-exec.1 +104 -0
- data/lib/bundler/man/bundle-exec.1.ronn +150 -0
- data/lib/bundler/man/bundle-fund.1 +22 -0
- data/lib/bundler/man/bundle-fund.1.ronn +25 -0
- data/lib/bundler/man/bundle-gem.1 +107 -0
- data/lib/bundler/man/bundle-gem.1.ronn +150 -0
- data/lib/bundler/man/bundle-help.1 +9 -0
- data/lib/bundler/man/bundle-help.1.ronn +12 -0
- data/lib/bundler/man/bundle-info.1 +17 -0
- data/lib/bundler/man/bundle-info.1.ronn +21 -0
- data/lib/bundler/man/bundle-init.1 +20 -0
- data/lib/bundler/man/bundle-init.1.ronn +32 -0
- data/lib/bundler/man/bundle-install.1 +178 -0
- data/lib/bundler/man/bundle-install.1.ronn +314 -0
- data/lib/bundler/man/bundle-issue.1 +45 -0
- data/lib/bundler/man/bundle-issue.1.ronn +37 -0
- data/lib/bundler/man/bundle-licenses.1 +9 -0
- data/lib/bundler/man/bundle-licenses.1.ronn +10 -0
- data/lib/bundler/man/bundle-list.1 +40 -0
- data/lib/bundler/man/bundle-list.1.ronn +41 -0
- data/lib/bundler/man/bundle-lock.1 +75 -0
- data/lib/bundler/man/bundle-lock.1.ronn +115 -0
- data/lib/bundler/man/bundle-open.1 +32 -0
- data/lib/bundler/man/bundle-open.1.ronn +28 -0
- data/lib/bundler/man/bundle-outdated.1 +106 -0
- data/lib/bundler/man/bundle-outdated.1.ronn +117 -0
- data/lib/bundler/man/bundle-platform.1 +49 -0
- data/lib/bundler/man/bundle-platform.1.ronn +49 -0
- data/lib/bundler/man/bundle-plugin.1 +76 -0
- data/lib/bundler/man/bundle-plugin.1.ronn +84 -0
- data/lib/bundler/man/bundle-pristine.1 +23 -0
- data/lib/bundler/man/bundle-pristine.1.ronn +34 -0
- data/lib/bundler/man/bundle-remove.1 +15 -0
- data/lib/bundler/man/bundle-remove.1.ronn +16 -0
- data/lib/bundler/man/bundle-show.1 +16 -0
- data/lib/bundler/man/bundle-show.1.ronn +21 -0
- data/lib/bundler/man/bundle-update.1 +284 -0
- data/lib/bundler/man/bundle-update.1.ronn +367 -0
- data/lib/bundler/man/bundle-version.1 +22 -0
- data/lib/bundler/man/bundle-version.1.ronn +24 -0
- data/lib/bundler/man/bundle.1 +93 -0
- data/lib/bundler/man/bundle.1.ronn +107 -0
- data/lib/bundler/man/gemfile.5 +503 -0
- data/lib/bundler/man/gemfile.5.ronn +586 -0
- data/lib/bundler/man/index.txt +31 -0
- data/lib/bundler/match_metadata.rb +30 -0
- data/lib/bundler/match_platform.rb +42 -0
- data/lib/bundler/match_remote_metadata.rb +29 -0
- data/lib/bundler/materialization.rb +59 -0
- data/lib/bundler/mirror.rb +221 -0
- data/lib/bundler/plugin/api/source.rb +330 -0
- data/lib/bundler/plugin/api.rb +81 -0
- data/lib/bundler/plugin/dsl.rb +53 -0
- data/lib/bundler/plugin/events.rb +85 -0
- data/lib/bundler/plugin/index.rb +203 -0
- data/lib/bundler/plugin/installer/git.rb +34 -0
- data/lib/bundler/plugin/installer/path.rb +26 -0
- data/lib/bundler/plugin/installer/rubygems.rb +19 -0
- data/lib/bundler/plugin/installer.rb +123 -0
- data/lib/bundler/plugin/source_list.rb +31 -0
- data/lib/bundler/plugin/unloaded_source.rb +25 -0
- data/lib/bundler/plugin.rb +387 -0
- data/lib/bundler/process_lock.rb +20 -0
- data/lib/bundler/remote_specification.rb +126 -0
- data/lib/bundler/resolver/base.rb +127 -0
- data/lib/bundler/resolver/candidate.rb +85 -0
- data/lib/bundler/resolver/incompatibility.rb +15 -0
- data/lib/bundler/resolver/package.rb +95 -0
- data/lib/bundler/resolver/root.rb +25 -0
- data/lib/bundler/resolver/spec_group.rb +74 -0
- data/lib/bundler/resolver/strategy.rb +43 -0
- data/lib/bundler/resolver.rb +603 -0
- data/lib/bundler/retry.rb +92 -0
- data/lib/bundler/ruby_dsl.rb +67 -0
- data/lib/bundler/ruby_version.rb +135 -0
- data/lib/bundler/rubygems_ext.rb +503 -0
- data/lib/bundler/rubygems_gem_installer.rb +206 -0
- data/lib/bundler/rubygems_integration.rb +456 -0
- data/lib/bundler/runtime.rb +331 -0
- data/lib/bundler/safe_marshal.rb +31 -0
- data/lib/bundler/self_manager.rb +197 -0
- data/lib/bundler/settings/validator.rb +86 -0
- data/lib/bundler/settings.rb +585 -0
- data/lib/bundler/setup.rb +39 -0
- data/lib/bundler/shared_helpers.rb +392 -0
- data/lib/bundler/source/gemspec.rb +19 -0
- data/lib/bundler/source/git/git_proxy.rb +509 -0
- data/lib/bundler/source/git.rb +451 -0
- data/lib/bundler/source/metadata.rb +67 -0
- data/lib/bundler/source/path/installer.rb +53 -0
- data/lib/bundler/source/path.rb +256 -0
- data/lib/bundler/source/rubygems/remote.rb +86 -0
- data/lib/bundler/source/rubygems.rb +606 -0
- data/lib/bundler/source/rubygems_aggregate.rb +71 -0
- data/lib/bundler/source.rb +120 -0
- data/lib/bundler/source_list.rb +240 -0
- data/lib/bundler/source_map.rb +72 -0
- data/lib/bundler/spec_set.rb +390 -0
- data/lib/bundler/stub_specification.rb +147 -0
- data/lib/bundler/templates/.document +1 -0
- data/lib/bundler/templates/Executable +16 -0
- data/lib/bundler/templates/Executable.standalone +14 -0
- data/lib/bundler/templates/Gemfile +5 -0
- data/lib/bundler/templates/newgem/CHANGELOG.md.tt +5 -0
- data/lib/bundler/templates/newgem/CODE_OF_CONDUCT.md.tt +10 -0
- data/lib/bundler/templates/newgem/Cargo.toml.tt +13 -0
- data/lib/bundler/templates/newgem/Gemfile.tt +24 -0
- data/lib/bundler/templates/newgem/LICENSE.txt.tt +21 -0
- data/lib/bundler/templates/newgem/README.md.tt +49 -0
- data/lib/bundler/templates/newgem/Rakefile.tt +72 -0
- data/lib/bundler/templates/newgem/bin/console.tt +11 -0
- data/lib/bundler/templates/newgem/bin/setup.tt +8 -0
- data/lib/bundler/templates/newgem/circleci/config.yml.tt +37 -0
- data/lib/bundler/templates/newgem/exe/newgem.tt +3 -0
- data/lib/bundler/templates/newgem/ext/newgem/Cargo.toml.tt +22 -0
- data/lib/bundler/templates/newgem/ext/newgem/build.rs.tt +5 -0
- data/lib/bundler/templates/newgem/ext/newgem/extconf-c.rb.tt +10 -0
- data/lib/bundler/templates/newgem/ext/newgem/extconf-go.rb.tt +11 -0
- data/lib/bundler/templates/newgem/ext/newgem/extconf-rust.rb.tt +6 -0
- data/lib/bundler/templates/newgem/ext/newgem/go.mod.tt +5 -0
- data/lib/bundler/templates/newgem/ext/newgem/newgem-go.c.tt +2 -0
- data/lib/bundler/templates/newgem/ext/newgem/newgem.c.tt +9 -0
- data/lib/bundler/templates/newgem/ext/newgem/newgem.go.tt +31 -0
- data/lib/bundler/templates/newgem/ext/newgem/newgem.h.tt +6 -0
- data/lib/bundler/templates/newgem/ext/newgem/src/lib.rs.tt +23 -0
- data/lib/bundler/templates/newgem/github/workflows/build-gems.yml.tt +69 -0
- data/lib/bundler/templates/newgem/github/workflows/main.yml.tt +48 -0
- data/lib/bundler/templates/newgem/gitignore.tt +23 -0
- data/lib/bundler/templates/newgem/gitlab-ci.yml.tt +27 -0
- data/lib/bundler/templates/newgem/lib/newgem/version.rb.tt +9 -0
- data/lib/bundler/templates/newgem/lib/newgem.rb.tt +15 -0
- data/lib/bundler/templates/newgem/newgem.gemspec.tt +58 -0
- data/lib/bundler/templates/newgem/rspec.tt +3 -0
- data/lib/bundler/templates/newgem/rubocop.yml.tt +8 -0
- data/lib/bundler/templates/newgem/sig/newgem.rbs.tt +8 -0
- data/lib/bundler/templates/newgem/spec/newgem_spec.rb.tt +19 -0
- data/lib/bundler/templates/newgem/spec/spec_helper.rb.tt +15 -0
- data/lib/bundler/templates/newgem/standard.yml.tt +3 -0
- data/lib/bundler/templates/newgem/test/minitest/test_helper.rb.tt +6 -0
- data/lib/bundler/templates/newgem/test/minitest/test_newgem.rb.tt +19 -0
- data/lib/bundler/templates/newgem/test/test-unit/newgem_test.rb.tt +15 -0
- data/lib/bundler/templates/newgem/test/test-unit/test_helper.rb.tt +6 -0
- data/lib/bundler/ui/rg_proxy.rb +19 -0
- data/lib/bundler/ui/shell.rb +191 -0
- data/lib/bundler/ui/silent.rb +96 -0
- data/lib/bundler/ui.rb +9 -0
- data/lib/bundler/uri_credentials_filter.rb +43 -0
- data/lib/bundler/uri_normalizer.rb +23 -0
- data/lib/bundler/vendor/.document +1 -0
- data/lib/bundler/vendor/connection_pool/LICENSE +20 -0
- data/lib/bundler/vendor/connection_pool/lib/connection_pool/timed_stack.rb +227 -0
- data/lib/bundler/vendor/connection_pool/lib/connection_pool/version.rb +3 -0
- data/lib/bundler/vendor/connection_pool/lib/connection_pool/wrapper.rb +56 -0
- data/lib/bundler/vendor/connection_pool/lib/connection_pool.rb +230 -0
- data/lib/bundler/vendor/fileutils/COPYING +56 -0
- data/lib/bundler/vendor/fileutils/lib/fileutils.rb +2701 -0
- data/lib/bundler/vendor/net-http-persistent/README.rdoc +82 -0
- data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/connection.rb +41 -0
- data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/pool.rb +65 -0
- data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/timed_stack_multi.rb +80 -0
- data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb +1153 -0
- data/lib/bundler/vendor/pub_grub/LICENSE.txt +21 -0
- data/lib/bundler/vendor/pub_grub/lib/pub_grub/assignment.rb +20 -0
- data/lib/bundler/vendor/pub_grub/lib/pub_grub/basic_package_source.rb +169 -0
- data/lib/bundler/vendor/pub_grub/lib/pub_grub/failure_writer.rb +182 -0
- data/lib/bundler/vendor/pub_grub/lib/pub_grub/incompatibility.rb +150 -0
- data/lib/bundler/vendor/pub_grub/lib/pub_grub/package.rb +43 -0
- data/lib/bundler/vendor/pub_grub/lib/pub_grub/partial_solution.rb +121 -0
- data/lib/bundler/vendor/pub_grub/lib/pub_grub/rubygems.rb +45 -0
- data/lib/bundler/vendor/pub_grub/lib/pub_grub/solve_failure.rb +19 -0
- data/lib/bundler/vendor/pub_grub/lib/pub_grub/static_package_source.rb +61 -0
- data/lib/bundler/vendor/pub_grub/lib/pub_grub/strategy.rb +42 -0
- data/lib/bundler/vendor/pub_grub/lib/pub_grub/term.rb +105 -0
- data/lib/bundler/vendor/pub_grub/lib/pub_grub/version.rb +3 -0
- data/lib/bundler/vendor/pub_grub/lib/pub_grub/version_constraint.rb +129 -0
- data/lib/bundler/vendor/pub_grub/lib/pub_grub/version_range.rb +423 -0
- data/lib/bundler/vendor/pub_grub/lib/pub_grub/version_solver.rb +236 -0
- data/lib/bundler/vendor/pub_grub/lib/pub_grub/version_union.rb +178 -0
- data/lib/bundler/vendor/pub_grub/lib/pub_grub.rb +31 -0
- data/lib/bundler/vendor/securerandom/COPYING +56 -0
- data/lib/bundler/vendor/securerandom/lib/securerandom.rb +102 -0
- data/lib/bundler/vendor/thor/LICENSE.md +20 -0
- data/lib/bundler/vendor/thor/lib/thor/actions/create_file.rb +105 -0
- data/lib/bundler/vendor/thor/lib/thor/actions/create_link.rb +61 -0
- data/lib/bundler/vendor/thor/lib/thor/actions/directory.rb +108 -0
- data/lib/bundler/vendor/thor/lib/thor/actions/empty_directory.rb +143 -0
- data/lib/bundler/vendor/thor/lib/thor/actions/file_manipulation.rb +407 -0
- data/lib/bundler/vendor/thor/lib/thor/actions/inject_into_file.rb +130 -0
- data/lib/bundler/vendor/thor/lib/thor/actions.rb +340 -0
- data/lib/bundler/vendor/thor/lib/thor/base.rb +825 -0
- data/lib/bundler/vendor/thor/lib/thor/command.rb +151 -0
- data/lib/bundler/vendor/thor/lib/thor/core_ext/hash_with_indifferent_access.rb +107 -0
- data/lib/bundler/vendor/thor/lib/thor/error.rb +106 -0
- data/lib/bundler/vendor/thor/lib/thor/group.rb +292 -0
- data/lib/bundler/vendor/thor/lib/thor/invocation.rb +178 -0
- data/lib/bundler/vendor/thor/lib/thor/line_editor/basic.rb +37 -0
- data/lib/bundler/vendor/thor/lib/thor/line_editor/readline.rb +88 -0
- data/lib/bundler/vendor/thor/lib/thor/line_editor.rb +17 -0
- data/lib/bundler/vendor/thor/lib/thor/nested_context.rb +29 -0
- data/lib/bundler/vendor/thor/lib/thor/parser/argument.rb +86 -0
- data/lib/bundler/vendor/thor/lib/thor/parser/arguments.rb +195 -0
- data/lib/bundler/vendor/thor/lib/thor/parser/option.rb +178 -0
- data/lib/bundler/vendor/thor/lib/thor/parser/options.rb +294 -0
- data/lib/bundler/vendor/thor/lib/thor/parser.rb +4 -0
- data/lib/bundler/vendor/thor/lib/thor/rake_compat.rb +72 -0
- data/lib/bundler/vendor/thor/lib/thor/runner.rb +335 -0
- data/lib/bundler/vendor/thor/lib/thor/shell/basic.rb +384 -0
- data/lib/bundler/vendor/thor/lib/thor/shell/color.rb +112 -0
- data/lib/bundler/vendor/thor/lib/thor/shell/column_printer.rb +29 -0
- data/lib/bundler/vendor/thor/lib/thor/shell/html.rb +81 -0
- data/lib/bundler/vendor/thor/lib/thor/shell/table_printer.rb +118 -0
- data/lib/bundler/vendor/thor/lib/thor/shell/terminal.rb +42 -0
- data/lib/bundler/vendor/thor/lib/thor/shell/wrapped_printer.rb +38 -0
- data/lib/bundler/vendor/thor/lib/thor/shell.rb +81 -0
- data/lib/bundler/vendor/thor/lib/thor/util.rb +285 -0
- data/lib/bundler/vendor/thor/lib/thor/version.rb +3 -0
- data/lib/bundler/vendor/thor/lib/thor.rb +674 -0
- data/lib/bundler/vendor/tsort/LICENSE.txt +22 -0
- data/lib/bundler/vendor/tsort/lib/tsort.rb +455 -0
- data/lib/bundler/vendor/uri/COPYING +56 -0
- data/lib/bundler/vendor/uri/lib/uri/common.rb +922 -0
- data/lib/bundler/vendor/uri/lib/uri/file.rb +100 -0
- data/lib/bundler/vendor/uri/lib/uri/ftp.rb +267 -0
- data/lib/bundler/vendor/uri/lib/uri/generic.rb +1592 -0
- data/lib/bundler/vendor/uri/lib/uri/http.rb +137 -0
- data/lib/bundler/vendor/uri/lib/uri/https.rb +23 -0
- data/lib/bundler/vendor/uri/lib/uri/ldap.rb +261 -0
- data/lib/bundler/vendor/uri/lib/uri/ldaps.rb +22 -0
- data/lib/bundler/vendor/uri/lib/uri/mailto.rb +293 -0
- data/lib/bundler/vendor/uri/lib/uri/rfc2396_parser.rb +547 -0
- data/lib/bundler/vendor/uri/lib/uri/rfc3986_parser.rb +206 -0
- data/lib/bundler/vendor/uri/lib/uri/version.rb +6 -0
- data/lib/bundler/vendor/uri/lib/uri/ws.rb +83 -0
- data/lib/bundler/vendor/uri/lib/uri/wss.rb +23 -0
- data/lib/bundler/vendor/uri/lib/uri.rb +104 -0
- data/lib/bundler/vendored_fileutils.rb +4 -0
- data/lib/bundler/vendored_net_http.rb +23 -0
- data/lib/bundler/vendored_persistent.rb +11 -0
- data/lib/bundler/vendored_pub_grub.rb +4 -0
- data/lib/bundler/vendored_securerandom.rb +12 -0
- data/lib/bundler/vendored_thor.rb +8 -0
- data/lib/bundler/vendored_timeout.rb +12 -0
- data/lib/bundler/vendored_tsort.rb +4 -0
- data/lib/bundler/vendored_uri.rb +21 -0
- data/lib/bundler/version.rb +21 -0
- data/lib/bundler/vlad.rb +4 -0
- data/lib/bundler/worker.rb +125 -0
- data/lib/bundler/yaml_serializer.rb +98 -0
- data/lib/bundler.rb +691 -0
- metadata +409 -0
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "../bundler"
|
|
4
|
+
require "shellwords"
|
|
5
|
+
|
|
6
|
+
module Bundler
|
|
7
|
+
class GemHelper
|
|
8
|
+
include Rake::DSL if defined? Rake::DSL
|
|
9
|
+
|
|
10
|
+
class << self
|
|
11
|
+
# set when install'd.
|
|
12
|
+
attr_accessor :instance
|
|
13
|
+
|
|
14
|
+
def install_tasks(opts = {})
|
|
15
|
+
new(opts[:dir], opts[:name]).install
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def tag_prefix=(prefix)
|
|
19
|
+
instance.tag_prefix = prefix
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def gemspec(&block)
|
|
23
|
+
gemspec = instance.gemspec
|
|
24
|
+
block&.call(gemspec)
|
|
25
|
+
gemspec
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
attr_reader :spec_path, :base, :gemspec
|
|
30
|
+
|
|
31
|
+
attr_writer :tag_prefix
|
|
32
|
+
|
|
33
|
+
def initialize(base = nil, name = nil)
|
|
34
|
+
@base = File.expand_path(base || SharedHelpers.pwd)
|
|
35
|
+
gemspecs = name ? [File.join(@base, "#{name}.gemspec")] : Gem::Util.glob_files_in_dir("{,*}.gemspec", @base)
|
|
36
|
+
raise "Unable to determine name from existing gemspec. Use :name => 'gemname' in #install_tasks to manually set it." unless gemspecs.size == 1
|
|
37
|
+
@spec_path = gemspecs.first
|
|
38
|
+
@gemspec = Bundler.load_gemspec(@spec_path)
|
|
39
|
+
@tag_prefix = ""
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def install
|
|
43
|
+
built_gem_path = nil
|
|
44
|
+
|
|
45
|
+
desc "Build #{name}-#{version}.gem into the pkg directory."
|
|
46
|
+
task "build" do
|
|
47
|
+
built_gem_path = build_gem
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
desc "Generate SHA512 checksum of #{name}-#{version}.gem into the checksums directory."
|
|
51
|
+
task "build:checksum" => "build" do
|
|
52
|
+
build_checksum(built_gem_path)
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
desc "Build and install #{name}-#{version}.gem into system gems."
|
|
56
|
+
task "install" => "build" do
|
|
57
|
+
install_gem(built_gem_path)
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
desc "Build and install #{name}-#{version}.gem into system gems without network access."
|
|
61
|
+
task "install:local" => "build" do
|
|
62
|
+
install_gem(built_gem_path, :local)
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
desc "Create tag #{version_tag} and build and push #{name}-#{version}.gem to #{gem_push_host}\n" \
|
|
66
|
+
"To prevent publishing in RubyGems use `gem_push=no rake release`"
|
|
67
|
+
task "release", [:remote] => ["build", "release:guard_clean",
|
|
68
|
+
"release:source_control_push", "release:rubygem_push"] do
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
task "release:guard_clean" do
|
|
72
|
+
guard_clean
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
task "release:source_control_push", [:remote] do |_, args|
|
|
76
|
+
tag_version { git_push(args[:remote]) } unless already_tagged?
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
task "release:rubygem_push" => "build" do
|
|
80
|
+
rubygem_push(built_gem_path) if gem_push?
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
GemHelper.instance = self
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
def build_gem
|
|
87
|
+
file_name = nil
|
|
88
|
+
sh([*gem_command, "build", "-V", spec_path]) do
|
|
89
|
+
file_name = File.basename(built_gem_path)
|
|
90
|
+
SharedHelpers.filesystem_access(File.join(base, "pkg")) {|p| FileUtils.mkdir_p(p) }
|
|
91
|
+
FileUtils.mv(built_gem_path, "pkg")
|
|
92
|
+
Bundler.ui.confirm "#{name} #{version} built to pkg/#{file_name}."
|
|
93
|
+
end
|
|
94
|
+
File.join(base, "pkg", file_name)
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
def install_gem(built_gem_path = nil, local = false)
|
|
98
|
+
built_gem_path ||= build_gem
|
|
99
|
+
cmd = [*gem_command, "install", built_gem_path.to_s]
|
|
100
|
+
cmd << "--local" if local
|
|
101
|
+
sh(cmd)
|
|
102
|
+
Bundler.ui.confirm "#{name} (#{version}) installed."
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
def build_checksum(built_gem_path = nil)
|
|
106
|
+
built_gem_path ||= build_gem
|
|
107
|
+
SharedHelpers.filesystem_access(File.join(base, "checksums")) {|p| FileUtils.mkdir_p(p) }
|
|
108
|
+
file_name = "#{File.basename(built_gem_path)}.sha512"
|
|
109
|
+
require "digest/sha2"
|
|
110
|
+
checksum = ::Digest::SHA512.file(built_gem_path).hexdigest
|
|
111
|
+
target = File.join(base, "checksums", file_name)
|
|
112
|
+
File.write(target, checksum + "\n")
|
|
113
|
+
Bundler.ui.confirm "#{name} #{version} checksum written to checksums/#{file_name}."
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
protected
|
|
117
|
+
|
|
118
|
+
def rubygem_push(path)
|
|
119
|
+
cmd = [*gem_command, "push", path]
|
|
120
|
+
cmd << "--key" << gem_key if gem_key
|
|
121
|
+
cmd << "--host" << allowed_push_host if allowed_push_host
|
|
122
|
+
sh_with_input(cmd)
|
|
123
|
+
Bundler.ui.confirm "Pushed #{name} #{version} to #{gem_push_host}"
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
def built_gem_path
|
|
127
|
+
Gem::Util.glob_files_in_dir("#{name}-*.gem", base).sort_by {|f| File.mtime(f) }.last
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
def git_push(remote = nil)
|
|
131
|
+
remote ||= default_remote
|
|
132
|
+
sh("git push #{remote} refs/heads/#{current_branch}".shellsplit)
|
|
133
|
+
sh("git push #{remote} refs/tags/#{version_tag}".shellsplit)
|
|
134
|
+
Bundler.ui.confirm "Pushed git commits and release tag."
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
def default_remote
|
|
138
|
+
remote_for_branch, status = sh_with_status(%W[git config --get branch.#{current_branch}.remote])
|
|
139
|
+
return "origin" unless status.success?
|
|
140
|
+
|
|
141
|
+
remote_for_branch.strip
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
def current_branch
|
|
145
|
+
# We can replace this with `git branch --show-current` once we drop support for git < 2.22.0
|
|
146
|
+
sh(%w[git rev-parse --abbrev-ref HEAD]).gsub(%r{\Aheads/}, "").strip
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
def allowed_push_host
|
|
150
|
+
@gemspec.metadata["allowed_push_host"] if @gemspec.respond_to?(:metadata)
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
def gem_push_host
|
|
154
|
+
env_rubygems_host = ENV["RUBYGEMS_HOST"]
|
|
155
|
+
env_rubygems_host = nil if env_rubygems_host&.empty?
|
|
156
|
+
|
|
157
|
+
allowed_push_host || env_rubygems_host || "rubygems.org"
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
def already_tagged?
|
|
161
|
+
return false unless sh(%w[git tag]).split(/\n/).include?(version_tag)
|
|
162
|
+
Bundler.ui.confirm "Tag #{version_tag} has already been created."
|
|
163
|
+
true
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
def guard_clean
|
|
167
|
+
clean? && committed? || raise("There are files that need to be committed first.")
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
def clean?
|
|
171
|
+
sh_with_status(%w[git diff --exit-code])[1].success?
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
def committed?
|
|
175
|
+
sh_with_status(%w[git diff-index --quiet --cached HEAD])[1].success?
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
def tag_version
|
|
179
|
+
sh %W[git tag -m Version\ #{version} #{version_tag}]
|
|
180
|
+
Bundler.ui.confirm "Tagged #{version_tag}."
|
|
181
|
+
yield if block_given?
|
|
182
|
+
rescue RuntimeError
|
|
183
|
+
Bundler.ui.error "Untagging #{version_tag} due to error."
|
|
184
|
+
sh_with_status %W[git tag -d #{version_tag}]
|
|
185
|
+
raise
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
def version
|
|
189
|
+
gemspec.version
|
|
190
|
+
end
|
|
191
|
+
|
|
192
|
+
def version_tag
|
|
193
|
+
"#{@tag_prefix}v#{version}"
|
|
194
|
+
end
|
|
195
|
+
|
|
196
|
+
def name
|
|
197
|
+
gemspec.name
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
def sh_with_input(cmd)
|
|
201
|
+
Bundler.ui.debug(cmd)
|
|
202
|
+
SharedHelpers.chdir(base) do
|
|
203
|
+
abort unless Kernel.system(*cmd)
|
|
204
|
+
end
|
|
205
|
+
end
|
|
206
|
+
|
|
207
|
+
def sh(cmd, &block)
|
|
208
|
+
out, status = sh_with_status(cmd, &block)
|
|
209
|
+
unless status.success?
|
|
210
|
+
raise("Running `#{cmd.shelljoin}` failed with the following output:\n\n#{out}\n")
|
|
211
|
+
end
|
|
212
|
+
out
|
|
213
|
+
end
|
|
214
|
+
|
|
215
|
+
def sh_with_status(cmd, &block)
|
|
216
|
+
Bundler.ui.debug(cmd)
|
|
217
|
+
SharedHelpers.chdir(base) do
|
|
218
|
+
outbuf = IO.popen(cmd, err: [:child, :out], &:read)
|
|
219
|
+
status = $?
|
|
220
|
+
block&.call(outbuf) if status.success?
|
|
221
|
+
[outbuf, status]
|
|
222
|
+
end
|
|
223
|
+
end
|
|
224
|
+
|
|
225
|
+
def gem_key
|
|
226
|
+
Bundler.settings["gem.push_key"].to_s.downcase if Bundler.settings["gem.push_key"]
|
|
227
|
+
end
|
|
228
|
+
|
|
229
|
+
def gem_push?
|
|
230
|
+
!%w[n no nil false off 0].include?(ENV["gem_push"].to_s.downcase)
|
|
231
|
+
end
|
|
232
|
+
|
|
233
|
+
def gem_command
|
|
234
|
+
ENV["GEM_COMMAND"]&.shellsplit || ["gem"]
|
|
235
|
+
end
|
|
236
|
+
end
|
|
237
|
+
end
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Bundler
|
|
4
|
+
# This class contains all of the logic for determining the next version of a
|
|
5
|
+
# Gem to update to based on the requested level (patch, minor, major).
|
|
6
|
+
# Primarily designed to work with Resolver which will provide it the list of
|
|
7
|
+
# available dependency versions as found in its index, before returning it to
|
|
8
|
+
# to the resolution engine to select the best version.
|
|
9
|
+
class GemVersionPromoter
|
|
10
|
+
attr_reader :level
|
|
11
|
+
attr_accessor :pre
|
|
12
|
+
|
|
13
|
+
# By default, strict is false, meaning every available version of a gem
|
|
14
|
+
# is returned from sort_versions. The order gives preference to the
|
|
15
|
+
# requested level (:patch, :minor, :major) but in complicated requirement
|
|
16
|
+
# cases some gems will by necessity be promoted past the requested level,
|
|
17
|
+
# or even reverted to older versions.
|
|
18
|
+
#
|
|
19
|
+
# If strict is set to true, the results from sort_versions will be
|
|
20
|
+
# truncated, eliminating any version outside the current level scope.
|
|
21
|
+
# This can lead to unexpected outcomes or even VersionConflict exceptions
|
|
22
|
+
# that report a version of a gem not existing for versions that indeed do
|
|
23
|
+
# existing in the referenced source.
|
|
24
|
+
attr_accessor :strict
|
|
25
|
+
|
|
26
|
+
# Creates a GemVersionPromoter instance.
|
|
27
|
+
#
|
|
28
|
+
# @return [GemVersionPromoter]
|
|
29
|
+
def initialize
|
|
30
|
+
@level = :major
|
|
31
|
+
@strict = false
|
|
32
|
+
@pre = false
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# @param value [Symbol] One of three Symbols: :major, :minor or :patch.
|
|
36
|
+
def level=(value)
|
|
37
|
+
v = case value
|
|
38
|
+
when String, Symbol
|
|
39
|
+
value.to_sym
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
raise ArgumentError, "Unexpected level #{v}. Must be :major, :minor or :patch" unless [:major, :minor, :patch].include?(v)
|
|
43
|
+
@level = v
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# Given a Resolver::Package and an Array of Specifications of available
|
|
47
|
+
# versions for a gem, this method will return the Array of Specifications
|
|
48
|
+
# sorted in an order to give preference to the current level (:major, :minor
|
|
49
|
+
# or :patch) when resolution is deciding what versions best resolve all
|
|
50
|
+
# dependencies in the bundle.
|
|
51
|
+
# @param package [Resolver::Package] The package being resolved.
|
|
52
|
+
# @param specs [Specification] An array of Specifications for the package.
|
|
53
|
+
# @return [Specification] A new instance of the Specification Array sorted.
|
|
54
|
+
def sort_versions(package, specs)
|
|
55
|
+
locked_version = package.locked_version
|
|
56
|
+
|
|
57
|
+
result = specs.sort do |a, b|
|
|
58
|
+
unless package.prerelease_specified? || pre?
|
|
59
|
+
a_pre = a.prerelease?
|
|
60
|
+
b_pre = b.prerelease?
|
|
61
|
+
|
|
62
|
+
next 1 if a_pre && !b_pre
|
|
63
|
+
next -1 if b_pre && !a_pre
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
if major? || locked_version.nil?
|
|
67
|
+
b <=> a
|
|
68
|
+
elsif either_version_older_than_locked?(a, b, locked_version)
|
|
69
|
+
b <=> a
|
|
70
|
+
elsif segments_do_not_match?(a, b, :major)
|
|
71
|
+
a <=> b
|
|
72
|
+
elsif !minor? && segments_do_not_match?(a, b, :minor)
|
|
73
|
+
a <=> b
|
|
74
|
+
else
|
|
75
|
+
b <=> a
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
post_sort(result, package.unlock?, locked_version)
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
# @return [bool] Convenience method for testing value of level variable.
|
|
82
|
+
def major?
|
|
83
|
+
level == :major
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
# @return [bool] Convenience method for testing value of level variable.
|
|
87
|
+
def minor?
|
|
88
|
+
level == :minor
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
# @return [bool] Convenience method for testing value of pre variable.
|
|
92
|
+
def pre?
|
|
93
|
+
pre == true
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
# Given a Resolver::Package and an Array of Specifications of available
|
|
97
|
+
# versions for a gem, this method will truncate the Array if strict
|
|
98
|
+
# is true. That means filtering out downgrades from the version currently
|
|
99
|
+
# locked, and filtering out upgrades that go past the selected level (major,
|
|
100
|
+
# minor, or patch).
|
|
101
|
+
# @param package [Resolver::Package] The package being resolved.
|
|
102
|
+
# @param specs [Specification] An array of Specifications for the package.
|
|
103
|
+
# @return [Specification] A new instance of the Specification Array
|
|
104
|
+
# truncated.
|
|
105
|
+
def filter_versions(package, specs)
|
|
106
|
+
return specs unless strict
|
|
107
|
+
|
|
108
|
+
locked_version = package.locked_version
|
|
109
|
+
return specs if locked_version.nil? || major?
|
|
110
|
+
|
|
111
|
+
specs.select do |spec|
|
|
112
|
+
gsv = spec.version
|
|
113
|
+
|
|
114
|
+
must_match = minor? ? [0] : [0, 1]
|
|
115
|
+
|
|
116
|
+
all_match = must_match.all? {|idx| gsv.segments[idx] == locked_version.segments[idx] }
|
|
117
|
+
all_match && gsv >= locked_version
|
|
118
|
+
end
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
private
|
|
122
|
+
|
|
123
|
+
def either_version_older_than_locked?(a, b, locked_version)
|
|
124
|
+
a.version < locked_version || b.version < locked_version
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
def segments_do_not_match?(a, b, level)
|
|
128
|
+
index = [:major, :minor].index(level)
|
|
129
|
+
a.segments[index] != b.segments[index]
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
# Specific version moves can't always reliably be done during sorting
|
|
133
|
+
# as not all elements are compared against each other.
|
|
134
|
+
def post_sort(result, unlock, locked_version)
|
|
135
|
+
if unlock || locked_version.nil?
|
|
136
|
+
result
|
|
137
|
+
else
|
|
138
|
+
move_version_to_beginning(result, locked_version)
|
|
139
|
+
end
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
def move_version_to_beginning(result, version)
|
|
143
|
+
move, keep = result.partition {|s| s.version.to_s == version.to_s }
|
|
144
|
+
move.concat(keep)
|
|
145
|
+
end
|
|
146
|
+
end
|
|
147
|
+
end
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Bundler
|
|
4
|
+
class Index
|
|
5
|
+
include Enumerable
|
|
6
|
+
|
|
7
|
+
def self.build
|
|
8
|
+
i = new
|
|
9
|
+
yield i
|
|
10
|
+
i
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
attr_reader :specs, :duplicates, :sources
|
|
14
|
+
protected :specs, :duplicates
|
|
15
|
+
|
|
16
|
+
RUBY = "ruby"
|
|
17
|
+
NULL = "\0"
|
|
18
|
+
|
|
19
|
+
def initialize
|
|
20
|
+
@sources = []
|
|
21
|
+
@cache = {}
|
|
22
|
+
@specs = {}
|
|
23
|
+
@duplicates = {}
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def initialize_copy(o)
|
|
27
|
+
@sources = o.sources.dup
|
|
28
|
+
@cache = {}
|
|
29
|
+
@specs = {}
|
|
30
|
+
@duplicates = {}
|
|
31
|
+
|
|
32
|
+
o.specs.each do |name, hash|
|
|
33
|
+
@specs[name] = hash.dup
|
|
34
|
+
end
|
|
35
|
+
o.duplicates.each do |name, array|
|
|
36
|
+
@duplicates[name] = array.dup
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def inspect
|
|
41
|
+
"#<#{self.class}:0x#{object_id} sources=#{sources.map(&:inspect)} specs.size=#{specs.size}>"
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def empty?
|
|
45
|
+
each { return false }
|
|
46
|
+
true
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
# Search this index's specs, and any source indexes that this index knows
|
|
50
|
+
# about, returning all of the results.
|
|
51
|
+
def search(query)
|
|
52
|
+
results = local_search(query)
|
|
53
|
+
return results unless @sources.any?
|
|
54
|
+
|
|
55
|
+
@sources.each do |source|
|
|
56
|
+
results = safe_concat(results, source.search(query))
|
|
57
|
+
end
|
|
58
|
+
results.uniq!(&:full_name) unless results.empty? # avoid modifying frozen EMPTY_SEARCH
|
|
59
|
+
results
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
alias_method :[], :search
|
|
63
|
+
|
|
64
|
+
def local_search(query)
|
|
65
|
+
case query
|
|
66
|
+
when Gem::Specification, RemoteSpecification, LazySpecification, EndpointSpecification then search_by_spec(query)
|
|
67
|
+
when String then specs_by_name(query)
|
|
68
|
+
when Array then specs_by_name_and_version(*query)
|
|
69
|
+
else
|
|
70
|
+
raise "You can't search for a #{query.inspect}."
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
def add(spec)
|
|
75
|
+
(@specs[spec.name] ||= {}).store(spec.full_name, spec)
|
|
76
|
+
end
|
|
77
|
+
alias_method :<<, :add
|
|
78
|
+
|
|
79
|
+
def each(&blk)
|
|
80
|
+
return enum_for(:each) unless blk
|
|
81
|
+
specs.values.each do |spec_sets|
|
|
82
|
+
spec_sets.values.each(&blk)
|
|
83
|
+
end
|
|
84
|
+
sources.each {|s| s.each(&blk) }
|
|
85
|
+
self
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
def spec_names
|
|
89
|
+
names = specs.keys + sources.map(&:spec_names)
|
|
90
|
+
names.uniq!
|
|
91
|
+
names
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
def unmet_dependency_names
|
|
95
|
+
dependency_names.select do |name|
|
|
96
|
+
search(name).empty?
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
def dependency_names
|
|
101
|
+
names = []
|
|
102
|
+
each do |spec|
|
|
103
|
+
spec.dependencies.each do |dep|
|
|
104
|
+
next if dep.type == :development
|
|
105
|
+
names << dep.name
|
|
106
|
+
end
|
|
107
|
+
end
|
|
108
|
+
names.uniq
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
# Combines indexes proritizing existing specs, like `Hash#reverse_merge!`
|
|
112
|
+
# Duplicate specs found in `other` are stored in `@duplicates`.
|
|
113
|
+
def use(other)
|
|
114
|
+
return unless other
|
|
115
|
+
other.each do |spec|
|
|
116
|
+
exist?(spec) ? add_duplicate(spec) : add(spec)
|
|
117
|
+
end
|
|
118
|
+
self
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
# Combines indexes proritizing specs from `other`, like `Hash#merge!`
|
|
122
|
+
# Duplicate specs found in `self` are saved in `@duplicates`.
|
|
123
|
+
def merge!(other)
|
|
124
|
+
return unless other
|
|
125
|
+
other.each do |spec|
|
|
126
|
+
if existing = find_by_spec(spec)
|
|
127
|
+
unless dependencies_eql?(existing, spec)
|
|
128
|
+
Bundler.ui.warn "Local specification for #{spec.full_name} has different dependencies than the remote gem, ignoring it"
|
|
129
|
+
next
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
add_duplicate(existing)
|
|
133
|
+
end
|
|
134
|
+
add spec
|
|
135
|
+
end
|
|
136
|
+
self
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
def size
|
|
140
|
+
@sources.inject(@specs.size) do |size, source|
|
|
141
|
+
size += source.size
|
|
142
|
+
end
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
# Whether all the specs in self are in other
|
|
146
|
+
def subset?(other)
|
|
147
|
+
all? do |spec|
|
|
148
|
+
other_spec = other[spec].first
|
|
149
|
+
other_spec && dependencies_eql?(spec, other_spec) && spec.source == other_spec.source
|
|
150
|
+
end
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
def dependencies_eql?(spec, other_spec)
|
|
154
|
+
deps = spec.runtime_dependencies
|
|
155
|
+
other_deps = other_spec.runtime_dependencies
|
|
156
|
+
deps.sort == other_deps.sort
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
def add_source(index)
|
|
160
|
+
raise ArgumentError, "Source must be an index, not #{index.class}" unless index.is_a?(Index)
|
|
161
|
+
@sources << index
|
|
162
|
+
@sources.uniq! # need to use uniq! here instead of checking for the item before adding
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
private
|
|
166
|
+
|
|
167
|
+
def safe_concat(a, b)
|
|
168
|
+
return a if b.empty?
|
|
169
|
+
return b if a.empty?
|
|
170
|
+
a.concat(b)
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
def add_duplicate(spec)
|
|
174
|
+
(@duplicates[spec.name] ||= []) << spec
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
def specs_by_name_and_version(name, version)
|
|
178
|
+
results = @specs[name]&.values
|
|
179
|
+
return EMPTY_SEARCH unless results
|
|
180
|
+
results.select! {|spec| spec.version == version }
|
|
181
|
+
results
|
|
182
|
+
end
|
|
183
|
+
|
|
184
|
+
def specs_by_name(name)
|
|
185
|
+
@specs[name]&.values || EMPTY_SEARCH
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
EMPTY_SEARCH = [].freeze
|
|
189
|
+
|
|
190
|
+
def search_by_spec(spec)
|
|
191
|
+
spec = find_by_spec(spec)
|
|
192
|
+
spec ? [spec] : EMPTY_SEARCH
|
|
193
|
+
end
|
|
194
|
+
|
|
195
|
+
def find_by_spec(spec)
|
|
196
|
+
@specs[spec.name]&.fetch(spec.full_name, nil)
|
|
197
|
+
end
|
|
198
|
+
|
|
199
|
+
def exist?(spec)
|
|
200
|
+
@specs[spec.name]&.key?(spec.full_name)
|
|
201
|
+
end
|
|
202
|
+
end
|
|
203
|
+
end
|