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,509 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Bundler
|
|
4
|
+
class Source
|
|
5
|
+
class Git
|
|
6
|
+
class GitNotInstalledError < GitError
|
|
7
|
+
def initialize
|
|
8
|
+
msg = String.new
|
|
9
|
+
msg << "You need to install git to be able to use gems from git repositories. "
|
|
10
|
+
msg << "For help installing git, please refer to GitHub's tutorial at https://help.github.com/articles/set-up-git"
|
|
11
|
+
super msg
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
class GitNotAllowedError < GitError
|
|
16
|
+
def initialize(command)
|
|
17
|
+
msg = String.new
|
|
18
|
+
msg << "Bundler is trying to run `#{command}` at runtime. You probably need to run `bundle install`. However, "
|
|
19
|
+
msg << "this error message could probably be more useful. Please submit a ticket at https://github.com/ruby/rubygems/issues/new?labels=Bundler&template=bundler-related-issue.md "
|
|
20
|
+
msg << "with steps to reproduce as well as the following\n\nCALLER: #{caller.join("\n")}"
|
|
21
|
+
super msg
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
class GitCommandError < GitError
|
|
26
|
+
attr_reader :command
|
|
27
|
+
|
|
28
|
+
def initialize(command, path, extra_info = nil)
|
|
29
|
+
@command = command
|
|
30
|
+
|
|
31
|
+
msg = String.new("Git error: command `#{command}`")
|
|
32
|
+
msg << " in directory #{path}" if path
|
|
33
|
+
msg << " has failed."
|
|
34
|
+
msg << "\n#{extra_info}" if extra_info
|
|
35
|
+
super msg
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
class MissingGitRevisionError < GitCommandError
|
|
40
|
+
def initialize(command, destination_path, ref, repo)
|
|
41
|
+
msg = "Revision #{ref} does not exist in the repository #{repo}. Maybe you misspelled it?"
|
|
42
|
+
super command, destination_path, msg
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
class AmbiguousGitReference < GitError
|
|
47
|
+
def initialize(options)
|
|
48
|
+
msg = "Specification of branch or ref with tag is ambiguous. You specified #{options.inspect}"
|
|
49
|
+
super msg
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
# The GitProxy is responsible to interact with git repositories.
|
|
54
|
+
# All actions required by the Git source is encapsulated in this
|
|
55
|
+
# object.
|
|
56
|
+
class GitProxy
|
|
57
|
+
attr_accessor :path, :uri, :branch, :tag, :ref, :explicit_ref
|
|
58
|
+
attr_writer :revision
|
|
59
|
+
|
|
60
|
+
def self.version
|
|
61
|
+
@version ||= full_version[/((\.?\d+)+).*/, 1]
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def self.full_version
|
|
65
|
+
@full_version ||= begin
|
|
66
|
+
raise GitNotInstalledError.new unless Bundler.git_present?
|
|
67
|
+
|
|
68
|
+
require "open3"
|
|
69
|
+
out, err, status = Open3.capture3("git", "--version")
|
|
70
|
+
|
|
71
|
+
raise GitCommandError.new("--version", SharedHelpers.pwd, err) unless status.success?
|
|
72
|
+
Bundler.ui.warn err unless err.empty?
|
|
73
|
+
|
|
74
|
+
out.sub(/git version\s*/, "").strip
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
def self.reset
|
|
79
|
+
@version = nil
|
|
80
|
+
@full_version = nil
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
def initialize(path, uri, options = {}, revision = nil, git = nil)
|
|
84
|
+
@path = path
|
|
85
|
+
@uri = uri
|
|
86
|
+
@tag = options["tag"]
|
|
87
|
+
@branch = options["branch"]
|
|
88
|
+
@ref = options["ref"]
|
|
89
|
+
if @tag
|
|
90
|
+
raise AmbiguousGitReference.new(options) if @branch || @ref
|
|
91
|
+
@explicit_ref = @tag
|
|
92
|
+
else
|
|
93
|
+
@explicit_ref = @ref || @branch
|
|
94
|
+
end
|
|
95
|
+
@revision = revision
|
|
96
|
+
@git = git
|
|
97
|
+
@commit_ref = nil
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
def revision
|
|
101
|
+
@revision ||= allowed_with_path { find_local_revision }
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
def current_branch
|
|
105
|
+
@current_branch ||= with_path do
|
|
106
|
+
git_local("rev-parse", "--abbrev-ref", "HEAD", dir: path).strip
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
def contains?(commit)
|
|
111
|
+
allowed_with_path do
|
|
112
|
+
result, status = git_null("branch", "--contains", commit, dir: path)
|
|
113
|
+
status.success? && result.match?(/^\* (.*)$/)
|
|
114
|
+
end
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
def version
|
|
118
|
+
self.class.version
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
def full_version
|
|
122
|
+
self.class.full_version
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
def checkout
|
|
126
|
+
return if has_revision_cached?
|
|
127
|
+
|
|
128
|
+
Bundler.ui.info "Fetching #{credential_filtered_uri}"
|
|
129
|
+
|
|
130
|
+
extra_fetch_needed = clone_needs_extra_fetch?
|
|
131
|
+
unshallow_needed = clone_needs_unshallow?
|
|
132
|
+
return unless extra_fetch_needed || unshallow_needed
|
|
133
|
+
|
|
134
|
+
git_remote_fetch(unshallow_needed ? ["--unshallow"] : depth_args)
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
def copy_to(destination, submodules = false)
|
|
138
|
+
unless File.exist?(destination.join(".git"))
|
|
139
|
+
begin
|
|
140
|
+
SharedHelpers.filesystem_access(destination.dirname) do |p|
|
|
141
|
+
FileUtils.mkdir_p(p)
|
|
142
|
+
end
|
|
143
|
+
SharedHelpers.filesystem_access(destination) do |p|
|
|
144
|
+
FileUtils.rm_rf(p)
|
|
145
|
+
end
|
|
146
|
+
git "clone", "--no-checkout", "--quiet", path.to_s, destination.to_s
|
|
147
|
+
# The copy is cloned from the local bare cache, which holds no Git LFS
|
|
148
|
+
# objects, so point origin back at the real remote and let git-lfs derive
|
|
149
|
+
# its endpoint from there when checking out. Use the credential-filtered
|
|
150
|
+
# URI to avoid persisting secrets in the copy's .git/config; auth is left
|
|
151
|
+
# to git's credential helper.
|
|
152
|
+
git "remote", "set-url", "origin", credential_filtered_uri, dir: destination
|
|
153
|
+
File.chmod((File.stat(destination).mode | 0o777) & ~File.umask, destination)
|
|
154
|
+
rescue Errno::EEXIST => e
|
|
155
|
+
file_path = e.message[%r{.*?((?:[a-zA-Z]:)?/.*)}, 1]
|
|
156
|
+
raise GitError, "Bundler could not install a gem because it needs to " \
|
|
157
|
+
"create a directory, but a file exists - #{file_path}. Please delete " \
|
|
158
|
+
"this file and try again."
|
|
159
|
+
end
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
ref = @commit_ref || (locked_to_full_sha? && @revision)
|
|
163
|
+
if ref
|
|
164
|
+
git "config", "uploadpack.allowAnySHA1InWant", "true", dir: path.to_s if @commit_ref.nil? && needs_allow_any_sha1_in_want?
|
|
165
|
+
|
|
166
|
+
git "fetch", "--force", "--quiet", *extra_fetch_args(ref), dir: destination
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
git "reset", "--hard", revision, dir: destination
|
|
170
|
+
|
|
171
|
+
if submodules
|
|
172
|
+
git_retry "submodule", "update", "--init", "--recursive", dir: destination
|
|
173
|
+
elsif Gem::Version.create(version) >= Gem::Version.create("2.9.0")
|
|
174
|
+
inner_command = "git -C $toplevel submodule deinit --force $sm_path"
|
|
175
|
+
git_retry "submodule", "foreach", "--quiet", inner_command, dir: destination
|
|
176
|
+
end
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
def installed_to?(destination)
|
|
180
|
+
# if copy_to is interrupted, it may leave a partially installed directory that
|
|
181
|
+
# contains .git but no other files -- consider this not to be installed
|
|
182
|
+
Dir.exist?(destination) && (Dir.children(destination) - [".git"]).any?
|
|
183
|
+
end
|
|
184
|
+
|
|
185
|
+
private
|
|
186
|
+
|
|
187
|
+
def git_remote_fetch(args)
|
|
188
|
+
command = fetch_command(args)
|
|
189
|
+
command_with_no_credentials = check_allowed(command)
|
|
190
|
+
|
|
191
|
+
Bundler::Retry.new("`#{command_with_no_credentials}` at #{path}", [MissingGitRevisionError]).attempts do
|
|
192
|
+
out, err, status = capture(command, path)
|
|
193
|
+
return out if status.success?
|
|
194
|
+
|
|
195
|
+
if err.include?("couldn't find remote ref") || err.include?("not our ref")
|
|
196
|
+
raise MissingGitRevisionError.new(command_with_no_credentials, path, commit || explicit_ref, credential_filtered_uri)
|
|
197
|
+
else
|
|
198
|
+
if shallow?
|
|
199
|
+
args -= depth_args
|
|
200
|
+
command = fetch_command(args)
|
|
201
|
+
command_with_no_credentials = check_allowed(command)
|
|
202
|
+
end
|
|
203
|
+
raise GitCommandError.new(command_with_no_credentials, path, err)
|
|
204
|
+
end
|
|
205
|
+
end
|
|
206
|
+
end
|
|
207
|
+
|
|
208
|
+
def clone_needs_extra_fetch?
|
|
209
|
+
return true if path.exist?
|
|
210
|
+
|
|
211
|
+
SharedHelpers.filesystem_access(path.dirname) do |p|
|
|
212
|
+
FileUtils.mkdir_p(p)
|
|
213
|
+
end
|
|
214
|
+
|
|
215
|
+
clone_args = extra_clone_args
|
|
216
|
+
command = clone_command(clone_args)
|
|
217
|
+
command_with_no_credentials = check_allowed(command)
|
|
218
|
+
|
|
219
|
+
Bundler::Retry.new("`#{command_with_no_credentials}`", [MissingGitRevisionError]).attempts do
|
|
220
|
+
_, err, status = capture(command, nil)
|
|
221
|
+
return extra_ref if status.success?
|
|
222
|
+
|
|
223
|
+
if err.include?("Could not find remote branch") || # git up to 2.49
|
|
224
|
+
err.include?("Remote branch #{branch_option} not found") # git 2.49 or higher
|
|
225
|
+
raise MissingGitRevisionError.new(command_with_no_credentials, nil, explicit_ref, credential_filtered_uri)
|
|
226
|
+
else
|
|
227
|
+
if shallow?
|
|
228
|
+
clone_args -= depth_args
|
|
229
|
+
command = clone_command(clone_args)
|
|
230
|
+
command_with_no_credentials = check_allowed(command)
|
|
231
|
+
end
|
|
232
|
+
raise GitCommandError.new(command_with_no_credentials, path, err)
|
|
233
|
+
end
|
|
234
|
+
end
|
|
235
|
+
end
|
|
236
|
+
|
|
237
|
+
def clone_needs_unshallow?
|
|
238
|
+
return false unless path.join("shallow").exist?
|
|
239
|
+
return true unless shallow?
|
|
240
|
+
|
|
241
|
+
@revision && @revision != head_revision
|
|
242
|
+
end
|
|
243
|
+
|
|
244
|
+
def extra_ref
|
|
245
|
+
return false if not_pinned?
|
|
246
|
+
return true if shallow?
|
|
247
|
+
|
|
248
|
+
ref.start_with?("refs/")
|
|
249
|
+
end
|
|
250
|
+
|
|
251
|
+
def depth
|
|
252
|
+
return @depth if defined?(@depth)
|
|
253
|
+
|
|
254
|
+
@depth = if !supports_fetching_unreachable_refs?
|
|
255
|
+
nil
|
|
256
|
+
elsif not_pinned? || pinned_to_full_sha?
|
|
257
|
+
1
|
|
258
|
+
elsif ref.include?("~")
|
|
259
|
+
parsed_depth = ref.split("~").last
|
|
260
|
+
parsed_depth.to_i + 1
|
|
261
|
+
end
|
|
262
|
+
end
|
|
263
|
+
|
|
264
|
+
def refspec
|
|
265
|
+
if commit
|
|
266
|
+
@commit_ref = "refs/#{commit}-sha"
|
|
267
|
+
return "#{commit}:#{@commit_ref}"
|
|
268
|
+
end
|
|
269
|
+
|
|
270
|
+
reference = fully_qualified_ref
|
|
271
|
+
|
|
272
|
+
reference ||= if ref.include?("~")
|
|
273
|
+
ref.split("~").first
|
|
274
|
+
elsif ref.start_with?("refs/")
|
|
275
|
+
ref
|
|
276
|
+
else
|
|
277
|
+
"refs/*"
|
|
278
|
+
end
|
|
279
|
+
|
|
280
|
+
"#{reference}:#{reference}"
|
|
281
|
+
end
|
|
282
|
+
|
|
283
|
+
def commit
|
|
284
|
+
@commit ||= pinned_to_full_sha? ? ref : @revision
|
|
285
|
+
end
|
|
286
|
+
|
|
287
|
+
def fully_qualified_ref
|
|
288
|
+
if branch
|
|
289
|
+
"refs/heads/#{branch}"
|
|
290
|
+
elsif tag
|
|
291
|
+
"refs/tags/#{tag}"
|
|
292
|
+
elsif ref.nil?
|
|
293
|
+
"refs/heads/#{current_branch}"
|
|
294
|
+
end
|
|
295
|
+
end
|
|
296
|
+
|
|
297
|
+
def not_pinned?
|
|
298
|
+
branch_option || ref.nil?
|
|
299
|
+
end
|
|
300
|
+
|
|
301
|
+
def pinned_to_full_sha?
|
|
302
|
+
full_sha_revision?(ref)
|
|
303
|
+
end
|
|
304
|
+
|
|
305
|
+
def locked_to_full_sha?
|
|
306
|
+
full_sha_revision?(@revision)
|
|
307
|
+
end
|
|
308
|
+
|
|
309
|
+
def full_sha_revision?(ref)
|
|
310
|
+
ref&.match?(/\A\h{40}\z/)
|
|
311
|
+
end
|
|
312
|
+
|
|
313
|
+
def git_null(*command, dir: nil)
|
|
314
|
+
check_allowed(command)
|
|
315
|
+
|
|
316
|
+
capture(command, dir, ignore_err: true)
|
|
317
|
+
end
|
|
318
|
+
|
|
319
|
+
def git_retry(*command, dir: nil)
|
|
320
|
+
command_with_no_credentials = check_allowed(command)
|
|
321
|
+
|
|
322
|
+
Bundler::Retry.new("`#{command_with_no_credentials}` at #{dir || SharedHelpers.pwd}").attempts do
|
|
323
|
+
git(*command, dir: dir)
|
|
324
|
+
end
|
|
325
|
+
end
|
|
326
|
+
|
|
327
|
+
def git(*command, dir: nil)
|
|
328
|
+
run_command(*command, dir: dir) do |unredacted_command|
|
|
329
|
+
check_allowed(unredacted_command)
|
|
330
|
+
end
|
|
331
|
+
end
|
|
332
|
+
|
|
333
|
+
def git_local(*command, dir: nil)
|
|
334
|
+
run_command(*command, dir: dir) do |unredacted_command|
|
|
335
|
+
redact_and_check_presence(unredacted_command)
|
|
336
|
+
end
|
|
337
|
+
end
|
|
338
|
+
|
|
339
|
+
def has_revision_cached?
|
|
340
|
+
return unless commit && path.exist?
|
|
341
|
+
git("cat-file", "-e", commit, dir: path)
|
|
342
|
+
true
|
|
343
|
+
rescue GitError
|
|
344
|
+
false
|
|
345
|
+
end
|
|
346
|
+
|
|
347
|
+
def find_local_revision
|
|
348
|
+
return head_revision if explicit_ref.nil?
|
|
349
|
+
|
|
350
|
+
find_revision_for(explicit_ref)
|
|
351
|
+
end
|
|
352
|
+
|
|
353
|
+
def head_revision
|
|
354
|
+
verify("HEAD")
|
|
355
|
+
end
|
|
356
|
+
|
|
357
|
+
def find_revision_for(reference)
|
|
358
|
+
verify(reference)
|
|
359
|
+
rescue GitCommandError => e
|
|
360
|
+
raise MissingGitRevisionError.new(e.command, path, reference, credential_filtered_uri)
|
|
361
|
+
end
|
|
362
|
+
|
|
363
|
+
def verify(reference)
|
|
364
|
+
git("rev-parse", "--verify", reference, dir: path).strip
|
|
365
|
+
end
|
|
366
|
+
|
|
367
|
+
# Adds credentials to the URI
|
|
368
|
+
def configured_uri
|
|
369
|
+
if /https?:/.match?(uri)
|
|
370
|
+
remote = Gem::URI(uri)
|
|
371
|
+
config_auth = Bundler.settings[remote.to_s] || Bundler.settings[remote.host]
|
|
372
|
+
remote.userinfo ||= config_auth
|
|
373
|
+
remote.to_s
|
|
374
|
+
else
|
|
375
|
+
uri.to_s
|
|
376
|
+
end
|
|
377
|
+
end
|
|
378
|
+
|
|
379
|
+
# Removes credentials from the URI
|
|
380
|
+
def credential_filtered_uri
|
|
381
|
+
URICredentialsFilter.credential_filtered_uri(uri)
|
|
382
|
+
end
|
|
383
|
+
|
|
384
|
+
def allow?
|
|
385
|
+
allowed = @git ? @git.allow_git_ops? : true
|
|
386
|
+
|
|
387
|
+
raise GitNotInstalledError.new if allowed && !Bundler.git_present?
|
|
388
|
+
|
|
389
|
+
allowed
|
|
390
|
+
end
|
|
391
|
+
|
|
392
|
+
def with_path(&blk)
|
|
393
|
+
checkout unless path.exist?
|
|
394
|
+
blk.call
|
|
395
|
+
end
|
|
396
|
+
|
|
397
|
+
def allowed_with_path
|
|
398
|
+
return with_path { yield } if allow?
|
|
399
|
+
raise GitError, "The git source #{uri} is not yet checked out. Please run `bundle install` before trying to start your application"
|
|
400
|
+
end
|
|
401
|
+
|
|
402
|
+
def check_allowed(command)
|
|
403
|
+
command_with_no_credentials = redact_and_check_presence(command)
|
|
404
|
+
raise GitNotAllowedError.new(command_with_no_credentials) unless allow?
|
|
405
|
+
command_with_no_credentials
|
|
406
|
+
end
|
|
407
|
+
|
|
408
|
+
def redact_and_check_presence(command)
|
|
409
|
+
raise GitNotInstalledError.new unless Bundler.git_present?
|
|
410
|
+
|
|
411
|
+
require "shellwords"
|
|
412
|
+
URICredentialsFilter.credential_filtered_string("git #{command.shelljoin}", uri)
|
|
413
|
+
end
|
|
414
|
+
|
|
415
|
+
def run_command(*command, dir: nil)
|
|
416
|
+
command_with_no_credentials = yield(command)
|
|
417
|
+
|
|
418
|
+
out, err, status = capture(command, dir)
|
|
419
|
+
|
|
420
|
+
raise GitCommandError.new(command_with_no_credentials, dir || SharedHelpers.pwd, err) unless status.success?
|
|
421
|
+
|
|
422
|
+
Bundler.ui.warn err unless err.empty?
|
|
423
|
+
|
|
424
|
+
out
|
|
425
|
+
end
|
|
426
|
+
|
|
427
|
+
def capture(cmd, dir, ignore_err: false)
|
|
428
|
+
SharedHelpers.with_clean_git_env do
|
|
429
|
+
require "open3"
|
|
430
|
+
out, err, status = Open3.capture3(*capture3_args_for(cmd, dir))
|
|
431
|
+
|
|
432
|
+
filtered_out = URICredentialsFilter.credential_filtered_string(out, uri)
|
|
433
|
+
return [filtered_out, status] if ignore_err
|
|
434
|
+
|
|
435
|
+
filtered_err = URICredentialsFilter.credential_filtered_string(err, uri)
|
|
436
|
+
[filtered_out, filtered_err, status]
|
|
437
|
+
end
|
|
438
|
+
end
|
|
439
|
+
|
|
440
|
+
def capture3_args_for(cmd, dir)
|
|
441
|
+
# Disable automatic maintenance so a background commit-graph write in
|
|
442
|
+
# the source repo can't race the hardlinking local clone and fail with
|
|
443
|
+
# "hardlink different from source".
|
|
444
|
+
opts = ["-c", "gc.auto=0", "-c", "maintenance.auto=false"]
|
|
445
|
+
|
|
446
|
+
return ["git", *opts, *cmd] unless dir
|
|
447
|
+
|
|
448
|
+
["git", "-C", dir.to_s, *opts, *cmd]
|
|
449
|
+
end
|
|
450
|
+
|
|
451
|
+
def extra_clone_args
|
|
452
|
+
args = depth_args
|
|
453
|
+
return [] if args.empty?
|
|
454
|
+
|
|
455
|
+
args += ["--single-branch"]
|
|
456
|
+
args.unshift("--no-tags") if supports_cloning_with_no_tags?
|
|
457
|
+
|
|
458
|
+
# If there's a locked revision, no need to clone any specific branch
|
|
459
|
+
# or tag, since we will end up checking out that locked revision
|
|
460
|
+
# anyways.
|
|
461
|
+
return args if @revision
|
|
462
|
+
|
|
463
|
+
args += ["--branch", branch_option] if branch_option
|
|
464
|
+
args
|
|
465
|
+
end
|
|
466
|
+
|
|
467
|
+
def fetch_command(args)
|
|
468
|
+
["fetch", "--force", "--quiet", "--no-tags", *args, "--", configured_uri, refspec].compact
|
|
469
|
+
end
|
|
470
|
+
|
|
471
|
+
def clone_command(args)
|
|
472
|
+
["clone", "--bare", "--no-hardlinks", "--quiet", *args, "--", configured_uri, path.to_s]
|
|
473
|
+
end
|
|
474
|
+
|
|
475
|
+
def depth_args
|
|
476
|
+
return [] unless shallow?
|
|
477
|
+
|
|
478
|
+
["--depth", depth.to_s]
|
|
479
|
+
end
|
|
480
|
+
|
|
481
|
+
def extra_fetch_args(ref)
|
|
482
|
+
extra_args = [path.to_s, *depth_args]
|
|
483
|
+
extra_args.push(ref)
|
|
484
|
+
extra_args
|
|
485
|
+
end
|
|
486
|
+
|
|
487
|
+
def branch_option
|
|
488
|
+
branch || tag
|
|
489
|
+
end
|
|
490
|
+
|
|
491
|
+
def shallow?
|
|
492
|
+
!depth.nil?
|
|
493
|
+
end
|
|
494
|
+
|
|
495
|
+
def needs_allow_any_sha1_in_want?
|
|
496
|
+
@needs_allow_any_sha1_in_want ||= Gem::Version.new(version) <= Gem::Version.new("2.13.7")
|
|
497
|
+
end
|
|
498
|
+
|
|
499
|
+
def supports_fetching_unreachable_refs?
|
|
500
|
+
@supports_fetching_unreachable_refs ||= Gem::Version.new(version) >= Gem::Version.new("2.5.0")
|
|
501
|
+
end
|
|
502
|
+
|
|
503
|
+
def supports_cloning_with_no_tags?
|
|
504
|
+
@supports_cloning_with_no_tags ||= Gem::Version.new(version) >= Gem::Version.new("2.14.0-rc0")
|
|
505
|
+
end
|
|
506
|
+
end
|
|
507
|
+
end
|
|
508
|
+
end
|
|
509
|
+
end
|