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,55 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Bundler
|
|
4
|
+
class Fetcher
|
|
5
|
+
class Base
|
|
6
|
+
attr_reader :downloader
|
|
7
|
+
attr_reader :display_uri
|
|
8
|
+
attr_reader :remote
|
|
9
|
+
attr_reader :gem_remote_fetcher
|
|
10
|
+
|
|
11
|
+
def initialize(downloader, remote, display_uri, gem_remote_fetcher)
|
|
12
|
+
raise "Abstract class" if self.class == Base
|
|
13
|
+
@downloader = downloader
|
|
14
|
+
@remote = remote
|
|
15
|
+
@display_uri = display_uri
|
|
16
|
+
@gem_remote_fetcher = gem_remote_fetcher
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def remote_uri
|
|
20
|
+
@remote.uri
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def fetch_uri
|
|
24
|
+
@fetch_uri ||= if remote_uri.host == "rubygems.org"
|
|
25
|
+
uri = remote_uri.dup
|
|
26
|
+
uri.host = "index.rubygems.org"
|
|
27
|
+
uri
|
|
28
|
+
else
|
|
29
|
+
remote_uri
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def available?
|
|
34
|
+
true
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def api_fetcher?
|
|
38
|
+
false
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def release_resolution_memory!
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
private
|
|
45
|
+
|
|
46
|
+
def log_specs(&block)
|
|
47
|
+
if Bundler.ui.debug?
|
|
48
|
+
Bundler.ui.debug yield
|
|
49
|
+
else
|
|
50
|
+
Bundler.ui.info ".", false
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "base"
|
|
4
|
+
require_relative "../worker"
|
|
5
|
+
|
|
6
|
+
module Bundler
|
|
7
|
+
class Fetcher
|
|
8
|
+
class CompactIndex < Base
|
|
9
|
+
def self.compact_index_request(method_name)
|
|
10
|
+
method = instance_method(method_name)
|
|
11
|
+
undef_method(method_name)
|
|
12
|
+
define_method(method_name) do |*args, &blk|
|
|
13
|
+
method.bind_call(self, *args, &blk)
|
|
14
|
+
rescue NetworkDownError, CompactIndexClient::Updater::MismatchedChecksumError => e
|
|
15
|
+
raise HTTPError, e.message
|
|
16
|
+
rescue AuthenticationRequiredError, BadAuthenticationError
|
|
17
|
+
# Fail since we got a 401 from the server.
|
|
18
|
+
raise
|
|
19
|
+
rescue HTTPError => e
|
|
20
|
+
Bundler.ui.trace(e)
|
|
21
|
+
nil
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def specs(gem_names)
|
|
26
|
+
specs_for_names(gem_names)
|
|
27
|
+
end
|
|
28
|
+
compact_index_request :specs
|
|
29
|
+
|
|
30
|
+
def specs_for_names(gem_names)
|
|
31
|
+
gem_info = []
|
|
32
|
+
complete_gems = []
|
|
33
|
+
remaining_gems = gem_names.dup
|
|
34
|
+
|
|
35
|
+
until remaining_gems.empty?
|
|
36
|
+
log_specs { "Looking up gems #{remaining_gems.inspect}" }
|
|
37
|
+
deps = fetch_gem_infos(remaining_gems).flatten(1)
|
|
38
|
+
next_gems = deps.flat_map {|d| d[CompactIndexClient::INFO_DEPS].flat_map(&:first) }.uniq
|
|
39
|
+
deps.each {|dep| gem_info << dep }
|
|
40
|
+
complete_gems.concat(deps.map(&:first)).uniq!
|
|
41
|
+
remaining_gems = next_gems - complete_gems
|
|
42
|
+
end
|
|
43
|
+
@bundle_worker&.stop
|
|
44
|
+
@bundle_worker = nil # reset it. Not sure if necessary
|
|
45
|
+
|
|
46
|
+
gem_info
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def available?
|
|
50
|
+
unless SharedHelpers.md5_available?
|
|
51
|
+
Bundler.ui.debug("FIPS mode is enabled, bundler can't use the CompactIndex API")
|
|
52
|
+
return nil
|
|
53
|
+
end
|
|
54
|
+
# Read info file checksums out of /versions, so we can know if gems are up to date
|
|
55
|
+
compact_index_client.available?
|
|
56
|
+
rescue CompactIndexClient::Updater::MismatchedChecksumError => e
|
|
57
|
+
Bundler.ui.debug(e.message)
|
|
58
|
+
nil
|
|
59
|
+
end
|
|
60
|
+
compact_index_request :available?
|
|
61
|
+
|
|
62
|
+
def api_fetcher?
|
|
63
|
+
true
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
# The client holds the parsed checksums of all info files in the
|
|
67
|
+
# index. Dropping it is always safe because it is rebuilt from the
|
|
68
|
+
# local cache on demand.
|
|
69
|
+
def release_resolution_memory!
|
|
70
|
+
@compact_index_client = nil
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
private
|
|
74
|
+
|
|
75
|
+
def compact_index_client
|
|
76
|
+
@compact_index_client ||=
|
|
77
|
+
SharedHelpers.filesystem_access(cache_path) do
|
|
78
|
+
CompactIndexClient.new(cache_path, client_fetcher)
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
def fetch_gem_infos(names)
|
|
83
|
+
# Create the client and update the versions file on this thread.
|
|
84
|
+
# Otherwise the workers race to lazily create the client and update
|
|
85
|
+
# the versions file concurrently, e.g. when the client was released
|
|
86
|
+
# after resolution and is being rebuilt for `bundle cache`.
|
|
87
|
+
compact_index_client.available?
|
|
88
|
+
|
|
89
|
+
in_parallel(names) {|name| compact_index_client.info(name) }
|
|
90
|
+
rescue TooManyRequestsError # rubygems.org is rate limiting us, slow down.
|
|
91
|
+
@bundle_worker&.stop
|
|
92
|
+
@bundle_worker = nil # reset it. Not sure if necessary
|
|
93
|
+
compact_index_client.reset!
|
|
94
|
+
names.map {|name| compact_index_client.info(name) }
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
def in_parallel(inputs, &blk)
|
|
98
|
+
func = lambda {|object, _index| blk.call(object) }
|
|
99
|
+
worker = bundle_worker(func)
|
|
100
|
+
inputs.each {|input| worker.enq(input) }
|
|
101
|
+
inputs.map { worker.deq }
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
def bundle_worker(func = nil)
|
|
105
|
+
@bundle_worker ||= begin
|
|
106
|
+
worker_name = "Compact Index (#{display_uri.host})"
|
|
107
|
+
Bundler::Worker.new(Bundler.settings.processor_count, worker_name, func)
|
|
108
|
+
end
|
|
109
|
+
@bundle_worker.tap do |worker|
|
|
110
|
+
worker.instance_variable_set(:@func, func) if func
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
def cache_path
|
|
115
|
+
Bundler.user_cache.join("compact_index", remote.cache_slug)
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
def client_fetcher
|
|
119
|
+
ClientFetcher.new(self, Bundler.ui)
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
ClientFetcher = Struct.new(:fetcher, :ui) do
|
|
123
|
+
def call(path, headers)
|
|
124
|
+
fetcher.downloader.fetch(fetcher.fetch_uri + path, headers)
|
|
125
|
+
rescue NetworkDownError => e
|
|
126
|
+
raise unless headers["If-None-Match"]
|
|
127
|
+
ui.warn "Using the cached data for the new index because of a network error: #{e}"
|
|
128
|
+
Gem::Net::HTTPNotModified.new(nil, nil, nil)
|
|
129
|
+
end
|
|
130
|
+
end
|
|
131
|
+
end
|
|
132
|
+
end
|
|
133
|
+
end
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "base"
|
|
4
|
+
require "cgi/escape"
|
|
5
|
+
require "cgi/util" unless defined?(CGI::EscapeExt)
|
|
6
|
+
|
|
7
|
+
module Bundler
|
|
8
|
+
class Fetcher
|
|
9
|
+
class Dependency < Base
|
|
10
|
+
def available?
|
|
11
|
+
@available ||= fetch_uri.scheme != "file" && downloader.fetch(dependency_api_uri)
|
|
12
|
+
rescue NetworkDownError => e
|
|
13
|
+
raise HTTPError, e.message
|
|
14
|
+
rescue AuthenticationRequiredError
|
|
15
|
+
# Fail since we got a 401 from the server.
|
|
16
|
+
raise
|
|
17
|
+
rescue HTTPError
|
|
18
|
+
false
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def api_fetcher?
|
|
22
|
+
true
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def specs(gem_names, full_dependency_list = [], last_spec_list = [])
|
|
26
|
+
query_list = gem_names.uniq - full_dependency_list
|
|
27
|
+
|
|
28
|
+
log_specs { "Query List: #{query_list.inspect}" }
|
|
29
|
+
|
|
30
|
+
return last_spec_list if query_list.empty?
|
|
31
|
+
|
|
32
|
+
spec_list, deps_list = Bundler::Retry.new("dependency api", FAIL_ERRORS).attempts do
|
|
33
|
+
dependency_specs(query_list)
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
returned_gems = spec_list.map(&:first).uniq
|
|
37
|
+
specs(deps_list, full_dependency_list + returned_gems, spec_list + last_spec_list)
|
|
38
|
+
rescue MarshalError, HTTPError, GemspecError
|
|
39
|
+
Bundler.ui.info "" unless Bundler.ui.debug? # new line now that the dots are over
|
|
40
|
+
Bundler.ui.debug "could not fetch from the dependency API, trying the full index"
|
|
41
|
+
nil
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def dependency_specs(gem_names)
|
|
45
|
+
Bundler.ui.debug "Query Gemcutter Dependency Endpoint API: #{gem_names.join(",")}"
|
|
46
|
+
|
|
47
|
+
gem_list = unmarshalled_dep_gems(gem_names)
|
|
48
|
+
get_formatted_specs_and_deps(gem_list)
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def unmarshalled_dep_gems(gem_names)
|
|
52
|
+
gem_list = []
|
|
53
|
+
gem_names.each_slice(api_request_size) do |names|
|
|
54
|
+
marshalled_deps = downloader.fetch(dependency_api_uri(names)).body
|
|
55
|
+
gem_list.concat(Bundler.safe_load_marshal(marshalled_deps))
|
|
56
|
+
end
|
|
57
|
+
gem_list
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def get_formatted_specs_and_deps(gem_list)
|
|
61
|
+
deps_list = []
|
|
62
|
+
spec_list = []
|
|
63
|
+
|
|
64
|
+
gem_list.each do |s|
|
|
65
|
+
deps_list.concat(s[:dependencies].map(&:first))
|
|
66
|
+
deps = s[:dependencies].map {|n, d| [n, d.split(", ")] }
|
|
67
|
+
spec_list.push([s[:name], s[:number], s[:platform], deps])
|
|
68
|
+
end
|
|
69
|
+
[spec_list, deps_list]
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def dependency_api_uri(gem_names = [])
|
|
73
|
+
uri = fetch_uri + "api/v1/dependencies"
|
|
74
|
+
uri.query = "gems=#{CGI.escape(gem_names.sort.join(","))}" if gem_names.any?
|
|
75
|
+
uri
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
private
|
|
79
|
+
|
|
80
|
+
def api_request_size
|
|
81
|
+
Bundler.settings[:api_request_size]&.to_i || Source::Rubygems::API_REQUEST_SIZE
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
end
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Bundler
|
|
4
|
+
class Fetcher
|
|
5
|
+
class Downloader
|
|
6
|
+
HTTP_NON_RETRYABLE_ERRORS = [
|
|
7
|
+
SocketError,
|
|
8
|
+
Errno::EADDRNOTAVAIL,
|
|
9
|
+
Errno::ENETDOWN,
|
|
10
|
+
Errno::ENETUNREACH,
|
|
11
|
+
Gem::Net::HTTP::Persistent::Error,
|
|
12
|
+
Errno::EHOSTUNREACH,
|
|
13
|
+
].freeze
|
|
14
|
+
|
|
15
|
+
HTTP_RETRYABLE_ERRORS = [
|
|
16
|
+
Gem::Timeout::Error,
|
|
17
|
+
EOFError,
|
|
18
|
+
Errno::EINVAL,
|
|
19
|
+
Errno::ECONNRESET,
|
|
20
|
+
Errno::ETIMEDOUT,
|
|
21
|
+
Errno::EAGAIN,
|
|
22
|
+
Gem::Net::HTTPBadResponse,
|
|
23
|
+
Gem::Net::HTTPHeaderSyntaxError,
|
|
24
|
+
Gem::Net::ProtocolError,
|
|
25
|
+
Zlib::BufError,
|
|
26
|
+
].freeze
|
|
27
|
+
|
|
28
|
+
attr_reader :connection
|
|
29
|
+
attr_reader :redirect_limit
|
|
30
|
+
|
|
31
|
+
def initialize(connection, redirect_limit)
|
|
32
|
+
@connection = connection
|
|
33
|
+
@redirect_limit = redirect_limit
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def fetch(uri, headers = {}, counter = 0)
|
|
37
|
+
raise HTTPError, "Too many redirects" if counter >= redirect_limit
|
|
38
|
+
|
|
39
|
+
filtered_uri = URICredentialsFilter.credential_filtered_uri(uri)
|
|
40
|
+
|
|
41
|
+
response = request(uri, headers)
|
|
42
|
+
Bundler.ui.debug("HTTP #{response.code} #{response.message} #{filtered_uri}")
|
|
43
|
+
|
|
44
|
+
case response
|
|
45
|
+
when Gem::Net::HTTPSuccess, Gem::Net::HTTPNotModified
|
|
46
|
+
response
|
|
47
|
+
when Gem::Net::HTTPRedirection
|
|
48
|
+
new_uri = Gem::URI.parse(response["location"])
|
|
49
|
+
if new_uri.host == uri.host
|
|
50
|
+
new_uri.user = uri.user
|
|
51
|
+
new_uri.password = uri.password
|
|
52
|
+
end
|
|
53
|
+
fetch(new_uri, headers, counter + 1)
|
|
54
|
+
when Gem::Net::HTTPRequestedRangeNotSatisfiable
|
|
55
|
+
new_headers = headers.dup
|
|
56
|
+
new_headers.delete("Range")
|
|
57
|
+
fetch(uri, new_headers)
|
|
58
|
+
when Gem::Net::HTTPRequestEntityTooLarge
|
|
59
|
+
raise FallbackError, response.body
|
|
60
|
+
when Gem::Net::HTTPTooManyRequests
|
|
61
|
+
raise TooManyRequestsError, response.body
|
|
62
|
+
when Gem::Net::HTTPUnauthorized
|
|
63
|
+
raise BadAuthenticationError, uri.host if uri.userinfo
|
|
64
|
+
raise AuthenticationRequiredError, uri.host
|
|
65
|
+
when Gem::Net::HTTPForbidden
|
|
66
|
+
raise AuthenticationForbiddenError, uri.host
|
|
67
|
+
when Gem::Net::HTTPNotFound
|
|
68
|
+
raise FallbackError, "Gem::Net::HTTPNotFound: #{filtered_uri}"
|
|
69
|
+
else
|
|
70
|
+
message = "Gem::#{response.class.name.gsub(/\AGem::/, "")}"
|
|
71
|
+
message += ": #{response.body}" unless response.body.empty?
|
|
72
|
+
raise HTTPError, message
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def request(uri, headers)
|
|
77
|
+
validate_uri_scheme!(uri)
|
|
78
|
+
|
|
79
|
+
filtered_uri = URICredentialsFilter.credential_filtered_uri(uri)
|
|
80
|
+
|
|
81
|
+
Bundler.ui.debug "HTTP GET #{filtered_uri}"
|
|
82
|
+
req = Gem::Net::HTTP::Get.new uri.request_uri, headers
|
|
83
|
+
if uri.user
|
|
84
|
+
user = CGI.unescape(uri.user)
|
|
85
|
+
password = uri.password ? CGI.unescape(uri.password) : nil
|
|
86
|
+
req.basic_auth(user, password)
|
|
87
|
+
end
|
|
88
|
+
connection.request(uri, req)
|
|
89
|
+
rescue OpenSSL::SSL::SSLError
|
|
90
|
+
raise CertificateFailureError.new(uri)
|
|
91
|
+
rescue *HTTP_NON_RETRYABLE_ERRORS => e
|
|
92
|
+
Bundler.ui.trace e
|
|
93
|
+
|
|
94
|
+
host = uri.host
|
|
95
|
+
host_port = "#{host}:#{uri.port}"
|
|
96
|
+
host = host_port if filtered_uri.to_s.include?(host_port)
|
|
97
|
+
raise NetworkDownError, "Could not reach host #{host}. Check your network " \
|
|
98
|
+
"connection and try again."
|
|
99
|
+
rescue *HTTP_RETRYABLE_ERRORS => e
|
|
100
|
+
Bundler.ui.trace e
|
|
101
|
+
|
|
102
|
+
raise HTTPError, "Network error while fetching #{filtered_uri}" \
|
|
103
|
+
" (#{e})"
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
private
|
|
107
|
+
|
|
108
|
+
def validate_uri_scheme!(uri)
|
|
109
|
+
return if /\Ahttps?\z/.match?(uri.scheme)
|
|
110
|
+
raise InvalidOption,
|
|
111
|
+
"The request uri `#{uri}` has an invalid scheme (`#{uri.scheme}`). " \
|
|
112
|
+
"Did you mean `http` or `https`?"
|
|
113
|
+
end
|
|
114
|
+
end
|
|
115
|
+
end
|
|
116
|
+
end
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "rubygems/remote_fetcher"
|
|
4
|
+
|
|
5
|
+
module Bundler
|
|
6
|
+
class Fetcher
|
|
7
|
+
class GemRemoteFetcher < Gem::RemoteFetcher
|
|
8
|
+
def initialize(*)
|
|
9
|
+
super
|
|
10
|
+
|
|
11
|
+
@pool_size = Bundler.settings.installation_parallelization
|
|
12
|
+
ssl_ca_cert = Bundler.settings[:ssl_ca_cert]
|
|
13
|
+
@cert_files << ssl_ca_cert if ssl_ca_cert
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def request(*args)
|
|
17
|
+
super do |req|
|
|
18
|
+
req.delete("User-Agent") if headers["User-Agent"]
|
|
19
|
+
yield req if block_given?
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "base"
|
|
4
|
+
|
|
5
|
+
module Bundler
|
|
6
|
+
class Fetcher
|
|
7
|
+
class Index < Base
|
|
8
|
+
def specs(_gem_names)
|
|
9
|
+
Bundler.rubygems.fetch_all_remote_specs(remote, gem_remote_fetcher)
|
|
10
|
+
rescue Gem::RemoteFetcher::FetchError => e
|
|
11
|
+
case e.message
|
|
12
|
+
when /certificate verify failed/
|
|
13
|
+
raise CertificateFailureError.new(display_uri)
|
|
14
|
+
when /401/
|
|
15
|
+
raise BadAuthenticationError, remote_uri if remote_uri.userinfo
|
|
16
|
+
raise AuthenticationRequiredError, remote_uri
|
|
17
|
+
when /403/
|
|
18
|
+
raise AuthenticationForbiddenError, remote_uri
|
|
19
|
+
else
|
|
20
|
+
raise HTTPError, "Could not fetch specs from #{display_uri} due to underlying error <#{e.message}>"
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|