bundler 2.2.29 → 2.5.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +1129 -4
- data/README.md +4 -8
- data/bundler.gemspec +11 -11
- data/exe/bundle +5 -26
- data/exe/bundler +1 -1
- data/lib/bundler/.document +1 -0
- data/lib/bundler/build_metadata.rb +4 -4
- data/lib/bundler/capistrano.rb +1 -1
- data/lib/bundler/checksum.rb +254 -0
- data/lib/bundler/ci_detector.rb +75 -0
- data/lib/bundler/cli/add.rb +4 -4
- data/lib/bundler/cli/binstubs.rb +10 -6
- data/lib/bundler/cli/cache.rb +1 -1
- data/lib/bundler/cli/check.rb +3 -3
- data/lib/bundler/cli/common.rb +13 -3
- data/lib/bundler/cli/config.rb +18 -8
- data/lib/bundler/cli/console.rb +5 -4
- data/lib/bundler/cli/doctor.rb +12 -5
- data/lib/bundler/cli/exec.rb +1 -1
- data/lib/bundler/cli/fund.rb +1 -1
- data/lib/bundler/cli/gem.rb +141 -48
- data/lib/bundler/cli/info.rb +27 -17
- data/lib/bundler/cli/init.rb +6 -2
- data/lib/bundler/cli/install.rb +22 -39
- data/lib/bundler/cli/issue.rb +5 -4
- data/lib/bundler/cli/lock.rb +36 -29
- data/lib/bundler/cli/open.rb +9 -9
- data/lib/bundler/cli/outdated.rb +19 -12
- data/lib/bundler/cli/platform.rb +8 -6
- data/lib/bundler/cli/plugin.rb +9 -15
- data/lib/bundler/cli/pristine.rb +38 -30
- data/lib/bundler/cli/show.rb +3 -3
- data/lib/bundler/cli/update.rb +12 -7
- data/lib/bundler/cli/viz.rb +1 -1
- data/lib/bundler/cli.rb +266 -285
- data/lib/bundler/compact_index_client/cache.rb +53 -67
- data/lib/bundler/compact_index_client/cache_file.rb +153 -0
- data/lib/bundler/compact_index_client/gem_parser.rb +7 -3
- data/lib/bundler/compact_index_client/parser.rb +84 -0
- data/lib/bundler/compact_index_client/updater.rb +83 -76
- data/lib/bundler/compact_index_client.rb +59 -87
- data/lib/bundler/constants.rb +9 -2
- data/lib/bundler/current_ruby.rb +12 -16
- data/lib/bundler/definition.rb +509 -319
- data/lib/bundler/dependency.rb +33 -71
- data/lib/bundler/digest.rb +71 -0
- data/lib/bundler/dsl.rb +88 -69
- data/lib/bundler/endpoint_specification.rb +32 -15
- data/lib/bundler/env.rb +5 -7
- data/lib/bundler/environment_preserver.rb +8 -22
- data/lib/bundler/errors.rb +101 -13
- data/lib/bundler/feature_flag.rb +0 -2
- data/lib/bundler/fetcher/base.rb +11 -11
- data/lib/bundler/fetcher/compact_index.rb +32 -52
- data/lib/bundler/fetcher/dependency.rb +3 -7
- data/lib/bundler/fetcher/downloader.rb +17 -16
- data/lib/bundler/fetcher/gem_remote_fetcher.rb +16 -0
- data/lib/bundler/fetcher/index.rb +2 -29
- data/lib/bundler/fetcher.rb +87 -79
- data/lib/bundler/force_platform.rb +18 -0
- data/lib/bundler/friendly_errors.rb +29 -40
- data/lib/bundler/gem_helper.rb +11 -23
- data/lib/bundler/gem_helpers.rb +30 -6
- data/lib/bundler/gem_version_promoter.rb +68 -109
- data/lib/bundler/graph.rb +9 -9
- data/lib/bundler/index.rb +71 -79
- data/lib/bundler/injector.rb +23 -11
- data/lib/bundler/inline.rb +11 -23
- data/lib/bundler/installer/gem_installer.rb +18 -11
- data/lib/bundler/installer/parallel_installer.rb +17 -65
- data/lib/bundler/installer/standalone.rb +56 -15
- data/lib/bundler/installer.rb +35 -61
- data/lib/bundler/lazy_specification.rb +92 -61
- data/lib/bundler/lockfile_generator.rb +12 -3
- data/lib/bundler/lockfile_parser.rb +137 -70
- data/lib/bundler/man/bundle-add.1 +19 -26
- data/lib/bundler/man/bundle-add.1.ronn +16 -4
- data/lib/bundler/man/bundle-binstubs.1 +4 -16
- data/lib/bundler/man/bundle-cache.1 +9 -24
- data/lib/bundler/man/bundle-cache.1.ronn +9 -2
- data/lib/bundler/man/bundle-check.1 +5 -12
- data/lib/bundler/man/bundle-check.1.ronn +3 -0
- data/lib/bundler/man/bundle-clean.1 +4 -11
- data/lib/bundler/man/bundle-clean.1.ronn +1 -1
- data/lib/bundler/man/bundle-config.1 +47 -224
- data/lib/bundler/man/bundle-config.1.ronn +40 -28
- data/lib/bundler/man/bundle-console.1 +35 -0
- data/lib/bundler/man/bundle-console.1.ronn +44 -0
- data/lib/bundler/man/bundle-doctor.1 +4 -18
- data/lib/bundler/man/bundle-exec.1 +16 -77
- data/lib/bundler/man/bundle-exec.1.ronn +8 -9
- data/lib/bundler/man/bundle-gem.1 +45 -72
- data/lib/bundler/man/bundle-gem.1.ronn +32 -5
- 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 +5 -11
- data/lib/bundler/man/bundle-info.1.ronn +3 -3
- data/lib/bundler/man/bundle-init.1 +6 -11
- data/lib/bundler/man/bundle-init.1.ronn +2 -0
- data/lib/bundler/man/bundle-inject.1 +8 -18
- data/lib/bundler/man/bundle-inject.1.ronn +3 -1
- data/lib/bundler/man/bundle-install.1 +32 -155
- data/lib/bundler/man/bundle-install.1.ronn +11 -33
- data/lib/bundler/man/bundle-list.1 +4 -19
- data/lib/bundler/man/bundle-lock.1 +5 -29
- data/lib/bundler/man/bundle-open.1 +18 -18
- data/lib/bundler/man/bundle-open.1.ronn +9 -1
- data/lib/bundler/man/bundle-outdated.1 +17 -72
- data/lib/bundler/man/bundle-outdated.1.ronn +13 -18
- data/lib/bundler/man/bundle-platform.1 +16 -28
- data/lib/bundler/man/bundle-platform.1.ronn +14 -7
- data/lib/bundler/man/bundle-plugin.1 +58 -0
- data/lib/bundler/man/bundle-plugin.1.ronn +63 -0
- data/lib/bundler/man/bundle-pristine.1 +5 -16
- data/lib/bundler/man/bundle-remove.1 +4 -14
- data/lib/bundler/man/bundle-show.1 +3 -10
- data/lib/bundler/man/bundle-update.1 +19 -138
- data/lib/bundler/man/bundle-update.1.ronn +2 -1
- data/lib/bundler/man/bundle-version.1 +22 -0
- data/lib/bundler/man/bundle-version.1.ronn +24 -0
- data/lib/bundler/man/bundle-viz.1 +6 -15
- data/lib/bundler/man/bundle-viz.1.ronn +2 -0
- data/lib/bundler/man/bundle.1 +17 -51
- data/lib/bundler/man/bundle.1.ronn +12 -7
- data/lib/bundler/man/gemfile.5 +130 -346
- data/lib/bundler/man/gemfile.5.ronn +121 -86
- data/lib/bundler/man/index.txt +4 -0
- data/lib/bundler/match_metadata.rb +17 -0
- data/lib/bundler/match_platform.rb +1 -2
- data/lib/bundler/match_remote_metadata.rb +29 -0
- data/lib/bundler/mirror.rb +8 -10
- data/lib/bundler/plugin/api/source.rb +9 -13
- data/lib/bundler/plugin/index.rb +13 -5
- data/lib/bundler/plugin/installer/git.rb +0 -4
- data/lib/bundler/plugin/installer/path.rb +18 -0
- data/lib/bundler/plugin/installer/rubygems.rb +0 -8
- data/lib/bundler/plugin/installer.rb +42 -19
- data/lib/bundler/plugin/source_list.rb +4 -4
- data/lib/bundler/plugin.rb +16 -7
- data/lib/bundler/process_lock.rb +1 -1
- data/lib/bundler/remote_specification.rb +11 -5
- data/lib/bundler/resolver/base.rb +111 -0
- data/lib/bundler/resolver/candidate.rb +82 -0
- data/lib/bundler/resolver/incompatibility.rb +15 -0
- data/lib/bundler/resolver/package.rb +81 -0
- data/lib/bundler/resolver/root.rb +25 -0
- data/lib/bundler/resolver/spec_group.rb +53 -66
- data/lib/bundler/resolver.rb +419 -307
- data/lib/bundler/retry.rb +1 -1
- data/lib/bundler/ruby_dsl.rb +42 -7
- data/lib/bundler/ruby_version.rb +16 -22
- data/lib/bundler/rubygems_ext.rb +250 -64
- data/lib/bundler/rubygems_gem_installer.rb +90 -64
- data/lib/bundler/rubygems_integration.rb +81 -190
- data/lib/bundler/runtime.rb +8 -13
- data/lib/bundler/safe_marshal.rb +31 -0
- data/lib/bundler/self_manager.rb +206 -0
- data/lib/bundler/settings.rb +139 -57
- data/lib/bundler/setup.rb +13 -1
- data/lib/bundler/shared_helpers.rb +67 -36
- data/lib/bundler/source/git/git_proxy.rb +285 -82
- data/lib/bundler/source/git.rb +81 -41
- data/lib/bundler/source/metadata.rb +17 -16
- data/lib/bundler/source/path/installer.rb +1 -22
- data/lib/bundler/source/path.rb +13 -25
- data/lib/bundler/source/rubygems/remote.rb +1 -1
- data/lib/bundler/source/rubygems.rb +164 -234
- data/lib/bundler/source/rubygems_aggregate.rb +1 -1
- data/lib/bundler/source.rb +7 -6
- data/lib/bundler/source_list.rb +40 -32
- data/lib/bundler/source_map.rb +15 -2
- data/lib/bundler/spec_set.rb +156 -46
- data/lib/bundler/stub_specification.rb +18 -5
- data/lib/bundler/templates/Executable +3 -5
- data/lib/bundler/templates/Executable.bundler +7 -12
- data/lib/bundler/templates/Executable.standalone +4 -4
- data/lib/bundler/templates/Gemfile +0 -2
- data/lib/bundler/templates/newgem/CODE_OF_CONDUCT.md.tt +77 -29
- data/lib/bundler/templates/newgem/Cargo.toml.tt +7 -0
- data/lib/bundler/templates/newgem/Gemfile.tt +8 -2
- data/lib/bundler/templates/newgem/README.md.tt +7 -11
- data/lib/bundler/templates/newgem/Rakefile.tt +28 -4
- data/lib/bundler/templates/newgem/bin/console.tt +0 -4
- data/lib/bundler/templates/newgem/circleci/config.yml.tt +12 -0
- data/lib/bundler/templates/newgem/ext/newgem/Cargo.toml.tt +15 -0
- data/lib/bundler/templates/newgem/ext/newgem/extconf-c.rb.tt +10 -0
- data/lib/bundler/templates/newgem/ext/newgem/extconf-rust.rb.tt +6 -0
- data/lib/bundler/templates/newgem/ext/newgem/newgem.c.tt +1 -1
- data/lib/bundler/templates/newgem/ext/newgem/src/lib.rs.tt +12 -0
- data/lib/bundler/templates/newgem/github/workflows/main.yml.tt +13 -3
- data/lib/bundler/templates/newgem/gitignore.tt +3 -0
- data/lib/bundler/templates/newgem/gitlab-ci.yml.tt +13 -4
- data/lib/bundler/templates/newgem/newgem.gemspec.tt +25 -17
- data/lib/bundler/templates/newgem/rubocop.yml.tt +0 -5
- data/lib/bundler/templates/newgem/sig/newgem.rbs.tt +8 -0
- data/lib/bundler/templates/newgem/standard.yml.tt +3 -0
- data/lib/bundler/templates/newgem/test/minitest/{newgem_test.rb.tt → test_newgem.rb.tt} +1 -1
- data/lib/bundler/ui/rg_proxy.rb +1 -1
- data/lib/bundler/ui/shell.rb +38 -15
- data/lib/bundler/ui/silent.rb +21 -5
- data/lib/bundler/uri_credentials_filter.rb +2 -2
- data/lib/bundler/uri_normalizer.rb +23 -0
- data/lib/bundler/vendor/.document +1 -0
- data/lib/bundler/vendor/connection_pool/.document +1 -0
- data/lib/bundler/vendor/connection_pool/LICENSE +20 -0
- data/lib/bundler/vendor/connection_pool/lib/connection_pool/timed_stack.rb +19 -21
- data/lib/bundler/vendor/connection_pool/lib/connection_pool/version.rb +1 -1
- data/lib/bundler/vendor/connection_pool/lib/connection_pool/wrapper.rb +56 -0
- data/lib/bundler/vendor/connection_pool/lib/connection_pool.rb +92 -78
- data/lib/bundler/vendor/fileutils/.document +1 -0
- data/lib/bundler/vendor/fileutils/LICENSE.txt +22 -0
- data/lib/bundler/vendor/fileutils/lib/fileutils.rb +1340 -410
- data/lib/bundler/vendor/net-http-persistent/.document +1 -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 +4 -3
- data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/pool.rb +23 -11
- data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/timed_stack_multi.rb +1 -1
- data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb +57 -57
- data/lib/bundler/vendor/pub_grub/.document +1 -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 +189 -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/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 +411 -0
- data/lib/bundler/vendor/pub_grub/lib/pub_grub/version_solver.rb +248 -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/thor/.document +1 -0
- data/lib/bundler/vendor/thor/LICENSE.md +20 -0
- data/lib/bundler/vendor/thor/lib/thor/actions/create_file.rb +3 -2
- data/lib/bundler/vendor/thor/lib/thor/actions/directory.rb +1 -1
- data/lib/bundler/vendor/thor/lib/thor/actions/empty_directory.rb +1 -1
- data/lib/bundler/vendor/thor/lib/thor/actions/file_manipulation.rb +12 -14
- data/lib/bundler/vendor/thor/lib/thor/actions/inject_into_file.rb +16 -6
- data/lib/bundler/vendor/thor/lib/thor/actions.rb +21 -17
- data/lib/bundler/vendor/thor/lib/thor/base.rb +140 -14
- data/lib/bundler/vendor/thor/lib/thor/command.rb +13 -4
- data/lib/bundler/vendor/thor/lib/thor/core_ext/hash_with_indifferent_access.rb +10 -0
- data/lib/bundler/vendor/thor/lib/thor/error.rb +16 -20
- data/lib/bundler/vendor/thor/lib/thor/group.rb +1 -1
- data/lib/bundler/vendor/thor/lib/thor/invocation.rb +1 -1
- data/lib/bundler/vendor/thor/lib/thor/nested_context.rb +2 -2
- data/lib/bundler/vendor/thor/lib/thor/parser/argument.rb +20 -1
- data/lib/bundler/vendor/thor/lib/thor/parser/arguments.rb +33 -17
- data/lib/bundler/vendor/thor/lib/thor/parser/option.rb +27 -8
- data/lib/bundler/vendor/thor/lib/thor/parser/options.rb +63 -7
- data/lib/bundler/vendor/thor/lib/thor/rake_compat.rb +2 -2
- data/lib/bundler/vendor/thor/lib/thor/runner.rb +40 -30
- data/lib/bundler/vendor/thor/lib/thor/shell/basic.rb +48 -154
- data/lib/bundler/vendor/thor/lib/thor/shell/color.rb +1 -46
- data/lib/bundler/vendor/thor/lib/thor/shell/column_printer.rb +29 -0
- data/lib/bundler/vendor/thor/lib/thor/shell/html.rb +0 -45
- data/lib/bundler/vendor/thor/lib/thor/shell/table_printer.rb +134 -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 +2 -2
- data/lib/bundler/vendor/thor/lib/thor/util.rb +9 -8
- data/lib/bundler/vendor/thor/lib/thor/version.rb +1 -1
- data/lib/bundler/vendor/thor/lib/thor.rb +155 -8
- data/lib/bundler/vendor/tsort/.document +1 -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/.document +1 -0
- data/lib/bundler/vendor/uri/LICENSE.txt +22 -0
- data/lib/bundler/vendor/uri/lib/uri/common.rb +316 -207
- data/lib/bundler/vendor/uri/lib/uri/file.rb +7 -1
- data/lib/bundler/vendor/uri/lib/uri/ftp.rb +2 -2
- data/lib/bundler/vendor/uri/lib/uri/generic.rb +33 -13
- data/lib/bundler/vendor/uri/lib/uri/http.rb +40 -3
- data/lib/bundler/vendor/uri/lib/uri/https.rb +2 -2
- data/lib/bundler/vendor/uri/lib/uri/ldap.rb +2 -2
- data/lib/bundler/vendor/uri/lib/uri/ldaps.rb +2 -1
- data/lib/bundler/vendor/uri/lib/uri/mailto.rb +2 -3
- data/lib/bundler/vendor/uri/lib/uri/rfc2396_parser.rb +16 -23
- data/lib/bundler/vendor/uri/lib/uri/rfc3986_parser.rb +105 -47
- data/lib/bundler/vendor/uri/lib/uri/version.rb +1 -1
- 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 +3 -3
- data/lib/bundler/vendored_net_http.rb +23 -0
- data/lib/bundler/vendored_persistent.rb +0 -36
- data/lib/bundler/{vendored_molinillo.rb → vendored_pub_grub.rb} +1 -1
- data/lib/bundler/vendored_timeout.rb +12 -0
- data/lib/bundler/{vendored_tmpdir.rb → vendored_tsort.rb} +1 -1
- data/lib/bundler/vendored_uri.rb +18 -1
- data/lib/bundler/version.rb +5 -1
- data/lib/bundler/vlad.rb +1 -1
- data/lib/bundler/worker.rb +7 -9
- data/lib/bundler/yaml_serializer.rb +21 -12
- data/lib/bundler.rb +114 -121
- metadata +87 -41
- data/lib/bundler/dep_proxy.rb +0 -55
- data/lib/bundler/gemdeps.rb +0 -29
- data/lib/bundler/psyched_yaml.rb +0 -22
- data/lib/bundler/templates/gems.rb +0 -8
- data/lib/bundler/templates/newgem/ext/newgem/extconf.rb.tt +0 -5
- data/lib/bundler/templates/newgem/travis.yml.tt +0 -6
- data/lib/bundler/vendor/connection_pool/lib/connection_pool/monotonic_time.rb +0 -66
- data/lib/bundler/vendor/molinillo/lib/molinillo/delegates/resolution_state.rb +0 -57
- data/lib/bundler/vendor/molinillo/lib/molinillo/delegates/specification_provider.rb +0 -88
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/action.rb +0 -36
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_edge_no_circular.rb +0 -66
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_vertex.rb +0 -62
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/delete_edge.rb +0 -63
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/detach_vertex_named.rb +0 -61
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/log.rb +0 -126
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/set_payload.rb +0 -46
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/tag.rb +0 -36
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/vertex.rb +0 -164
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph.rb +0 -255
- data/lib/bundler/vendor/molinillo/lib/molinillo/errors.rb +0 -143
- data/lib/bundler/vendor/molinillo/lib/molinillo/gem_metadata.rb +0 -6
- data/lib/bundler/vendor/molinillo/lib/molinillo/modules/specification_provider.rb +0 -112
- data/lib/bundler/vendor/molinillo/lib/molinillo/modules/ui.rb +0 -67
- data/lib/bundler/vendor/molinillo/lib/molinillo/resolution.rb +0 -839
- data/lib/bundler/vendor/molinillo/lib/molinillo/resolver.rb +0 -46
- data/lib/bundler/vendor/molinillo/lib/molinillo/state.rb +0 -58
- data/lib/bundler/vendor/molinillo/lib/molinillo.rb +0 -11
- data/lib/bundler/vendor/tmpdir/lib/tmpdir.rb +0 -154
- data/lib/bundler/version_ranges.rb +0 -122
@@ -28,10 +28,10 @@ module Bundler
|
|
28
28
|
def initialize(command, path, extra_info = nil)
|
29
29
|
@command = command
|
30
30
|
|
31
|
-
msg = String.new
|
32
|
-
msg << "
|
31
|
+
msg = String.new("Git error: command `#{command}`")
|
32
|
+
msg << " in directory #{path}" if path
|
33
|
+
msg << " has failed."
|
33
34
|
msg << "\n#{extra_info}" if extra_info
|
34
|
-
msg << "\nIf this error persists you could try removing the cache directory '#{path}'" if path.exist?
|
35
35
|
super msg
|
36
36
|
end
|
37
37
|
end
|
@@ -43,70 +43,75 @@ module Bundler
|
|
43
43
|
end
|
44
44
|
end
|
45
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
|
+
|
46
53
|
# The GitProxy is responsible to interact with git repositories.
|
47
54
|
# All actions required by the Git source is encapsulated in this
|
48
55
|
# object.
|
49
56
|
class GitProxy
|
50
|
-
attr_accessor :path, :uri, :ref
|
57
|
+
attr_accessor :path, :uri, :branch, :tag, :ref, :explicit_ref
|
51
58
|
attr_writer :revision
|
52
59
|
|
53
|
-
def initialize(path, uri,
|
60
|
+
def initialize(path, uri, options = {}, revision = nil, git = nil)
|
54
61
|
@path = path
|
55
62
|
@uri = uri
|
56
|
-
@
|
63
|
+
@tag = options["tag"]
|
64
|
+
@branch = options["branch"]
|
65
|
+
@ref = options["ref"]
|
66
|
+
if @tag
|
67
|
+
raise AmbiguousGitReference.new(options) if @branch || @ref
|
68
|
+
@explicit_ref = @tag
|
69
|
+
else
|
70
|
+
@explicit_ref = @ref || @branch
|
71
|
+
end
|
57
72
|
@revision = revision
|
58
73
|
@git = git
|
59
|
-
|
74
|
+
@commit_ref = nil
|
60
75
|
end
|
61
76
|
|
62
77
|
def revision
|
63
|
-
@revision ||= find_local_revision
|
78
|
+
@revision ||= allowed_with_path { find_local_revision }
|
64
79
|
end
|
65
80
|
|
66
|
-
def
|
67
|
-
@
|
68
|
-
|
81
|
+
def current_branch
|
82
|
+
@current_branch ||= with_path do
|
83
|
+
git_local("rev-parse", "--abbrev-ref", "HEAD", dir: path).strip
|
69
84
|
end
|
70
85
|
end
|
71
86
|
|
72
87
|
def contains?(commit)
|
73
88
|
allowed_with_path do
|
74
|
-
result, status = git_null("branch", "--contains", commit, :
|
75
|
-
status.success? && result
|
89
|
+
result, status = git_null("branch", "--contains", commit, dir: path)
|
90
|
+
status.success? && result.match?(/^\* (.*)$/)
|
76
91
|
end
|
77
92
|
end
|
78
93
|
|
79
94
|
def version
|
80
|
-
|
95
|
+
@version ||= full_version.match(/((\.?\d+)+).*/)[1]
|
81
96
|
end
|
82
97
|
|
83
98
|
def full_version
|
84
|
-
|
99
|
+
@full_version ||= git_local("--version").sub(/git version\s*/, "").strip
|
85
100
|
end
|
86
101
|
|
87
102
|
def checkout
|
88
|
-
return if
|
89
|
-
extra_ref = "#{ref}:#{ref}" if ref && ref.start_with?("refs/")
|
103
|
+
return if has_revision_cached?
|
90
104
|
|
91
|
-
Bundler.ui.info "Fetching #{
|
105
|
+
Bundler.ui.info "Fetching #{credential_filtered_uri}"
|
92
106
|
|
93
|
-
|
107
|
+
extra_fetch_needed = clone_needs_extra_fetch?
|
108
|
+
unshallow_needed = clone_needs_unshallow?
|
109
|
+
return unless extra_fetch_needed || unshallow_needed
|
94
110
|
|
95
|
-
|
96
|
-
SharedHelpers.filesystem_access(path.dirname) do |p|
|
97
|
-
FileUtils.mkdir_p(p)
|
98
|
-
end
|
99
|
-
git_retry "clone", configured_uri, path.to_s, "--bare", "--no-hardlinks", "--quiet"
|
100
|
-
return unless extra_ref
|
101
|
-
end
|
102
|
-
|
103
|
-
with_path do
|
104
|
-
git_retry(*["fetch", "--force", "--quiet", "--tags", configured_uri, "refs/heads/*:refs/heads/*", extra_ref].compact, :dir => path)
|
105
|
-
end
|
111
|
+
git_remote_fetch(unshallow_needed ? ["--unshallow"] : depth_args)
|
106
112
|
end
|
107
113
|
|
108
114
|
def copy_to(destination, submodules = false)
|
109
|
-
# method 1
|
110
115
|
unless File.exist?(destination.join(".git"))
|
111
116
|
begin
|
112
117
|
SharedHelpers.filesystem_access(destination.dirname) do |p|
|
@@ -115,7 +120,7 @@ module Bundler
|
|
115
120
|
SharedHelpers.filesystem_access(destination) do |p|
|
116
121
|
FileUtils.rm_rf(p)
|
117
122
|
end
|
118
|
-
|
123
|
+
git "clone", "--no-checkout", "--quiet", path.to_s, destination.to_s
|
119
124
|
File.chmod(((File.stat(destination).mode | 0o777) & ~File.umask), destination)
|
120
125
|
rescue Errno::EEXIST => e
|
121
126
|
file_path = e.message[%r{.*?((?:[a-zA-Z]:)?/.*)}, 1]
|
@@ -124,91 +129,227 @@ module Bundler
|
|
124
129
|
"this file and try again."
|
125
130
|
end
|
126
131
|
end
|
127
|
-
# method 2
|
128
|
-
git_retry "fetch", "--force", "--quiet", "--tags", path.to_s, :dir => destination
|
129
132
|
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
133
|
+
ref = @commit_ref || (locked_to_full_sha? && @revision)
|
134
|
+
if ref
|
135
|
+
git "config", "uploadpack.allowAnySHA1InWant", "true", dir: path.to_s if @commit_ref.nil? && needs_allow_any_sha1_in_want?
|
136
|
+
|
137
|
+
git "fetch", "--force", "--quiet", *extra_fetch_args(ref), dir: destination
|
134
138
|
end
|
135
139
|
|
140
|
+
git "reset", "--hard", @revision, dir: destination
|
141
|
+
|
136
142
|
if submodules
|
137
|
-
git_retry "submodule", "update", "--init", "--recursive", :
|
143
|
+
git_retry "submodule", "update", "--init", "--recursive", dir: destination
|
138
144
|
elsif Gem::Version.create(version) >= Gem::Version.create("2.9.0")
|
139
145
|
inner_command = "git -C $toplevel submodule deinit --force $sm_path"
|
140
|
-
git_retry "submodule", "foreach", "--quiet", inner_command, :
|
146
|
+
git_retry "submodule", "foreach", "--quiet", inner_command, dir: destination
|
141
147
|
end
|
142
148
|
end
|
143
149
|
|
144
150
|
private
|
145
151
|
|
146
|
-
def
|
147
|
-
|
152
|
+
def git_remote_fetch(args)
|
153
|
+
command = ["fetch", "--force", "--quiet", "--no-tags", *args, "--", configured_uri, refspec].compact
|
154
|
+
command_with_no_credentials = check_allowed(command)
|
155
|
+
|
156
|
+
Bundler::Retry.new("`#{command_with_no_credentials}` at #{path}", [MissingGitRevisionError]).attempts do
|
157
|
+
out, err, status = capture(command, path)
|
158
|
+
return out if status.success?
|
159
|
+
|
160
|
+
if err.include?("couldn't find remote ref") || err.include?("not our ref")
|
161
|
+
raise MissingGitRevisionError.new(command_with_no_credentials, path, commit || explicit_ref, credential_filtered_uri)
|
162
|
+
else
|
163
|
+
raise GitCommandError.new(command_with_no_credentials, path, err)
|
164
|
+
end
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
168
|
+
def clone_needs_extra_fetch?
|
169
|
+
return true if path.exist?
|
148
170
|
|
149
|
-
|
150
|
-
|
171
|
+
SharedHelpers.filesystem_access(path.dirname) do |p|
|
172
|
+
FileUtils.mkdir_p(p)
|
151
173
|
end
|
152
174
|
|
153
|
-
[
|
175
|
+
command = ["clone", "--bare", "--no-hardlinks", "--quiet", *extra_clone_args, "--", configured_uri, path.to_s]
|
176
|
+
command_with_no_credentials = check_allowed(command)
|
177
|
+
|
178
|
+
Bundler::Retry.new("`#{command_with_no_credentials}`", [MissingGitRevisionError]).attempts do
|
179
|
+
_, err, status = capture(command, nil)
|
180
|
+
return extra_ref if status.success?
|
181
|
+
|
182
|
+
if err.include?("Could not find remote branch")
|
183
|
+
raise MissingGitRevisionError.new(command_with_no_credentials, nil, explicit_ref, credential_filtered_uri)
|
184
|
+
else
|
185
|
+
idx = command.index("--depth")
|
186
|
+
if idx
|
187
|
+
command.delete_at(idx)
|
188
|
+
command.delete_at(idx)
|
189
|
+
command_with_no_credentials = check_allowed(command)
|
190
|
+
|
191
|
+
err += "Retrying without --depth argument."
|
192
|
+
end
|
193
|
+
raise GitCommandError.new(command_with_no_credentials, path, err)
|
194
|
+
end
|
195
|
+
end
|
196
|
+
end
|
197
|
+
|
198
|
+
def clone_needs_unshallow?
|
199
|
+
return false unless path.join("shallow").exist?
|
200
|
+
return true if full_clone?
|
201
|
+
|
202
|
+
@revision && @revision != head_revision
|
203
|
+
end
|
204
|
+
|
205
|
+
def extra_ref
|
206
|
+
return false if not_pinned?
|
207
|
+
return true unless full_clone?
|
208
|
+
|
209
|
+
ref.start_with?("refs/")
|
210
|
+
end
|
211
|
+
|
212
|
+
def depth
|
213
|
+
return @depth if defined?(@depth)
|
214
|
+
|
215
|
+
@depth = if !supports_fetching_unreachable_refs?
|
216
|
+
nil
|
217
|
+
elsif not_pinned? || pinned_to_full_sha?
|
218
|
+
1
|
219
|
+
elsif ref.include?("~")
|
220
|
+
parsed_depth = ref.split("~").last
|
221
|
+
parsed_depth.to_i + 1
|
222
|
+
end
|
223
|
+
end
|
224
|
+
|
225
|
+
def refspec
|
226
|
+
if commit
|
227
|
+
@commit_ref = "refs/#{commit}-sha"
|
228
|
+
return "#{commit}:#{@commit_ref}"
|
229
|
+
end
|
230
|
+
|
231
|
+
reference = fully_qualified_ref
|
232
|
+
|
233
|
+
reference ||= if ref.include?("~")
|
234
|
+
ref.split("~").first
|
235
|
+
elsif ref.start_with?("refs/")
|
236
|
+
ref
|
237
|
+
else
|
238
|
+
"refs/*"
|
239
|
+
end
|
240
|
+
|
241
|
+
"#{reference}:#{reference}"
|
242
|
+
end
|
243
|
+
|
244
|
+
def commit
|
245
|
+
@commit ||= pinned_to_full_sha? ? ref : @revision
|
246
|
+
end
|
247
|
+
|
248
|
+
def fully_qualified_ref
|
249
|
+
if branch
|
250
|
+
"refs/heads/#{branch}"
|
251
|
+
elsif tag
|
252
|
+
"refs/tags/#{tag}"
|
253
|
+
elsif ref.nil?
|
254
|
+
"refs/heads/#{current_branch}"
|
255
|
+
end
|
256
|
+
end
|
257
|
+
|
258
|
+
def not_pinned?
|
259
|
+
branch || tag || ref.nil?
|
260
|
+
end
|
261
|
+
|
262
|
+
def pinned_to_full_sha?
|
263
|
+
full_sha_revision?(ref)
|
264
|
+
end
|
265
|
+
|
266
|
+
def locked_to_full_sha?
|
267
|
+
full_sha_revision?(@revision)
|
268
|
+
end
|
269
|
+
|
270
|
+
def full_sha_revision?(ref)
|
271
|
+
ref&.match?(/\A\h{40}\z/)
|
272
|
+
end
|
273
|
+
|
274
|
+
def git_null(*command, dir: nil)
|
275
|
+
check_allowed(command)
|
276
|
+
|
277
|
+
capture(command, dir, ignore_err: true)
|
154
278
|
end
|
155
279
|
|
156
280
|
def git_retry(*command, dir: nil)
|
157
281
|
command_with_no_credentials = check_allowed(command)
|
158
282
|
|
159
283
|
Bundler::Retry.new("`#{command_with_no_credentials}` at #{dir || SharedHelpers.pwd}").attempts do
|
160
|
-
git(*command, :
|
284
|
+
git(*command, dir: dir)
|
161
285
|
end
|
162
286
|
end
|
163
287
|
|
164
288
|
def git(*command, dir: nil)
|
165
|
-
|
166
|
-
|
167
|
-
out, status = SharedHelpers.with_clean_git_env do
|
168
|
-
capture_and_filter_stderr(*capture3_args_for(command, dir))
|
289
|
+
run_command(*command, dir: dir) do |unredacted_command|
|
290
|
+
check_allowed(unredacted_command)
|
169
291
|
end
|
292
|
+
end
|
170
293
|
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
filtered_out
|
294
|
+
def git_local(*command, dir: nil)
|
295
|
+
run_command(*command, dir: dir) do |unredacted_command|
|
296
|
+
redact_and_check_presence(unredacted_command)
|
297
|
+
end
|
176
298
|
end
|
177
299
|
|
178
300
|
def has_revision_cached?
|
179
|
-
return unless @revision
|
180
|
-
|
301
|
+
return unless @revision && path.exist?
|
302
|
+
git("cat-file", "-e", @revision, dir: path)
|
181
303
|
true
|
182
304
|
rescue GitError
|
183
305
|
false
|
184
306
|
end
|
185
307
|
|
186
|
-
def
|
187
|
-
|
308
|
+
def find_local_revision
|
309
|
+
return head_revision if explicit_ref.nil?
|
310
|
+
|
311
|
+
find_revision_for(explicit_ref)
|
188
312
|
end
|
189
313
|
|
190
|
-
def
|
191
|
-
|
192
|
-
|
193
|
-
|
314
|
+
def head_revision
|
315
|
+
verify("HEAD")
|
316
|
+
end
|
317
|
+
|
318
|
+
def find_revision_for(reference)
|
319
|
+
verify(reference)
|
194
320
|
rescue GitCommandError => e
|
195
|
-
raise MissingGitRevisionError.new(e.command, path,
|
321
|
+
raise MissingGitRevisionError.new(e.command, path, reference, credential_filtered_uri)
|
322
|
+
end
|
323
|
+
|
324
|
+
def verify(reference)
|
325
|
+
git("rev-parse", "--verify", reference, dir: path).strip
|
196
326
|
end
|
197
327
|
|
198
|
-
# Adds credentials to the URI
|
199
|
-
def
|
200
|
-
if /https
|
201
|
-
remote =
|
328
|
+
# Adds credentials to the URI
|
329
|
+
def configured_uri
|
330
|
+
if /https?:/.match?(uri)
|
331
|
+
remote = Gem::URI(uri)
|
202
332
|
config_auth = Bundler.settings[remote.to_s] || Bundler.settings[remote.host]
|
203
333
|
remote.userinfo ||= config_auth
|
204
334
|
remote.to_s
|
335
|
+
elsif File.exist?(uri)
|
336
|
+
"file://#{uri}"
|
205
337
|
else
|
206
|
-
uri
|
338
|
+
uri.to_s
|
207
339
|
end
|
208
340
|
end
|
209
341
|
|
342
|
+
# Removes credentials from the URI
|
343
|
+
def credential_filtered_uri
|
344
|
+
URICredentialsFilter.credential_filtered_uri(uri)
|
345
|
+
end
|
346
|
+
|
210
347
|
def allow?
|
211
|
-
@git ? @git.allow_git_ops? : true
|
348
|
+
allowed = @git ? @git.allow_git_ops? : true
|
349
|
+
|
350
|
+
raise GitNotInstalledError.new if allowed && !Bundler.git_present?
|
351
|
+
|
352
|
+
allowed
|
212
353
|
end
|
213
354
|
|
214
355
|
def with_path(&blk)
|
@@ -222,23 +363,41 @@ module Bundler
|
|
222
363
|
end
|
223
364
|
|
224
365
|
def check_allowed(command)
|
225
|
-
|
226
|
-
command_with_no_credentials = URICredentialsFilter.credential_filtered_string("git #{command.shelljoin}", uri)
|
366
|
+
command_with_no_credentials = redact_and_check_presence(command)
|
227
367
|
raise GitNotAllowedError.new(command_with_no_credentials) unless allow?
|
228
368
|
command_with_no_credentials
|
229
369
|
end
|
230
370
|
|
231
|
-
def
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
371
|
+
def redact_and_check_presence(command)
|
372
|
+
raise GitNotInstalledError.new unless Bundler.git_present?
|
373
|
+
|
374
|
+
require "shellwords"
|
375
|
+
URICredentialsFilter.credential_filtered_string("git #{command.shelljoin}", uri)
|
376
|
+
end
|
377
|
+
|
378
|
+
def run_command(*command, dir: nil)
|
379
|
+
command_with_no_credentials = yield(command)
|
380
|
+
|
381
|
+
out, err, status = capture(command, dir)
|
382
|
+
|
383
|
+
raise GitCommandError.new(command_with_no_credentials, dir || SharedHelpers.pwd, err) unless status.success?
|
384
|
+
|
385
|
+
Bundler.ui.warn err unless err.empty?
|
386
|
+
|
387
|
+
out
|
236
388
|
end
|
237
389
|
|
238
|
-
def
|
239
|
-
|
240
|
-
|
241
|
-
|
390
|
+
def capture(cmd, dir, ignore_err: false)
|
391
|
+
SharedHelpers.with_clean_git_env do
|
392
|
+
require "open3"
|
393
|
+
out, err, status = Open3.capture3(*capture3_args_for(cmd, dir))
|
394
|
+
|
395
|
+
filtered_out = URICredentialsFilter.credential_filtered_string(out, uri)
|
396
|
+
return [filtered_out, status] if ignore_err
|
397
|
+
|
398
|
+
filtered_err = URICredentialsFilter.credential_filtered_string(err, uri)
|
399
|
+
[filtered_out, filtered_err, status]
|
400
|
+
end
|
242
401
|
end
|
243
402
|
|
244
403
|
def capture3_args_for(cmd, dir)
|
@@ -247,13 +406,57 @@ module Bundler
|
|
247
406
|
if Bundler.feature_flag.bundler_3_mode? || supports_minus_c?
|
248
407
|
["git", "-C", dir.to_s, *cmd]
|
249
408
|
else
|
250
|
-
["git", *cmd, { :
|
409
|
+
["git", *cmd, { chdir: dir.to_s }]
|
251
410
|
end
|
252
411
|
end
|
253
412
|
|
413
|
+
def extra_clone_args
|
414
|
+
args = depth_args
|
415
|
+
return [] if args.empty?
|
416
|
+
|
417
|
+
args += ["--single-branch"]
|
418
|
+
args.unshift("--no-tags") if supports_cloning_with_no_tags?
|
419
|
+
|
420
|
+
# If there's a locked revision, no need to clone any specific branch
|
421
|
+
# or tag, since we will end up checking out that locked revision
|
422
|
+
# anyways.
|
423
|
+
return args if @revision
|
424
|
+
|
425
|
+
args += ["--branch", branch || tag] if branch || tag
|
426
|
+
args
|
427
|
+
end
|
428
|
+
|
429
|
+
def depth_args
|
430
|
+
return [] if full_clone?
|
431
|
+
|
432
|
+
["--depth", depth.to_s]
|
433
|
+
end
|
434
|
+
|
435
|
+
def extra_fetch_args(ref)
|
436
|
+
extra_args = [path.to_s, *depth_args]
|
437
|
+
extra_args.push(ref)
|
438
|
+
extra_args
|
439
|
+
end
|
440
|
+
|
441
|
+
def full_clone?
|
442
|
+
depth.nil?
|
443
|
+
end
|
444
|
+
|
254
445
|
def supports_minus_c?
|
255
446
|
@supports_minus_c ||= Gem::Version.new(version) >= Gem::Version.new("1.8.5")
|
256
447
|
end
|
448
|
+
|
449
|
+
def needs_allow_any_sha1_in_want?
|
450
|
+
@needs_allow_any_sha1_in_want ||= Gem::Version.new(version) <= Gem::Version.new("2.13.7")
|
451
|
+
end
|
452
|
+
|
453
|
+
def supports_fetching_unreachable_refs?
|
454
|
+
@supports_fetching_unreachable_refs ||= Gem::Version.new(version) >= Gem::Version.new("2.5.0")
|
455
|
+
end
|
456
|
+
|
457
|
+
def supports_cloning_with_no_tags?
|
458
|
+
@supports_cloning_with_no_tags ||= Gem::Version.new(version) >= Gem::Version.new("2.14.0-rc0")
|
459
|
+
end
|
257
460
|
end
|
258
461
|
end
|
259
462
|
end
|