bundler 2.1.4 → 2.2.17
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of bundler might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/CHANGELOG.md +1774 -1430
- data/README.md +6 -8
- data/bundler.gemspec +4 -4
- data/exe/bundle +3 -0
- data/lib/bundler.rb +33 -9
- data/lib/bundler/build_metadata.rb +3 -11
- data/lib/bundler/cli.rb +59 -23
- data/lib/bundler/cli/add.rb +1 -1
- data/lib/bundler/cli/binstubs.rb +6 -2
- data/lib/bundler/cli/cache.rb +2 -7
- data/lib/bundler/cli/clean.rb +1 -1
- data/lib/bundler/cli/common.rb +29 -2
- data/lib/bundler/cli/console.rb +1 -1
- data/lib/bundler/cli/doctor.rb +1 -1
- data/lib/bundler/cli/exec.rb +4 -4
- data/lib/bundler/cli/fund.rb +36 -0
- data/lib/bundler/cli/gem.rb +129 -28
- data/lib/bundler/cli/info.rb +15 -4
- data/lib/bundler/cli/init.rb +2 -2
- data/lib/bundler/cli/inject.rb +1 -1
- data/lib/bundler/cli/install.rb +13 -11
- data/lib/bundler/cli/issue.rb +2 -2
- data/lib/bundler/cli/list.rb +12 -10
- data/lib/bundler/cli/outdated.rb +88 -67
- data/lib/bundler/cli/plugin.rb +10 -0
- data/lib/bundler/cli/pristine.rb +5 -0
- data/lib/bundler/cli/show.rb +1 -1
- data/lib/bundler/cli/update.rb +3 -1
- data/lib/bundler/compact_index_client.rb +1 -1
- data/lib/bundler/compact_index_client/cache.rb +6 -14
- data/lib/bundler/compact_index_client/gem_parser.rb +28 -0
- data/lib/bundler/compact_index_client/updater.rb +13 -17
- data/lib/bundler/current_ruby.rb +1 -0
- data/lib/bundler/definition.rb +121 -131
- data/lib/bundler/dep_proxy.rb +16 -9
- data/lib/bundler/dependency.rb +3 -10
- data/lib/bundler/dsl.rb +40 -33
- data/lib/bundler/endpoint_specification.rb +1 -1
- data/lib/bundler/env.rb +1 -1
- data/lib/bundler/environment_preserver.rb +26 -2
- data/lib/bundler/errors.rb +1 -0
- data/lib/bundler/feature_flag.rb +0 -5
- data/lib/bundler/fetcher.rb +5 -4
- data/lib/bundler/fetcher/base.rb +1 -1
- data/lib/bundler/fetcher/compact_index.rb +1 -1
- data/lib/bundler/fetcher/downloader.rb +9 -5
- data/lib/bundler/fetcher/index.rb +3 -4
- data/lib/bundler/friendly_errors.rb +22 -13
- data/lib/bundler/gem_helper.rb +51 -18
- data/lib/bundler/gem_helpers.rb +36 -25
- data/lib/bundler/gem_version_promoter.rb +4 -4
- data/lib/bundler/graph.rb +1 -1
- data/lib/bundler/index.rb +12 -7
- data/lib/bundler/injector.rb +23 -5
- data/lib/bundler/inline.rb +3 -2
- data/lib/bundler/installer.rb +37 -49
- data/lib/bundler/installer/gem_installer.rb +3 -3
- data/lib/bundler/installer/parallel_installer.rb +46 -25
- data/lib/bundler/installer/standalone.rb +17 -2
- data/lib/bundler/lazy_specification.rb +45 -25
- data/lib/bundler/lockfile_generator.rb +1 -1
- data/lib/bundler/lockfile_parser.rb +4 -14
- data/lib/bundler/man/.document +1 -0
- data/{man → lib/bundler/man}/bundle-add.1 +1 -1
- data/{man/bundle-add.ronn → lib/bundler/man/bundle-add.1.ronn} +0 -0
- data/{man → lib/bundler/man}/bundle-binstubs.1 +5 -3
- data/{man/bundle-binstubs.ronn → lib/bundler/man/bundle-binstubs.1.ronn} +2 -4
- data/{man → lib/bundler/man}/bundle-cache.1 +1 -1
- data/{man/bundle-cache.ronn → lib/bundler/man/bundle-cache.1.ronn} +0 -0
- data/{man → lib/bundler/man}/bundle-check.1 +1 -1
- data/{man/bundle-check.ronn → lib/bundler/man/bundle-check.1.ronn} +0 -0
- data/{man → lib/bundler/man}/bundle-clean.1 +1 -1
- data/{man/bundle-clean.ronn → lib/bundler/man/bundle-clean.1.ronn} +0 -0
- data/{man → lib/bundler/man}/bundle-config.1 +42 -34
- data/{man/bundle-config.ronn → lib/bundler/man/bundle-config.1.ronn} +51 -43
- data/{man → lib/bundler/man}/bundle-doctor.1 +1 -1
- data/{man/bundle-doctor.ronn → lib/bundler/man/bundle-doctor.1.ronn} +0 -0
- data/{man → lib/bundler/man}/bundle-exec.1 +1 -1
- data/{man/bundle-exec.ronn → lib/bundler/man/bundle-exec.1.ronn} +0 -0
- data/{man → lib/bundler/man}/bundle-gem.1 +25 -3
- data/{man/bundle-gem.ronn → lib/bundler/man/bundle-gem.1.ronn} +30 -7
- data/{man → lib/bundler/man}/bundle-info.1 +1 -1
- data/{man/bundle-info.ronn → lib/bundler/man/bundle-info.1.ronn} +0 -0
- data/{man → lib/bundler/man}/bundle-init.1 +1 -1
- data/{man/bundle-init.ronn → lib/bundler/man/bundle-init.1.ronn} +0 -0
- data/{man → lib/bundler/man}/bundle-inject.1 +1 -1
- data/{man/bundle-inject.ronn → lib/bundler/man/bundle-inject.1.ronn} +0 -0
- data/{man → lib/bundler/man}/bundle-install.1 +30 -3
- data/{man/bundle-install.ronn → lib/bundler/man/bundle-install.1.ronn} +25 -3
- data/{man → lib/bundler/man}/bundle-list.1 +7 -7
- data/{man/bundle-list.ronn → lib/bundler/man/bundle-list.1.ronn} +6 -6
- data/{man → lib/bundler/man}/bundle-lock.1 +1 -1
- data/{man/bundle-lock.ronn → lib/bundler/man/bundle-lock.1.ronn} +0 -0
- data/{man → lib/bundler/man}/bundle-open.1 +1 -1
- data/{man/bundle-open.ronn → lib/bundler/man/bundle-open.1.ronn} +0 -0
- data/{man → lib/bundler/man}/bundle-outdated.1 +1 -1
- data/{man/bundle-outdated.ronn → lib/bundler/man/bundle-outdated.1.ronn} +0 -0
- data/{man → lib/bundler/man}/bundle-platform.1 +1 -1
- data/{man/bundle-platform.ronn → lib/bundler/man/bundle-platform.1.ronn} +0 -0
- data/{man → lib/bundler/man}/bundle-pristine.1 +1 -1
- data/{man/bundle-pristine.ronn → lib/bundler/man/bundle-pristine.1.ronn} +0 -0
- data/{man → lib/bundler/man}/bundle-remove.1 +1 -1
- data/{man/bundle-remove.ronn → lib/bundler/man/bundle-remove.1.ronn} +0 -0
- data/{man → lib/bundler/man}/bundle-show.1 +1 -1
- data/{man/bundle-show.ronn → lib/bundler/man/bundle-show.1.ronn} +0 -0
- data/{man → lib/bundler/man}/bundle-update.1 +1 -1
- data/{man/bundle-update.ronn → lib/bundler/man/bundle-update.1.ronn} +0 -0
- data/{man → lib/bundler/man}/bundle-viz.1 +1 -1
- data/{man/bundle-viz.ronn → lib/bundler/man/bundle-viz.1.ronn} +0 -0
- data/{man → lib/bundler/man}/bundle.1 +1 -1
- data/{man/bundle.ronn → lib/bundler/man/bundle.1.ronn} +0 -0
- data/{man → lib/bundler/man}/gemfile.5 +4 -4
- data/{man → lib/bundler/man}/gemfile.5.ronn +4 -4
- data/{man → lib/bundler/man}/index.txt +0 -0
- data/lib/bundler/mirror.rb +2 -2
- data/lib/bundler/plugin.rb +33 -7
- data/lib/bundler/plugin/api/source.rb +8 -1
- data/lib/bundler/plugin/dsl.rb +1 -1
- data/lib/bundler/plugin/index.rb +10 -1
- data/lib/bundler/plugin/installer.rb +9 -11
- data/lib/bundler/plugin/installer/rubygems.rb +1 -1
- data/lib/bundler/plugin/source_list.rb +5 -1
- data/lib/bundler/psyched_yaml.rb +0 -15
- data/lib/bundler/remote_specification.rb +5 -2
- data/lib/bundler/resolver.rb +133 -77
- data/lib/bundler/resolver/spec_group.rb +75 -48
- data/lib/bundler/retry.rb +2 -2
- data/lib/bundler/ruby_version.rb +1 -1
- data/lib/bundler/rubygems_ext.rb +69 -9
- data/lib/bundler/rubygems_gem_installer.rb +50 -9
- data/lib/bundler/rubygems_integration.rb +25 -60
- data/lib/bundler/runtime.rb +4 -14
- data/lib/bundler/settings.rb +107 -54
- data/lib/bundler/shared_helpers.rb +3 -3
- data/lib/bundler/similarity_detector.rb +1 -1
- data/lib/bundler/source.rb +7 -1
- data/lib/bundler/source/git.rb +24 -22
- data/lib/bundler/source/git/git_proxy.rb +82 -80
- data/lib/bundler/source/metadata.rb +0 -4
- data/lib/bundler/source/path.rb +10 -4
- data/lib/bundler/source/path/installer.rb +10 -10
- data/lib/bundler/source/rubygems.rb +45 -24
- data/lib/bundler/source/rubygems/remote.rb +1 -1
- data/lib/bundler/source_list.rb +31 -26
- data/lib/bundler/spec_set.rb +29 -17
- data/lib/bundler/stub_specification.rb +25 -7
- data/lib/bundler/templates/Gemfile +1 -1
- data/lib/bundler/templates/gems.rb +1 -1
- data/lib/bundler/templates/newgem/CHANGELOG.md.tt +5 -0
- data/lib/bundler/templates/newgem/CODE_OF_CONDUCT.md.tt +57 -47
- data/lib/bundler/templates/newgem/Gemfile.tt +9 -1
- data/lib/bundler/templates/newgem/README.md.tt +6 -5
- data/lib/bundler/templates/newgem/Rakefile.tt +19 -5
- data/lib/bundler/templates/newgem/bin/console.tt +1 -0
- data/lib/bundler/templates/newgem/circleci/config.yml.tt +13 -0
- data/lib/bundler/templates/newgem/ext/newgem/extconf.rb.tt +2 -0
- data/lib/bundler/templates/newgem/github/workflows/main.yml.tt +16 -0
- data/lib/bundler/templates/newgem/gitlab-ci.yml.tt +9 -0
- data/lib/bundler/templates/newgem/lib/newgem.rb.tt +4 -2
- data/lib/bundler/templates/newgem/lib/newgem/version.rb.tt +2 -0
- data/lib/bundler/templates/newgem/newgem.gemspec.tt +15 -7
- data/lib/bundler/templates/newgem/rubocop.yml.tt +13 -0
- data/lib/bundler/templates/newgem/spec/newgem_spec.rb.tt +2 -0
- data/lib/bundler/templates/newgem/spec/spec_helper.rb.tt +2 -1
- data/lib/bundler/templates/newgem/test/{newgem_test.rb.tt → minitest/newgem_test.rb.tt} +2 -0
- data/lib/bundler/templates/newgem/test/{test_helper.rb.tt → minitest/test_helper.rb.tt} +2 -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/shell.rb +5 -5
- data/lib/bundler/uri_credentials_filter.rb +3 -1
- data/lib/bundler/vendor/molinillo/lib/molinillo.rb +0 -1
- data/lib/bundler/vendor/molinillo/lib/molinillo/delegates/specification_provider.rb +7 -0
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph.rb +34 -2
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/tag.rb +2 -2
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/vertex.rb +11 -5
- data/lib/bundler/vendor/molinillo/lib/molinillo/errors.rb +3 -3
- data/lib/bundler/vendor/molinillo/lib/molinillo/gem_metadata.rb +1 -1
- data/lib/bundler/vendor/molinillo/lib/molinillo/modules/specification_provider.rb +12 -1
- data/lib/bundler/vendor/molinillo/lib/molinillo/resolution.rb +49 -47
- data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb +82 -189
- data/lib/bundler/vendor/thor/lib/thor.rb +5 -13
- data/lib/bundler/vendor/thor/lib/thor/actions.rb +1 -1
- data/lib/bundler/vendor/thor/lib/thor/actions/create_link.rb +2 -1
- data/lib/bundler/vendor/thor/lib/thor/actions/file_manipulation.rb +4 -2
- data/lib/bundler/vendor/thor/lib/thor/base.rb +9 -0
- data/lib/bundler/vendor/thor/lib/thor/error.rb +1 -1
- data/lib/bundler/vendor/thor/lib/thor/parser/arguments.rb +5 -1
- data/lib/bundler/vendor/thor/lib/thor/parser/options.rb +9 -8
- data/lib/bundler/vendor/thor/lib/thor/shell/basic.rb +5 -2
- data/lib/bundler/vendor/thor/lib/thor/shell/color.rb +5 -1
- data/lib/bundler/vendor/thor/lib/thor/version.rb +1 -1
- data/lib/bundler/vendor/tmpdir/lib/tmpdir.rb +154 -0
- data/lib/bundler/vendored_persistent.rb +0 -7
- data/lib/bundler/vendored_tmpdir.rb +4 -0
- data/lib/bundler/version.rb +1 -1
- data/lib/bundler/worker.rb +1 -1
- data/lib/bundler/yaml_serializer.rb +1 -1
- metadata +71 -85
- data/lib/bundler/vendor/molinillo/lib/molinillo/compatibility.rb +0 -26
- data/man/bundle-add.1.txt +0 -58
- data/man/bundle-binstubs.1.txt +0 -48
- data/man/bundle-cache.1.txt +0 -78
- data/man/bundle-check.1.txt +0 -33
- data/man/bundle-clean.1.txt +0 -26
- data/man/bundle-config.1.txt +0 -528
- data/man/bundle-doctor.1.txt +0 -44
- data/man/bundle-exec.1.txt +0 -178
- data/man/bundle-gem.1.txt +0 -91
- data/man/bundle-info.1.txt +0 -21
- data/man/bundle-init.1.txt +0 -34
- data/man/bundle-inject.1.txt +0 -32
- data/man/bundle-install.1.txt +0 -401
- data/man/bundle-list.1.txt +0 -43
- data/man/bundle-lock.1.txt +0 -93
- data/man/bundle-open.1.txt +0 -29
- data/man/bundle-outdated.1.txt +0 -131
- data/man/bundle-platform.1.txt +0 -57
- data/man/bundle-pristine.1.txt +0 -44
- data/man/bundle-remove.1.txt +0 -34
- data/man/bundle-show.1.txt +0 -27
- data/man/bundle-update.1.txt +0 -390
- data/man/bundle-viz.1.txt +0 -39
- data/man/bundle.1.txt +0 -116
- data/man/gemfile.5.txt +0 -649
@@ -17,8 +17,8 @@ module Bundler
|
|
17
17
|
class GitNotAllowedError < GitError
|
18
18
|
def initialize(command)
|
19
19
|
msg = String.new
|
20
|
-
msg << "Bundler is trying to run
|
21
|
-
msg << "this error message could probably be more useful. Please submit a ticket at https://github.com/
|
20
|
+
msg << "Bundler is trying to run `#{command}` at runtime. You probably need to run `bundle install`. However, "
|
21
|
+
msg << "this error message could probably be more useful. Please submit a ticket at https://github.com/rubygems/rubygems/issues/new?labels=Bundler&template=bundler-related-issue.md "
|
22
22
|
msg << "with steps to reproduce as well as the following\n\nCALLER: #{caller.join("\n")}"
|
23
23
|
super msg
|
24
24
|
end
|
@@ -27,21 +27,21 @@ module Bundler
|
|
27
27
|
class GitCommandError < GitError
|
28
28
|
attr_reader :command
|
29
29
|
|
30
|
-
def initialize(command, path
|
30
|
+
def initialize(command, path, extra_info = nil)
|
31
31
|
@command = command
|
32
32
|
|
33
33
|
msg = String.new
|
34
|
-
msg << "Git error: command
|
34
|
+
msg << "Git error: command `#{command}` in directory #{path} has failed."
|
35
35
|
msg << "\n#{extra_info}" if extra_info
|
36
|
-
msg << "\nIf this error persists you could try removing the cache directory '#{path}'" if path
|
36
|
+
msg << "\nIf this error persists you could try removing the cache directory '#{path}'" if path.exist?
|
37
37
|
super msg
|
38
38
|
end
|
39
39
|
end
|
40
40
|
|
41
41
|
class MissingGitRevisionError < GitCommandError
|
42
|
-
def initialize(command,
|
42
|
+
def initialize(command, destination_path, ref, repo)
|
43
43
|
msg = "Revision #{ref} does not exist in the repository #{repo}. Maybe you misspelled it?"
|
44
|
-
super command,
|
44
|
+
super command, destination_path, msg
|
45
45
|
end
|
46
46
|
end
|
47
47
|
|
@@ -62,26 +62,18 @@ module Bundler
|
|
62
62
|
end
|
63
63
|
|
64
64
|
def revision
|
65
|
-
|
66
|
-
|
67
|
-
begin
|
68
|
-
@revision ||= find_local_revision
|
69
|
-
rescue GitCommandError => e
|
70
|
-
raise MissingGitRevisionError.new(e.command, path, ref, URICredentialsFilter.credential_filtered_uri(uri))
|
71
|
-
end
|
72
|
-
|
73
|
-
@revision
|
65
|
+
@revision ||= find_local_revision
|
74
66
|
end
|
75
67
|
|
76
68
|
def branch
|
77
|
-
@branch ||=
|
78
|
-
git("rev-parse --abbrev-ref HEAD").strip
|
69
|
+
@branch ||= allowed_with_path do
|
70
|
+
git("rev-parse", "--abbrev-ref", "HEAD", :dir => path).strip
|
79
71
|
end
|
80
72
|
end
|
81
73
|
|
82
74
|
def contains?(commit)
|
83
|
-
|
84
|
-
result, status = git_null("branch --contains
|
75
|
+
allowed_with_path do
|
76
|
+
result, status = git_null("branch", "--contains", commit, :dir => path)
|
85
77
|
status.success? && result =~ /^\* (.*)$/
|
86
78
|
end
|
87
79
|
end
|
@@ -96,20 +88,22 @@ module Bundler
|
|
96
88
|
|
97
89
|
def checkout
|
98
90
|
return if path.exist? && has_revision_cached?
|
99
|
-
extra_ref = "#{
|
91
|
+
extra_ref = "#{ref}:#{ref}" if ref && ref.start_with?("refs/")
|
100
92
|
|
101
93
|
Bundler.ui.info "Fetching #{URICredentialsFilter.credential_filtered_uri(uri)}"
|
102
94
|
|
95
|
+
configured_uri = configured_uri_for(uri).to_s
|
96
|
+
|
103
97
|
unless path.exist?
|
104
98
|
SharedHelpers.filesystem_access(path.dirname) do |p|
|
105
99
|
FileUtils.mkdir_p(p)
|
106
100
|
end
|
107
|
-
git_retry
|
101
|
+
git_retry "clone", configured_uri, path.to_s, "--bare", "--no-hardlinks", "--quiet"
|
108
102
|
return unless extra_ref
|
109
103
|
end
|
110
104
|
|
111
|
-
|
112
|
-
git_retry
|
105
|
+
with_path do
|
106
|
+
git_retry(*["fetch", "--force", "--quiet", "--tags", configured_uri, "refs/heads/*:refs/heads/*", extra_ref].compact, :dir => path)
|
113
107
|
end
|
114
108
|
end
|
115
109
|
|
@@ -123,68 +117,69 @@ module Bundler
|
|
123
117
|
SharedHelpers.filesystem_access(destination) do |p|
|
124
118
|
FileUtils.rm_rf(p)
|
125
119
|
end
|
126
|
-
git_retry
|
120
|
+
git_retry "clone", "--no-checkout", "--quiet", path.to_s, destination.to_s
|
127
121
|
File.chmod(((File.stat(destination).mode | 0o777) & ~File.umask), destination)
|
128
122
|
rescue Errno::EEXIST => e
|
129
|
-
file_path = e.message[%r{.*?(
|
123
|
+
file_path = e.message[%r{.*?((?:[a-zA-Z]:)?/.*)}, 1]
|
130
124
|
raise GitError, "Bundler could not install a gem because it needs to " \
|
131
125
|
"create a directory, but a file exists - #{file_path}. Please delete " \
|
132
126
|
"this file and try again."
|
133
127
|
end
|
134
128
|
end
|
135
129
|
# method 2
|
136
|
-
|
137
|
-
git_retry %(fetch --force --quiet --tags "#{path}")
|
130
|
+
git_retry "fetch", "--force", "--quiet", "--tags", path.to_s, :dir => destination
|
138
131
|
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
132
|
+
begin
|
133
|
+
git "reset", "--hard", @revision, :dir => destination
|
134
|
+
rescue GitCommandError => e
|
135
|
+
raise MissingGitRevisionError.new(e.command, destination, @revision, URICredentialsFilter.credential_filtered_uri(uri))
|
136
|
+
end
|
144
137
|
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
138
|
+
if submodules
|
139
|
+
git_retry "submodule", "update", "--init", "--recursive", :dir => destination
|
140
|
+
elsif Gem::Version.create(version) >= Gem::Version.create("2.9.0")
|
141
|
+
inner_command = "git -C $toplevel submodule deinit --force $sm_path"
|
142
|
+
git_retry "submodule", "foreach", "--quiet", inner_command, :dir => destination
|
150
143
|
end
|
151
144
|
end
|
152
145
|
|
153
|
-
|
146
|
+
private
|
154
147
|
|
155
|
-
def git_null(command)
|
156
|
-
|
157
|
-
raise GitNotAllowedError.new(command_with_no_credentials) unless allow?
|
148
|
+
def git_null(*command, dir: nil)
|
149
|
+
check_allowed(command)
|
158
150
|
|
159
151
|
out, status = SharedHelpers.with_clean_git_env do
|
160
|
-
capture_and_ignore_stderr(
|
152
|
+
capture_and_ignore_stderr(*capture3_args_for(command, dir))
|
161
153
|
end
|
162
154
|
|
163
155
|
[URICredentialsFilter.credential_filtered_string(out, uri), status]
|
164
156
|
end
|
165
157
|
|
166
|
-
def git_retry(command)
|
167
|
-
|
168
|
-
|
158
|
+
def git_retry(*command, dir: nil)
|
159
|
+
command_with_no_credentials = check_allowed(command)
|
160
|
+
|
161
|
+
Bundler::Retry.new("`#{command_with_no_credentials}` at #{dir || SharedHelpers.pwd}").attempts do
|
162
|
+
git(*command, :dir => dir)
|
169
163
|
end
|
170
164
|
end
|
171
165
|
|
172
|
-
def git(command,
|
173
|
-
command_with_no_credentials =
|
174
|
-
raise GitNotAllowedError.new(command_with_no_credentials) unless allow?
|
166
|
+
def git(*command, dir: nil)
|
167
|
+
command_with_no_credentials = check_allowed(command)
|
175
168
|
|
176
169
|
out, status = SharedHelpers.with_clean_git_env do
|
177
|
-
capture_and_filter_stderr(
|
170
|
+
capture_and_filter_stderr(*capture3_args_for(command, dir))
|
178
171
|
end
|
179
172
|
|
180
|
-
|
181
|
-
|
182
|
-
|
173
|
+
filtered_out = URICredentialsFilter.credential_filtered_string(out, uri)
|
174
|
+
|
175
|
+
raise GitCommandError.new(command_with_no_credentials, dir || SharedHelpers.pwd, filtered_out) unless status.success?
|
176
|
+
|
177
|
+
filtered_out
|
183
178
|
end
|
184
179
|
|
185
180
|
def has_revision_cached?
|
186
181
|
return unless @revision
|
187
|
-
|
182
|
+
with_path { git("cat-file", "-e", @revision, :dir => path) }
|
188
183
|
true
|
189
184
|
rescue GitError
|
190
185
|
false
|
@@ -195,23 +190,11 @@ module Bundler
|
|
195
190
|
end
|
196
191
|
|
197
192
|
def find_local_revision
|
198
|
-
|
199
|
-
git("rev-parse --verify
|
200
|
-
end
|
201
|
-
end
|
202
|
-
|
203
|
-
# Escape the URI for git commands
|
204
|
-
def uri_escaped_with_configured_credentials
|
205
|
-
remote = configured_uri_for(uri)
|
206
|
-
if Bundler::WINDOWS
|
207
|
-
# Windows quoting requires double quotes only, with double quotes
|
208
|
-
# inside the string escaped by being doubled.
|
209
|
-
'"' + remote.gsub('"') { '""' } + '"'
|
210
|
-
else
|
211
|
-
# Bash requires single quoted strings, with the single quotes escaped
|
212
|
-
# by ending the string, escaping the quote, and restarting the string.
|
213
|
-
"'" + remote.gsub("'") { "'\\''" } + "'"
|
193
|
+
allowed_with_path do
|
194
|
+
git("rev-parse", "--verify", ref || "HEAD", :dir => path).strip
|
214
195
|
end
|
196
|
+
rescue GitCommandError => e
|
197
|
+
raise MissingGitRevisionError.new(e.command, path, ref, URICredentialsFilter.credential_filtered_uri(uri))
|
215
198
|
end
|
216
199
|
|
217
200
|
# Adds credentials to the URI as Fetcher#configured_uri_for does
|
@@ -230,29 +213,48 @@ module Bundler
|
|
230
213
|
@git ? @git.allow_git_ops? : true
|
231
214
|
end
|
232
215
|
|
233
|
-
def
|
216
|
+
def with_path(&blk)
|
234
217
|
checkout unless path.exist?
|
235
|
-
|
236
|
-
SharedHelpers.chdir(path, &blk)
|
218
|
+
blk.call
|
237
219
|
end
|
238
220
|
|
239
|
-
def
|
240
|
-
return
|
221
|
+
def allowed_with_path
|
222
|
+
return with_path { yield } if allow?
|
241
223
|
raise GitError, "The git source #{uri} is not yet checked out. Please run `bundle install` before trying to start your application"
|
242
224
|
end
|
243
225
|
|
244
|
-
def
|
226
|
+
def check_allowed(command)
|
227
|
+
command_with_no_credentials = URICredentialsFilter.credential_filtered_string("git #{command.shelljoin}", uri)
|
228
|
+
raise GitNotAllowedError.new(command_with_no_credentials) unless allow?
|
229
|
+
command_with_no_credentials
|
230
|
+
end
|
231
|
+
|
232
|
+
def capture_and_filter_stderr(*cmd)
|
245
233
|
require "open3"
|
246
|
-
return_value, captured_err, status = Open3.capture3(cmd)
|
247
|
-
Bundler.ui.warn URICredentialsFilter.credential_filtered_string(captured_err, uri)
|
234
|
+
return_value, captured_err, status = Open3.capture3(*cmd)
|
235
|
+
Bundler.ui.warn URICredentialsFilter.credential_filtered_string(captured_err, uri) unless captured_err.empty?
|
248
236
|
[return_value, status]
|
249
237
|
end
|
250
238
|
|
251
|
-
def capture_and_ignore_stderr(cmd)
|
239
|
+
def capture_and_ignore_stderr(*cmd)
|
252
240
|
require "open3"
|
253
|
-
return_value, _, status = Open3.capture3(cmd)
|
241
|
+
return_value, _, status = Open3.capture3(*cmd)
|
254
242
|
[return_value, status]
|
255
243
|
end
|
244
|
+
|
245
|
+
def capture3_args_for(cmd, dir)
|
246
|
+
return ["git", *cmd] unless dir
|
247
|
+
|
248
|
+
if Bundler.feature_flag.bundler_3_mode? || supports_minus_c?
|
249
|
+
["git", "-C", dir.to_s, *cmd]
|
250
|
+
else
|
251
|
+
["git", *cmd, { :chdir => dir.to_s }]
|
252
|
+
end
|
253
|
+
end
|
254
|
+
|
255
|
+
def supports_minus_c?
|
256
|
+
@supports_minus_c ||= Gem::Version.new(version) >= Gem::Version.new("1.8.5")
|
257
|
+
end
|
256
258
|
end
|
257
259
|
end
|
258
260
|
end
|
data/lib/bundler/source/path.rb
CHANGED
@@ -82,7 +82,9 @@ module Bundler
|
|
82
82
|
end
|
83
83
|
|
84
84
|
def install(spec, options = {})
|
85
|
-
|
85
|
+
using_message = "Using #{version_message(spec)} from #{self}"
|
86
|
+
using_message += " and installing its executables" unless spec.executables.empty?
|
87
|
+
print_using_message using_message
|
86
88
|
generate_bin(spec, :disable_extensions => true)
|
87
89
|
nil # no post-install message
|
88
90
|
end
|
@@ -125,14 +127,18 @@ module Bundler
|
|
125
127
|
@expanded_original_path ||= expand(original_path)
|
126
128
|
end
|
127
129
|
|
128
|
-
|
130
|
+
private
|
129
131
|
|
130
132
|
def expanded_path
|
131
133
|
@expanded_path ||= expand(path)
|
132
134
|
end
|
133
135
|
|
134
136
|
def expand(somepath)
|
135
|
-
|
137
|
+
if Bundler.current_ruby.jruby? # TODO: Unify when https://github.com/rubygems/bundler/issues/7598 fixed upstream and all supported jrubies include the fix
|
138
|
+
somepath.expand_path(root_path).expand_path
|
139
|
+
else
|
140
|
+
somepath.expand_path(root_path)
|
141
|
+
end
|
136
142
|
rescue ArgumentError => e
|
137
143
|
Bundler.ui.debug(e)
|
138
144
|
raise PathError, "There was an error while trying to use the path " \
|
@@ -167,7 +173,7 @@ module Bundler
|
|
167
173
|
|
168
174
|
if File.directory?(expanded_path)
|
169
175
|
# We sort depth-first since `<<` will override the earlier-found specs
|
170
|
-
|
176
|
+
Gem::Util.glob_files_in_dir(@glob, expanded_path).sort_by {|p| -p.split(File::SEPARATOR).size }.each do |file|
|
171
177
|
next unless spec = load_gemspec(file)
|
172
178
|
spec.source = self
|
173
179
|
|
@@ -1,5 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require_relative "../../rubygems_gem_installer"
|
4
|
+
|
3
5
|
module Bundler
|
4
6
|
class Source
|
5
7
|
class Path
|
@@ -26,23 +28,21 @@ module Bundler
|
|
26
28
|
end
|
27
29
|
|
28
30
|
def post_install
|
29
|
-
|
30
|
-
run_hooks(:pre_install)
|
31
|
+
run_hooks(:pre_install)
|
31
32
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
33
|
+
unless @disable_extensions
|
34
|
+
build_extensions
|
35
|
+
run_hooks(:post_build)
|
36
|
+
end
|
36
37
|
|
37
|
-
|
38
|
+
generate_bin unless spec.executables.empty?
|
38
39
|
|
39
|
-
|
40
|
-
end
|
40
|
+
run_hooks(:post_install)
|
41
41
|
ensure
|
42
42
|
Bundler.rm_rf(@tmp_dir) if Bundler.requires_sudo?
|
43
43
|
end
|
44
44
|
|
45
|
-
|
45
|
+
private
|
46
46
|
|
47
47
|
def generate_bin
|
48
48
|
super
|
@@ -20,17 +20,29 @@ module Bundler
|
|
20
20
|
@dependency_names = []
|
21
21
|
@allow_remote = false
|
22
22
|
@allow_cached = false
|
23
|
+
@allow_local = options["allow_local"] || false
|
23
24
|
@caches = [cache_path, *Bundler.rubygems.gem_cache]
|
24
25
|
|
25
|
-
Array(options["remotes"]
|
26
|
+
Array(options["remotes"]).reverse_each {|r| add_remote(r) }
|
27
|
+
end
|
28
|
+
|
29
|
+
def local!
|
30
|
+
return if @allow_local
|
31
|
+
|
32
|
+
@specs = nil
|
33
|
+
@allow_local = true
|
26
34
|
end
|
27
35
|
|
28
36
|
def remote!
|
37
|
+
return if @allow_remote
|
38
|
+
|
29
39
|
@specs = nil
|
30
40
|
@allow_remote = true
|
31
41
|
end
|
32
42
|
|
33
43
|
def cached!
|
44
|
+
return if @allow_cached
|
45
|
+
|
34
46
|
@specs = nil
|
35
47
|
@allow_cached = true
|
36
48
|
end
|
@@ -49,8 +61,12 @@ module Bundler
|
|
49
61
|
o.is_a?(Rubygems) && (o.credless_remotes - credless_remotes).empty?
|
50
62
|
end
|
51
63
|
|
64
|
+
def disable_multisource?
|
65
|
+
@remotes.size <= 1
|
66
|
+
end
|
67
|
+
|
52
68
|
def can_lock?(spec)
|
53
|
-
return super if
|
69
|
+
return super if disable_multisource?
|
54
70
|
spec.source.is_a?(Rubygems)
|
55
71
|
end
|
56
72
|
|
@@ -87,7 +103,7 @@ module Bundler
|
|
87
103
|
# small_idx.use large_idx.
|
88
104
|
idx = @allow_remote ? remote_specs.dup : Index.new
|
89
105
|
idx.use(cached_specs, :override_dupes) if @allow_cached || @allow_remote
|
90
|
-
idx.use(installed_specs, :override_dupes)
|
106
|
+
idx.use(installed_specs, :override_dupes) if @allow_local
|
91
107
|
idx
|
92
108
|
end
|
93
109
|
end
|
@@ -145,20 +161,19 @@ module Bundler
|
|
145
161
|
|
146
162
|
Bundler.mkdir_p bin_path, :no_sudo => true unless spec.executables.empty? || Bundler.rubygems.provides?(">= 2.7.5")
|
147
163
|
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
end
|
164
|
+
require_relative "../rubygems_gem_installer"
|
165
|
+
|
166
|
+
installed_spec = Bundler::RubyGemsGemInstaller.at(
|
167
|
+
path,
|
168
|
+
:install_dir => install_path.to_s,
|
169
|
+
:bin_dir => bin_path.to_s,
|
170
|
+
:ignore_dependencies => true,
|
171
|
+
:wrappers => true,
|
172
|
+
:env_shebang => true,
|
173
|
+
:build_args => opts[:build_args],
|
174
|
+
:bundler_expected_checksum => spec.respond_to?(:checksum) && spec.checksum,
|
175
|
+
:bundler_extension_cache_path => extension_cache_path(spec)
|
176
|
+
).install
|
162
177
|
spec.full_gem_path = installed_spec.full_gem_path
|
163
178
|
|
164
179
|
# SUDO HAX
|
@@ -294,7 +309,7 @@ module Bundler
|
|
294
309
|
names
|
295
310
|
end
|
296
311
|
|
297
|
-
|
312
|
+
protected
|
298
313
|
|
299
314
|
def credless_remotes
|
300
315
|
remotes.map(&method(:suppress_configured_credentials))
|
@@ -354,7 +369,6 @@ module Bundler
|
|
354
369
|
def installed_specs
|
355
370
|
@installed_specs ||= Index.build do |idx|
|
356
371
|
Bundler.rubygems.all_specs.reverse_each do |spec|
|
357
|
-
next if spec.name == "bundler"
|
358
372
|
spec.source = self
|
359
373
|
if Bundler.rubygems.spec_missing_extensions?(spec, false)
|
360
374
|
Bundler.ui.debug "Source #{self} is ignoring #{spec} because it is missing extensions"
|
@@ -367,7 +381,7 @@ module Bundler
|
|
367
381
|
|
368
382
|
def cached_specs
|
369
383
|
@cached_specs ||= begin
|
370
|
-
idx = installed_specs.dup
|
384
|
+
idx = @allow_local ? installed_specs.dup : Index.new
|
371
385
|
|
372
386
|
Dir["#{cache_path}/*.gem"].each do |gemfile|
|
373
387
|
next if gemfile =~ /^bundler\-[\d\.]+?\.gem/
|
@@ -409,11 +423,11 @@ module Bundler
|
|
409
423
|
def fetch_names(fetchers, dependency_names, index, override_dupes)
|
410
424
|
fetchers.each do |f|
|
411
425
|
if dependency_names
|
412
|
-
Bundler.ui.info "Fetching gem metadata from #{f.uri}", Bundler.ui.debug?
|
426
|
+
Bundler.ui.info "Fetching gem metadata from #{URICredentialsFilter.credential_filtered_uri(f.uri)}", Bundler.ui.debug?
|
413
427
|
index.use f.specs_with_retry(dependency_names, self), override_dupes
|
414
428
|
Bundler.ui.info "" unless Bundler.ui.debug? # new line now that the dots are over
|
415
429
|
else
|
416
|
-
Bundler.ui.info "Fetching source index from #{f.uri}"
|
430
|
+
Bundler.ui.info "Fetching source index from #{URICredentialsFilter.credential_filtered_uri(f.uri)}"
|
417
431
|
index.use f.specs_with_retry(nil, self), override_dupes
|
418
432
|
end
|
419
433
|
end
|
@@ -468,7 +482,7 @@ module Bundler
|
|
468
482
|
Bundler.app_cache
|
469
483
|
end
|
470
484
|
|
471
|
-
|
485
|
+
private
|
472
486
|
|
473
487
|
# Checks if the requested spec exists in the global cache. If it does,
|
474
488
|
# we copy it to the download path, and if it does not, we download it.
|
@@ -490,8 +504,15 @@ module Bundler
|
|
490
504
|
uri = spec.remote.uri
|
491
505
|
Bundler.ui.confirm("Fetching #{version_message(spec)}")
|
492
506
|
rubygems_local_path = Bundler.rubygems.download_gem(spec, uri, download_path)
|
507
|
+
|
508
|
+
# older rubygems return varying file:// variants depending on version
|
509
|
+
rubygems_local_path = rubygems_local_path.gsub(/\Afile:/, "") unless Bundler.rubygems.provides?(">= 3.2.0.rc.2")
|
510
|
+
rubygems_local_path = rubygems_local_path.gsub(%r{\A//}, "") if Bundler.rubygems.provides?("< 3.1.0")
|
511
|
+
|
493
512
|
if rubygems_local_path != local_path
|
494
|
-
|
513
|
+
SharedHelpers.filesystem_access(local_path) do
|
514
|
+
FileUtils.mv(rubygems_local_path, local_path)
|
515
|
+
end
|
495
516
|
end
|
496
517
|
cache_globally(spec, local_path)
|
497
518
|
end
|