bundler 2.6.9 → 4.0.11
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 +2229 -1879
- data/README.md +11 -11
- data/bundler.gemspec +5 -5
- data/lib/bundler/build_metadata.rb +10 -11
- data/lib/bundler/capistrano.rb +1 -19
- data/lib/bundler/checksum.rb +6 -0
- data/lib/bundler/cli/add.rb +10 -0
- data/lib/bundler/cli/cache.rb +1 -12
- data/lib/bundler/cli/common.rb +21 -4
- data/lib/bundler/cli/config.rb +1 -2
- data/lib/bundler/cli/console.rb +5 -0
- data/lib/bundler/cli/exec.rb +29 -4
- data/lib/bundler/cli/gem.rb +90 -64
- data/lib/bundler/cli/install.rb +15 -90
- data/lib/bundler/cli/issue.rb +2 -2
- data/lib/bundler/cli/list.rb +33 -2
- data/lib/bundler/cli/lock.rb +5 -5
- data/lib/bundler/cli/outdated.rb +1 -1
- data/lib/bundler/cli/plugin.rb +5 -1
- data/lib/bundler/cli/pristine.rb +5 -1
- data/lib/bundler/cli/show.rb +3 -7
- data/lib/bundler/cli/update.rb +5 -5
- data/lib/bundler/cli.rb +162 -127
- data/lib/bundler/compact_index_client.rb +1 -6
- data/lib/bundler/current_ruby.rb +17 -5
- data/lib/bundler/definition.rb +201 -117
- data/lib/bundler/dependency.rb +1 -1
- data/lib/bundler/deployment.rb +1 -64
- data/lib/bundler/digest.rb +1 -1
- data/lib/bundler/dsl.rb +48 -48
- data/lib/bundler/environment_preserver.rb +1 -0
- data/lib/bundler/errors.rb +1 -5
- data/lib/bundler/feature_flag.rb +5 -35
- data/lib/bundler/fetcher/compact_index.rb +1 -1
- data/lib/bundler/fetcher/dependency.rb +9 -2
- data/lib/bundler/fetcher/downloader.rb +33 -8
- data/lib/bundler/fetcher/gem_remote_fetcher.rb +6 -0
- data/lib/bundler/fetcher.rb +49 -19
- data/lib/bundler/friendly_errors.rb +4 -3
- data/lib/bundler/index.rb +7 -9
- data/lib/bundler/injector.rb +1 -2
- data/lib/bundler/inline.rb +9 -1
- data/lib/bundler/installer/gem_installer.rb +14 -11
- data/lib/bundler/installer/parallel_installer.rb +74 -36
- data/lib/bundler/installer.rb +6 -19
- data/lib/bundler/lazy_specification.rb +47 -20
- data/lib/bundler/lockfile_generator.rb +17 -2
- data/lib/bundler/lockfile_parser.rb +19 -6
- data/lib/bundler/man/bundle-add.1 +1 -1
- data/lib/bundler/man/bundle-binstubs.1 +3 -6
- data/lib/bundler/man/bundle-binstubs.1.ronn +4 -6
- data/lib/bundler/man/bundle-cache.1 +2 -14
- data/lib/bundler/man/bundle-cache.1.ronn +1 -14
- data/lib/bundler/man/bundle-check.1 +2 -5
- data/lib/bundler/man/bundle-check.1.ronn +0 -5
- data/lib/bundler/man/bundle-clean.1 +1 -1
- data/lib/bundler/man/bundle-config.1 +206 -148
- data/lib/bundler/man/bundle-config.1.ronn +136 -119
- data/lib/bundler/man/bundle-console.1 +1 -1
- data/lib/bundler/man/bundle-doctor.1 +43 -4
- data/lib/bundler/man/bundle-doctor.1.ronn +48 -4
- data/lib/bundler/man/bundle-env.1 +1 -1
- data/lib/bundler/man/bundle-exec.1 +2 -5
- data/lib/bundler/man/bundle-exec.1.ronn +1 -5
- data/lib/bundler/man/bundle-fund.1 +1 -1
- data/lib/bundler/man/bundle-gem.1 +64 -44
- data/lib/bundler/man/bundle-gem.1.ronn +10 -9
- data/lib/bundler/man/bundle-help.1 +1 -1
- data/lib/bundler/man/bundle-info.1 +1 -1
- data/lib/bundler/man/bundle-init.1 +1 -1
- data/lib/bundler/man/bundle-install.1 +16 -59
- data/lib/bundler/man/bundle-install.1.ronn +27 -108
- data/lib/bundler/man/bundle-issue.1 +1 -1
- data/lib/bundler/man/bundle-licenses.1 +1 -1
- data/lib/bundler/man/bundle-list.1 +6 -1
- data/lib/bundler/man/bundle-list.1.ronn +5 -0
- data/lib/bundler/man/bundle-lock.1 +1 -1
- data/lib/bundler/man/bundle-open.1 +1 -1
- data/lib/bundler/man/bundle-outdated.1 +1 -1
- data/lib/bundler/man/bundle-platform.1 +1 -1
- data/lib/bundler/man/bundle-plugin.1 +33 -15
- data/lib/bundler/man/bundle-plugin.1.ronn +36 -15
- data/lib/bundler/man/bundle-pristine.1 +1 -1
- data/lib/bundler/man/bundle-remove.1 +2 -8
- data/lib/bundler/man/bundle-remove.1.ronn +1 -8
- data/lib/bundler/man/bundle-show.1 +2 -5
- data/lib/bundler/man/bundle-show.1.ronn +0 -4
- data/lib/bundler/man/bundle-update.1 +5 -5
- data/lib/bundler/man/bundle-update.1.ronn +4 -4
- data/lib/bundler/man/bundle-version.1 +1 -1
- data/lib/bundler/man/bundle.1 +1 -10
- data/lib/bundler/man/bundle.1.ronn +0 -9
- data/lib/bundler/man/gemfile.5 +32 -1
- data/lib/bundler/man/gemfile.5.ronn +28 -0
- data/lib/bundler/man/index.txt +0 -2
- data/lib/bundler/match_platform.rb +31 -12
- data/lib/bundler/materialization.rb +3 -3
- data/lib/bundler/plugin/api/source.rb +8 -0
- data/lib/bundler/plugin/index.rb +6 -0
- data/lib/bundler/plugin/installer.rb +2 -11
- data/lib/bundler/plugin/source_list.rb +1 -1
- data/lib/bundler/plugin.rb +7 -4
- data/lib/bundler/resolver/package.rb +2 -1
- data/lib/bundler/resolver/strategy.rb +6 -3
- data/lib/bundler/resolver.rb +20 -4
- data/lib/bundler/retry.rb +30 -4
- data/lib/bundler/ruby_dsl.rb +17 -12
- data/lib/bundler/ruby_version.rb +1 -3
- data/lib/bundler/rubygems_ext.rb +117 -121
- data/lib/bundler/rubygems_gem_installer.rb +5 -4
- data/lib/bundler/rubygems_integration.rb +13 -12
- data/lib/bundler/runtime.rb +14 -3
- data/lib/bundler/self_manager.rb +34 -43
- data/lib/bundler/settings/validator.rb +5 -21
- data/lib/bundler/settings.rb +17 -32
- data/lib/bundler/shared_helpers.rb +12 -18
- data/lib/bundler/source/gemspec.rb +4 -0
- data/lib/bundler/source/git/git_proxy.rb +55 -29
- data/lib/bundler/source/git.rb +2 -3
- data/lib/bundler/source/metadata.rb +4 -0
- data/lib/bundler/source/path.rb +12 -7
- data/lib/bundler/source/rubygems.rb +59 -43
- data/lib/bundler/source/rubygems_aggregate.rb +4 -1
- data/lib/bundler/source.rb +3 -1
- data/lib/bundler/source_list.rb +5 -50
- data/lib/bundler/source_map.rb +8 -7
- data/lib/bundler/spec_set.rb +9 -14
- data/lib/bundler/stub_specification.rb +1 -0
- data/lib/bundler/templates/Executable +0 -11
- data/lib/bundler/templates/newgem/CODE_OF_CONDUCT.md.tt +7 -129
- data/lib/bundler/templates/newgem/Cargo.toml.tt +6 -0
- data/lib/bundler/templates/newgem/Rakefile.tt +5 -0
- data/lib/bundler/templates/newgem/circleci/config.yml.tt +12 -0
- data/lib/bundler/templates/newgem/ext/newgem/Cargo.toml.tt +8 -1
- data/lib/bundler/templates/newgem/ext/newgem/build.rs.tt +5 -0
- data/lib/bundler/templates/newgem/ext/newgem/extconf-go.rb.tt +11 -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.go.tt +31 -0
- data/lib/bundler/templates/newgem/ext/newgem/src/lib.rs.tt +13 -2
- data/lib/bundler/templates/newgem/github/workflows/build-gems.yml.tt +69 -0
- data/lib/bundler/templates/newgem/github/workflows/main.yml.tt +12 -1
- data/lib/bundler/templates/newgem/gitlab-ci.yml.tt +9 -0
- data/lib/bundler/templates/newgem/lib/newgem.rb.tt +1 -1
- data/lib/bundler/templates/newgem/newgem.gemspec.tt +17 -11
- data/lib/bundler/templates/newgem/spec/newgem_spec.rb.tt +8 -0
- data/lib/bundler/templates/newgem/test/minitest/test_newgem.rb.tt +6 -0
- data/lib/bundler/ui/shell.rb +12 -8
- data/lib/bundler/vendor/connection_pool/lib/connection_pool/timed_stack.rb +26 -23
- data/lib/bundler/vendor/connection_pool/lib/connection_pool/version.rb +1 -1
- data/lib/bundler/vendor/connection_pool/lib/connection_pool.rb +50 -6
- data/lib/bundler/vendor/fileutils/lib/fileutils.rb +57 -52
- data/lib/bundler/vendor/net-http-persistent/README.rdoc +1 -1
- data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/timed_stack_multi.rb +2 -1
- data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb +84 -42
- data/lib/bundler/vendor/thor/lib/thor/actions/file_manipulation.rb +42 -6
- data/lib/bundler/vendor/thor/lib/thor/parser/options.rb +1 -1
- data/lib/bundler/vendor/thor/lib/thor/runner.rb +2 -2
- data/lib/bundler/vendor/thor/lib/thor/shell/basic.rb +3 -7
- data/lib/bundler/vendor/thor/lib/thor/version.rb +1 -1
- data/lib/bundler/vendor/thor/lib/thor.rb +1 -1
- data/lib/bundler/vendor/uri/lib/uri/common.rb +57 -15
- data/lib/bundler/vendor/uri/lib/uri/file.rb +1 -1
- data/lib/bundler/vendor/uri/lib/uri/generic.rb +34 -21
- data/lib/bundler/vendor/uri/lib/uri/http.rb +12 -0
- data/lib/bundler/vendor/uri/lib/uri/rfc2396_parser.rb +9 -8
- data/lib/bundler/vendor/uri/lib/uri/version.rb +2 -2
- data/lib/bundler/version.rb +10 -2
- data/lib/bundler/vlad.rb +1 -14
- data/lib/bundler/worker.rb +12 -4
- data/lib/bundler.rb +20 -40
- metadata +13 -25
- data/lib/bundler/cli/inject.rb +0 -60
- data/lib/bundler/cli/viz.rb +0 -31
- data/lib/bundler/gem_helpers.rb +0 -144
- data/lib/bundler/graph.rb +0 -152
- data/lib/bundler/man/bundle-inject.1 +0 -31
- data/lib/bundler/man/bundle-inject.1.ronn +0 -32
- data/lib/bundler/man/bundle-viz.1 +0 -30
- data/lib/bundler/man/bundle-viz.1.ronn +0 -36
- data/lib/bundler/similarity_detector.rb +0 -63
- data/lib/bundler/templates/Executable.bundler +0 -109
- data/lib/bundler/vendor/connection_pool/.document +0 -1
- data/lib/bundler/vendor/fileutils/.document +0 -1
- data/lib/bundler/vendor/net-http-persistent/.document +0 -1
- data/lib/bundler/vendor/pub_grub/.document +0 -1
- data/lib/bundler/vendor/securerandom/.document +0 -1
- data/lib/bundler/vendor/thor/.document +0 -1
- data/lib/bundler/vendor/tsort/.document +0 -1
- data/lib/bundler/vendor/uri/.document +0 -1
data/lib/bundler/deployment.rb
CHANGED
|
@@ -1,69 +1,6 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
require_relative "shared_helpers"
|
|
4
|
-
Bundler::SharedHelpers.
|
|
4
|
+
Bundler::SharedHelpers.feature_removed! "Bundler no longer integrates with " \
|
|
5
5
|
"Capistrano, but Capistrano provides its own integration with " \
|
|
6
6
|
"Bundler via the capistrano-bundler gem. Use it instead."
|
|
7
|
-
|
|
8
|
-
module Bundler
|
|
9
|
-
class Deployment
|
|
10
|
-
def self.define_task(context, task_method = :task, opts = {})
|
|
11
|
-
if defined?(Capistrano) && context.is_a?(Capistrano::Configuration)
|
|
12
|
-
context_name = "capistrano"
|
|
13
|
-
role_default = "{:except => {:no_release => true}}"
|
|
14
|
-
error_type = ::Capistrano::CommandError
|
|
15
|
-
else
|
|
16
|
-
context_name = "vlad"
|
|
17
|
-
role_default = "[:app]"
|
|
18
|
-
error_type = ::Rake::CommandFailedError
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
roles = context.fetch(:bundle_roles, false)
|
|
22
|
-
opts[:roles] = roles if roles
|
|
23
|
-
|
|
24
|
-
context.send :namespace, :bundle do
|
|
25
|
-
send :desc, <<-DESC
|
|
26
|
-
Install the current Bundler environment. By default, gems will be \
|
|
27
|
-
installed to the shared/bundle path. Gems in the development and \
|
|
28
|
-
test group will not be installed. The install command is executed \
|
|
29
|
-
with the --deployment and --quiet flags. If the bundle cmd cannot \
|
|
30
|
-
be found then you can override the bundle_cmd variable to specify \
|
|
31
|
-
which one it should use. The base path to the app is fetched from \
|
|
32
|
-
the :latest_release variable. Set it for custom deploy layouts.
|
|
33
|
-
|
|
34
|
-
You can override any of these defaults by setting the variables shown below.
|
|
35
|
-
|
|
36
|
-
N.B. bundle_roles must be defined before you require 'bundler/#{context_name}' \
|
|
37
|
-
in your deploy.rb file.
|
|
38
|
-
|
|
39
|
-
set :bundle_gemfile, "Gemfile"
|
|
40
|
-
set :bundle_dir, File.join(fetch(:shared_path), 'bundle')
|
|
41
|
-
set :bundle_flags, "--deployment --quiet"
|
|
42
|
-
set :bundle_without, [:development, :test]
|
|
43
|
-
set :bundle_with, [:mysql]
|
|
44
|
-
set :bundle_cmd, "bundle" # e.g. "/opt/ruby/bin/bundle"
|
|
45
|
-
set :bundle_roles, #{role_default} # e.g. [:app, :batch]
|
|
46
|
-
DESC
|
|
47
|
-
send task_method, :install, opts do
|
|
48
|
-
bundle_cmd = context.fetch(:bundle_cmd, "bundle")
|
|
49
|
-
bundle_flags = context.fetch(:bundle_flags, "--deployment --quiet")
|
|
50
|
-
bundle_dir = context.fetch(:bundle_dir, File.join(context.fetch(:shared_path), "bundle"))
|
|
51
|
-
bundle_gemfile = context.fetch(:bundle_gemfile, "Gemfile")
|
|
52
|
-
bundle_without = [*context.fetch(:bundle_without, [:development, :test])].compact
|
|
53
|
-
bundle_with = [*context.fetch(:bundle_with, [])].compact
|
|
54
|
-
app_path = context.fetch(:latest_release)
|
|
55
|
-
if app_path.to_s.empty?
|
|
56
|
-
raise error_type.new("Cannot detect current release path - make sure you have deployed at least once.")
|
|
57
|
-
end
|
|
58
|
-
args = ["--gemfile #{File.join(app_path, bundle_gemfile)}"]
|
|
59
|
-
args << "--path #{bundle_dir}" unless bundle_dir.to_s.empty?
|
|
60
|
-
args << bundle_flags.to_s
|
|
61
|
-
args << "--without #{bundle_without.join(" ")}" unless bundle_without.empty?
|
|
62
|
-
args << "--with #{bundle_with.join(" ")}" unless bundle_with.empty?
|
|
63
|
-
|
|
64
|
-
run "cd #{app_path} && #{bundle_cmd} install #{args.join(" ")}"
|
|
65
|
-
end
|
|
66
|
-
end
|
|
67
|
-
end
|
|
68
|
-
end
|
|
69
|
-
end
|
data/lib/bundler/digest.rb
CHANGED
|
@@ -26,7 +26,7 @@ module Bundler
|
|
|
26
26
|
end
|
|
27
27
|
a, b, c, d, e = *words
|
|
28
28
|
(16..79).each do |i|
|
|
29
|
-
w[i] = SHA1_MASK & rotate(
|
|
29
|
+
w[i] = SHA1_MASK & rotate(w[i - 3] ^ w[i - 8] ^ w[i - 14] ^ w[i - 16], 1)
|
|
30
30
|
end
|
|
31
31
|
0.upto(79) do |i|
|
|
32
32
|
case i
|
data/lib/bundler/dsl.rb
CHANGED
|
@@ -9,8 +9,9 @@ module Bundler
|
|
|
9
9
|
|
|
10
10
|
def self.evaluate(gemfile, lockfile, unlock)
|
|
11
11
|
builder = new
|
|
12
|
+
builder.lockfile(lockfile)
|
|
12
13
|
builder.eval_gemfile(gemfile)
|
|
13
|
-
builder.to_definition(
|
|
14
|
+
builder.to_definition(builder.lockfile_path, unlock)
|
|
14
15
|
end
|
|
15
16
|
|
|
16
17
|
VALID_PLATFORMS = Bundler::CurrentRuby::PLATFORM_MAP.keys.freeze
|
|
@@ -38,6 +39,7 @@ module Bundler
|
|
|
38
39
|
@gemspecs = []
|
|
39
40
|
@gemfile = nil
|
|
40
41
|
@gemfiles = []
|
|
42
|
+
@lockfile = nil
|
|
41
43
|
add_git_sources
|
|
42
44
|
end
|
|
43
45
|
|
|
@@ -73,7 +75,7 @@ module Bundler
|
|
|
73
75
|
case specs_by_name_and_version.size
|
|
74
76
|
when 1
|
|
75
77
|
specs = specs_by_name_and_version.values.first
|
|
76
|
-
spec = specs.find {|s| s.
|
|
78
|
+
spec = specs.find {|s| s.installable_on_platform?(Bundler.local_platform) } || specs.first
|
|
77
79
|
|
|
78
80
|
@gemspecs << spec
|
|
79
81
|
|
|
@@ -101,6 +103,15 @@ module Bundler
|
|
|
101
103
|
add_dependency(name, version, options)
|
|
102
104
|
end
|
|
103
105
|
|
|
106
|
+
# For usage in Dsl.evaluate, since lockfile is used as part of the Gemfile.
|
|
107
|
+
def lockfile_path
|
|
108
|
+
@lockfile
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
def lockfile(file)
|
|
112
|
+
@lockfile = file
|
|
113
|
+
end
|
|
114
|
+
|
|
104
115
|
def source(source, *args, &blk)
|
|
105
116
|
options = args.last.is_a?(Hash) ? args.pop.dup : {}
|
|
106
117
|
options = normalize_hash(options)
|
|
@@ -175,6 +186,7 @@ module Bundler
|
|
|
175
186
|
|
|
176
187
|
def to_definition(lockfile, unlock)
|
|
177
188
|
check_primary_source_safety
|
|
189
|
+
lockfile = @lockfile unless @lockfile.nil?
|
|
178
190
|
Definition.new(lockfile, @dependencies, @sources, unlock, @ruby_version, @optional_groups, @gemfiles)
|
|
179
191
|
end
|
|
180
192
|
|
|
@@ -240,28 +252,27 @@ module Bundler
|
|
|
240
252
|
dep = Dependency.new(name, version, options)
|
|
241
253
|
|
|
242
254
|
# if there's already a dependency with this name we try to prefer one
|
|
243
|
-
if current = @dependencies.find {|d| d.name ==
|
|
255
|
+
if current = @dependencies.find {|d| d.name == name }
|
|
244
256
|
if current.requirement != dep.requirement
|
|
245
257
|
current_requirement_open = current.requirements_list.include?(">= 0")
|
|
246
258
|
|
|
247
259
|
gemspec_dep = [dep, current].find(&:gemspec_dev_dep?)
|
|
248
260
|
if gemspec_dep
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
dep = Dependency.new(name, current.requirement.as_list + dep.requirement.as_list, options)
|
|
261
|
+
require_relative "vendor/pub_grub/lib/pub_grub/version_range"
|
|
262
|
+
require_relative "vendor/pub_grub/lib/pub_grub/version_constraint"
|
|
263
|
+
require_relative "vendor/pub_grub/lib/pub_grub/version_union"
|
|
264
|
+
require_relative "vendor/pub_grub/lib/pub_grub/rubygems"
|
|
265
|
+
|
|
266
|
+
current_gemspec_range = PubGrub::RubyGems.requirement_to_range(current.requirement)
|
|
267
|
+
next_gemspec_range = PubGrub::RubyGems.requirement_to_range(dep.requirement)
|
|
268
|
+
|
|
269
|
+
if current_gemspec_range.intersects?(next_gemspec_range)
|
|
270
|
+
dep = Dependency.new(name, current.requirement.as_list + dep.requirement.as_list, options)
|
|
271
|
+
else
|
|
272
|
+
gemfile_dep = [dep, current].find(&:gemfile_dep?)
|
|
273
|
+
|
|
274
|
+
if gemfile_dep
|
|
275
|
+
raise GemfileError, "The #{name} dependency has conflicting requirements in Gemfile (#{gemfile_dep.requirement}) and gemspec (#{gemspec_dep.requirement})"
|
|
265
276
|
else
|
|
266
277
|
raise GemfileError, "Two gemspec development dependencies have conflicting requirements on the same gem: #{dep} and #{current}"
|
|
267
278
|
end
|
|
@@ -273,14 +284,14 @@ module Bundler
|
|
|
273
284
|
if dep.requirements_list.include?(">= 0") && !current_requirement_open
|
|
274
285
|
update_prompt = ". Gem already added"
|
|
275
286
|
else
|
|
276
|
-
update_prompt = ". If you want to update the gem version, run `bundle update #{
|
|
287
|
+
update_prompt = ". If you want to update the gem version, run `bundle update #{name}`"
|
|
277
288
|
|
|
278
289
|
update_prompt += ". You may also need to change the version requirement specified in the Gemfile if it's too restrictive." unless current_requirement_open
|
|
279
290
|
end
|
|
280
291
|
end
|
|
281
292
|
|
|
282
293
|
raise GemfileError, "You cannot specify the same gem twice with different version requirements.\n" \
|
|
283
|
-
"You specified: #{
|
|
294
|
+
"You specified: #{name} (#{current.requirement}) and #{name} (#{dep.requirement})" \
|
|
284
295
|
"#{update_prompt}"
|
|
285
296
|
end
|
|
286
297
|
end
|
|
@@ -291,12 +302,12 @@ module Bundler
|
|
|
291
302
|
@dependencies.delete(current)
|
|
292
303
|
elsif dep.gemspec_dev_dep?
|
|
293
304
|
return
|
|
294
|
-
elsif current.source != dep.source
|
|
305
|
+
elsif current.source.to_s != dep.source.to_s
|
|
295
306
|
raise GemfileError, "You cannot specify the same gem twice coming from different sources.\n" \
|
|
296
|
-
"You specified that #{
|
|
307
|
+
"You specified that #{name} (#{dep.requirement}) should come from " \
|
|
297
308
|
"#{current.source || "an unspecified source"} and #{dep.source}\n"
|
|
298
309
|
else
|
|
299
|
-
Bundler.ui.warn "Your Gemfile lists the gem #{
|
|
310
|
+
Bundler.ui.warn "Your Gemfile lists the gem #{name} (#{current.requirement}) more than once.\n" \
|
|
300
311
|
"You should probably keep only one of them.\n" \
|
|
301
312
|
"Remove any duplicate entries and specify the gem only once.\n" \
|
|
302
313
|
"While it's not a problem now, it could cause errors if you change the version of one of them later."
|
|
@@ -413,6 +424,13 @@ module Bundler
|
|
|
413
424
|
raise GemfileError, "`#{p}` is not a valid platform. The available options are: #{VALID_PLATFORMS.inspect}"
|
|
414
425
|
end
|
|
415
426
|
|
|
427
|
+
windows_platforms = platforms.select {|pl| pl.to_s.match?(/mingw|mswin/) }
|
|
428
|
+
if windows_platforms.any?
|
|
429
|
+
windows_platforms = windows_platforms.map! {|pl| ":#{pl}" }.join(", ")
|
|
430
|
+
deprecated_message = "Platform #{windows_platforms} will be removed in the future. Please use platform :windows instead."
|
|
431
|
+
Bundler::SharedHelpers.feature_deprecated! deprecated_message
|
|
432
|
+
end
|
|
433
|
+
|
|
416
434
|
# Save sources passed in a key
|
|
417
435
|
if opts.key?("source")
|
|
418
436
|
source = normalize_source(opts["source"])
|
|
@@ -477,14 +495,10 @@ module Bundler
|
|
|
477
495
|
def normalize_source(source)
|
|
478
496
|
case source
|
|
479
497
|
when :gemcutter, :rubygems, :rubyforge
|
|
480
|
-
message =
|
|
481
|
-
"The source :#{source} is deprecated because HTTP requests are insecure.\n" \
|
|
482
|
-
"Please change your source to 'https://rubygems.org' if possible, or 'http://rubygems.org' if not."
|
|
483
498
|
removed_message =
|
|
484
499
|
"The source :#{source} is disallowed because HTTP requests are insecure.\n" \
|
|
485
500
|
"Please change your source to 'https://rubygems.org' if possible, or 'http://rubygems.org' if not."
|
|
486
|
-
Bundler::SharedHelpers.
|
|
487
|
-
"http://rubygems.org"
|
|
501
|
+
Bundler::SharedHelpers.feature_removed! removed_message
|
|
488
502
|
when String
|
|
489
503
|
source
|
|
490
504
|
else
|
|
@@ -503,7 +517,7 @@ module Bundler
|
|
|
503
517
|
" gem 'rails'\n" \
|
|
504
518
|
" end\n\n"
|
|
505
519
|
|
|
506
|
-
SharedHelpers.
|
|
520
|
+
SharedHelpers.feature_removed! msg.strip
|
|
507
521
|
end
|
|
508
522
|
|
|
509
523
|
def check_rubygems_source_safety
|
|
@@ -511,24 +525,10 @@ module Bundler
|
|
|
511
525
|
end
|
|
512
526
|
|
|
513
527
|
def multiple_global_source_warning
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
raise GemfileEvalError, msg
|
|
519
|
-
else
|
|
520
|
-
message =
|
|
521
|
-
"Your Gemfile contains multiple global sources. " \
|
|
522
|
-
"Using `source` more than once without a block is a security risk, and " \
|
|
523
|
-
"may result in installing unexpected gems. To resolve this warning, use " \
|
|
524
|
-
"a block to indicate which gems should come from the secondary source."
|
|
525
|
-
removed_message =
|
|
526
|
-
"Your Gemfile contains multiple global sources. " \
|
|
527
|
-
"Using `source` more than once without a block is a security risk, and " \
|
|
528
|
-
"may result in installing unexpected gems. To resolve this error, use " \
|
|
529
|
-
"a block to indicate which gems should come from the secondary source."
|
|
530
|
-
Bundler::SharedHelpers.major_deprecation 2, message, removed_message: removed_message
|
|
531
|
-
end
|
|
528
|
+
msg = "This Gemfile contains multiple global sources. " \
|
|
529
|
+
"Each source after the first must include a block to indicate which gems " \
|
|
530
|
+
"should come from that source"
|
|
531
|
+
raise GemfileEvalError, msg
|
|
532
532
|
end
|
|
533
533
|
|
|
534
534
|
class DSLError < GemfileError
|
data/lib/bundler/errors.rb
CHANGED
|
@@ -25,6 +25,7 @@ module Bundler
|
|
|
25
25
|
|
|
26
26
|
class GemNotFound < BundlerError; status_code(7); end
|
|
27
27
|
class InstallHookError < BundlerError; status_code(8); end
|
|
28
|
+
class RemovedError < BundlerError; status_code(9); end
|
|
28
29
|
class GemfileNotFound < BundlerError; status_code(10); end
|
|
29
30
|
class GitError < BundlerError; status_code(11); end
|
|
30
31
|
class DeprecatedError < BundlerError; status_code(12); end
|
|
@@ -76,11 +77,6 @@ module Bundler
|
|
|
76
77
|
def mismatch_resolution_instructions
|
|
77
78
|
removable, remote = [@existing, @checksum].partition(&:removable?)
|
|
78
79
|
case removable.size
|
|
79
|
-
when 0
|
|
80
|
-
msg = +"Mismatched checksums each have an authoritative source:\n"
|
|
81
|
-
msg << " 1. #{@existing.sources.reject(&:removable?).map(&:to_s).join(" and ")}\n"
|
|
82
|
-
msg << " 2. #{@checksum.sources.reject(&:removable?).map(&:to_s).join(" and ")}\n"
|
|
83
|
-
msg << "You may need to alter your Gemfile sources to resolve this issue.\n"
|
|
84
80
|
when 1
|
|
85
81
|
msg = +"If you trust #{remote.first.sources.first}, to resolve this issue you can:\n"
|
|
86
82
|
msg << removable.first.removal_instructions
|
data/lib/bundler/feature_flag.rb
CHANGED
|
@@ -2,45 +2,15 @@
|
|
|
2
2
|
|
|
3
3
|
module Bundler
|
|
4
4
|
class FeatureFlag
|
|
5
|
-
|
|
6
|
-
unless Bundler::Settings::BOOL_KEYS.include?(flag.to_s)
|
|
7
|
-
raise "Cannot use `#{flag}` as a settings feature flag since it isn't a bool key"
|
|
8
|
-
end
|
|
9
|
-
|
|
10
|
-
settings_method("#{flag}?", flag, &default)
|
|
11
|
-
end
|
|
12
|
-
private_class_method :settings_flag
|
|
5
|
+
(1..10).each {|v| define_method("bundler_#{v}_mode?") { @major_version >= v } }
|
|
13
6
|
|
|
14
|
-
def
|
|
15
|
-
|
|
7
|
+
def removed_major?(target_major_version)
|
|
8
|
+
@major_version > target_major_version
|
|
16
9
|
end
|
|
17
|
-
private_class_method :settings_option
|
|
18
10
|
|
|
19
|
-
def
|
|
20
|
-
|
|
21
|
-
value = Bundler.settings[key]
|
|
22
|
-
value = instance_eval(&default) if value.nil?
|
|
23
|
-
value
|
|
24
|
-
end
|
|
11
|
+
def deprecated_major?(target_major_version)
|
|
12
|
+
@major_version >= target_major_version
|
|
25
13
|
end
|
|
26
|
-
private_class_method :settings_method
|
|
27
|
-
|
|
28
|
-
(1..10).each {|v| define_method("bundler_#{v}_mode?") { @major_version >= v } }
|
|
29
|
-
|
|
30
|
-
settings_flag(:allow_offline_install) { bundler_3_mode? }
|
|
31
|
-
settings_flag(:auto_clean_without_path) { bundler_3_mode? }
|
|
32
|
-
settings_flag(:cache_all) { bundler_3_mode? }
|
|
33
|
-
settings_flag(:default_install_uses_path) { bundler_3_mode? }
|
|
34
|
-
settings_flag(:forget_cli_options) { bundler_3_mode? }
|
|
35
|
-
settings_flag(:global_gem_cache) { bundler_3_mode? }
|
|
36
|
-
settings_flag(:lockfile_checksums) { bundler_3_mode? }
|
|
37
|
-
settings_flag(:path_relative_to_cwd) { bundler_3_mode? }
|
|
38
|
-
settings_flag(:plugins) { @bundler_version >= Gem::Version.new("1.14") }
|
|
39
|
-
settings_flag(:print_only_version_number) { bundler_3_mode? }
|
|
40
|
-
settings_flag(:setup_makes_kernel_gem_public) { !bundler_3_mode? }
|
|
41
|
-
settings_flag(:update_requires_all_flag) { bundler_4_mode? }
|
|
42
|
-
|
|
43
|
-
settings_option(:default_cli_command) { bundler_3_mode? ? :cli_help : :install }
|
|
44
14
|
|
|
45
15
|
def initialize(bundler_version)
|
|
46
16
|
@bundler_version = Gem::Version.create(bundler_version)
|
|
@@ -110,7 +110,7 @@ module Bundler
|
|
|
110
110
|
def call(path, headers)
|
|
111
111
|
fetcher.downloader.fetch(fetcher.fetch_uri + path, headers)
|
|
112
112
|
rescue NetworkDownError => e
|
|
113
|
-
raise unless
|
|
113
|
+
raise unless headers["If-None-Match"]
|
|
114
114
|
ui.warn "Using the cached data for the new index because of a network error: #{e}"
|
|
115
115
|
Gem::Net::HTTPNotModified.new(nil, nil, nil)
|
|
116
116
|
end
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
require_relative "base"
|
|
4
|
-
require "cgi"
|
|
4
|
+
require "cgi/escape"
|
|
5
|
+
require "cgi/util" unless defined?(CGI::EscapeExt)
|
|
5
6
|
|
|
6
7
|
module Bundler
|
|
7
8
|
class Fetcher
|
|
@@ -49,7 +50,7 @@ module Bundler
|
|
|
49
50
|
|
|
50
51
|
def unmarshalled_dep_gems(gem_names)
|
|
51
52
|
gem_list = []
|
|
52
|
-
gem_names.each_slice(
|
|
53
|
+
gem_names.each_slice(api_request_size) do |names|
|
|
53
54
|
marshalled_deps = downloader.fetch(dependency_api_uri(names)).body
|
|
54
55
|
gem_list.concat(Bundler.safe_load_marshal(marshalled_deps))
|
|
55
56
|
end
|
|
@@ -73,6 +74,12 @@ module Bundler
|
|
|
73
74
|
uri.query = "gems=#{CGI.escape(gem_names.sort.join(","))}" if gem_names.any?
|
|
74
75
|
uri
|
|
75
76
|
end
|
|
77
|
+
|
|
78
|
+
private
|
|
79
|
+
|
|
80
|
+
def api_request_size
|
|
81
|
+
Bundler.settings[:api_request_size]&.to_i || Source::Rubygems::API_REQUEST_SIZE
|
|
82
|
+
end
|
|
76
83
|
end
|
|
77
84
|
end
|
|
78
85
|
end
|
|
@@ -3,6 +3,28 @@
|
|
|
3
3
|
module Bundler
|
|
4
4
|
class Fetcher
|
|
5
5
|
class Downloader
|
|
6
|
+
HTTP_NON_RETRYABLE_ERRORS = [
|
|
7
|
+
SocketError,
|
|
8
|
+
Errno::EADDRNOTAVAIL,
|
|
9
|
+
Errno::ENETDOWN,
|
|
10
|
+
Errno::ENETUNREACH,
|
|
11
|
+
Gem::Net::HTTP::Persistent::Error,
|
|
12
|
+
Errno::EHOSTUNREACH,
|
|
13
|
+
].freeze
|
|
14
|
+
|
|
15
|
+
HTTP_RETRYABLE_ERRORS = [
|
|
16
|
+
Gem::Timeout::Error,
|
|
17
|
+
EOFError,
|
|
18
|
+
Errno::EINVAL,
|
|
19
|
+
Errno::ECONNRESET,
|
|
20
|
+
Errno::ETIMEDOUT,
|
|
21
|
+
Errno::EAGAIN,
|
|
22
|
+
Gem::Net::HTTPBadResponse,
|
|
23
|
+
Gem::Net::HTTPHeaderSyntaxError,
|
|
24
|
+
Gem::Net::ProtocolError,
|
|
25
|
+
Zlib::BufError,
|
|
26
|
+
].freeze
|
|
27
|
+
|
|
6
28
|
attr_reader :connection
|
|
7
29
|
attr_reader :redirect_limit
|
|
8
30
|
|
|
@@ -32,7 +54,6 @@ module Bundler
|
|
|
32
54
|
when Gem::Net::HTTPRequestedRangeNotSatisfiable
|
|
33
55
|
new_headers = headers.dup
|
|
34
56
|
new_headers.delete("Range")
|
|
35
|
-
new_headers["Accept-Encoding"] = "gzip"
|
|
36
57
|
fetch(uri, new_headers)
|
|
37
58
|
when Gem::Net::HTTPRequestEntityTooLarge
|
|
38
59
|
raise FallbackError, response.body
|
|
@@ -67,15 +88,19 @@ module Bundler
|
|
|
67
88
|
connection.request(uri, req)
|
|
68
89
|
rescue OpenSSL::SSL::SSLError
|
|
69
90
|
raise CertificateFailureError.new(uri)
|
|
70
|
-
rescue *
|
|
91
|
+
rescue *HTTP_NON_RETRYABLE_ERRORS => e
|
|
71
92
|
Bundler.ui.trace e
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
93
|
+
|
|
94
|
+
host = uri.host
|
|
95
|
+
host_port = "#{host}:#{uri.port}"
|
|
96
|
+
host = host_port if filtered_uri.to_s.include?(host_port)
|
|
97
|
+
raise NetworkDownError, "Could not reach host #{host}. Check your network " \
|
|
98
|
+
"connection and try again."
|
|
99
|
+
rescue *HTTP_RETRYABLE_ERRORS => e
|
|
100
|
+
Bundler.ui.trace e
|
|
101
|
+
|
|
102
|
+
raise HTTPError, "Network error while fetching #{filtered_uri}" \
|
|
77
103
|
" (#{e})"
|
|
78
|
-
end
|
|
79
104
|
end
|
|
80
105
|
|
|
81
106
|
private
|
|
@@ -5,6 +5,12 @@ require "rubygems/remote_fetcher"
|
|
|
5
5
|
module Bundler
|
|
6
6
|
class Fetcher
|
|
7
7
|
class GemRemoteFetcher < Gem::RemoteFetcher
|
|
8
|
+
def initialize(*)
|
|
9
|
+
super
|
|
10
|
+
|
|
11
|
+
@pool_size = Bundler.settings.installation_parallelization
|
|
12
|
+
end
|
|
13
|
+
|
|
8
14
|
def request(*args)
|
|
9
15
|
super do |req|
|
|
10
16
|
req.delete("User-Agent") if headers["User-Agent"]
|
data/lib/bundler/fetcher.rb
CHANGED
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
|
|
3
3
|
require_relative "vendored_persistent"
|
|
4
4
|
require_relative "vendored_timeout"
|
|
5
|
-
require "cgi"
|
|
6
5
|
require_relative "vendored_securerandom"
|
|
7
6
|
require "zlib"
|
|
8
7
|
|
|
@@ -73,19 +72,57 @@ module Bundler
|
|
|
73
72
|
end
|
|
74
73
|
end
|
|
75
74
|
|
|
75
|
+
HTTP_ERRORS = (Downloader::HTTP_RETRYABLE_ERRORS + Downloader::HTTP_NON_RETRYABLE_ERRORS).freeze
|
|
76
|
+
deprecate_constant :HTTP_ERRORS
|
|
77
|
+
|
|
78
|
+
NET_ERRORS = [
|
|
79
|
+
:HTTPBadGateway,
|
|
80
|
+
:HTTPBadRequest,
|
|
81
|
+
:HTTPFailedDependency,
|
|
82
|
+
:HTTPForbidden,
|
|
83
|
+
:HTTPInsufficientStorage,
|
|
84
|
+
:HTTPMethodNotAllowed,
|
|
85
|
+
:HTTPMovedPermanently,
|
|
86
|
+
:HTTPNoContent,
|
|
87
|
+
:HTTPNotFound,
|
|
88
|
+
:HTTPNotImplemented,
|
|
89
|
+
:HTTPPreconditionFailed,
|
|
90
|
+
:HTTPRequestEntityTooLarge,
|
|
91
|
+
:HTTPRequestURITooLong,
|
|
92
|
+
:HTTPUnauthorized,
|
|
93
|
+
:HTTPUnprocessableEntity,
|
|
94
|
+
:HTTPUnsupportedMediaType,
|
|
95
|
+
:HTTPVersionNotSupported,
|
|
96
|
+
].freeze
|
|
97
|
+
deprecate_constant :NET_ERRORS
|
|
98
|
+
|
|
76
99
|
# Exceptions classes that should bypass retry attempts. If your password didn't work the
|
|
77
100
|
# first time, it's not going to the third time.
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
101
|
+
FAIL_ERRORS = [
|
|
102
|
+
AuthenticationRequiredError,
|
|
103
|
+
BadAuthenticationError,
|
|
104
|
+
AuthenticationForbiddenError,
|
|
105
|
+
FallbackError,
|
|
106
|
+
SecurityError,
|
|
107
|
+
Gem::Requirement::BadRequirementError,
|
|
108
|
+
Gem::Net::HTTPBadGateway,
|
|
109
|
+
Gem::Net::HTTPBadRequest,
|
|
110
|
+
Gem::Net::HTTPFailedDependency,
|
|
111
|
+
Gem::Net::HTTPForbidden,
|
|
112
|
+
Gem::Net::HTTPInsufficientStorage,
|
|
113
|
+
Gem::Net::HTTPMethodNotAllowed,
|
|
114
|
+
Gem::Net::HTTPMovedPermanently,
|
|
115
|
+
Gem::Net::HTTPNoContent,
|
|
116
|
+
Gem::Net::HTTPNotFound,
|
|
117
|
+
Gem::Net::HTTPNotImplemented,
|
|
118
|
+
Gem::Net::HTTPPreconditionFailed,
|
|
119
|
+
Gem::Net::HTTPRequestEntityTooLarge,
|
|
120
|
+
Gem::Net::HTTPRequestURITooLong,
|
|
121
|
+
Gem::Net::HTTPUnauthorized,
|
|
122
|
+
Gem::Net::HTTPUnprocessableEntity,
|
|
123
|
+
Gem::Net::HTTPUnsupportedMediaType,
|
|
124
|
+
Gem::Net::HTTPVersionNotSupported,
|
|
125
|
+
].freeze
|
|
89
126
|
|
|
90
127
|
class << self
|
|
91
128
|
attr_accessor :disable_endpoint, :api_timeout, :redirect_limit, :max_retries
|
|
@@ -294,13 +331,6 @@ module Bundler
|
|
|
294
331
|
paths.find {|path| File.file? path }
|
|
295
332
|
end
|
|
296
333
|
|
|
297
|
-
HTTP_ERRORS = [
|
|
298
|
-
Gem::Timeout::Error, EOFError, SocketError, Errno::ENETDOWN, Errno::ENETUNREACH,
|
|
299
|
-
Errno::EINVAL, Errno::ECONNRESET, Errno::ETIMEDOUT, Errno::EAGAIN,
|
|
300
|
-
Gem::Net::HTTPBadResponse, Gem::Net::HTTPHeaderSyntaxError, Gem::Net::ProtocolError,
|
|
301
|
-
Gem::Net::HTTP::Persistent::Error, Zlib::BufError, Errno::EHOSTUNREACH
|
|
302
|
-
].freeze
|
|
303
|
-
|
|
304
334
|
def bundler_cert_store
|
|
305
335
|
store = OpenSSL::X509::Store.new
|
|
306
336
|
ssl_ca_cert = Bundler.settings[:ssl_ca_cert] ||
|
|
@@ -102,13 +102,14 @@ module Bundler
|
|
|
102
102
|
def issues_url(exception)
|
|
103
103
|
message = exception.message.lines.first.tr(":", " ").chomp
|
|
104
104
|
message = message.split("-").first if exception.is_a?(Errno)
|
|
105
|
-
require "cgi"
|
|
106
|
-
"
|
|
105
|
+
require "cgi/escape"
|
|
106
|
+
require "cgi/util" unless defined?(CGI::EscapeExt)
|
|
107
|
+
"https://github.com/ruby/rubygems/search?q=" \
|
|
107
108
|
"#{CGI.escape(message)}&type=Issues"
|
|
108
109
|
end
|
|
109
110
|
|
|
110
111
|
def new_issue_url
|
|
111
|
-
"https://github.com/
|
|
112
|
+
"https://github.com/ruby/rubygems/issues/new?labels=Bundler&template=bundler-related-issue.md"
|
|
112
113
|
end
|
|
113
114
|
end
|
|
114
115
|
|
data/lib/bundler/index.rb
CHANGED
|
@@ -46,13 +46,6 @@ module Bundler
|
|
|
46
46
|
true
|
|
47
47
|
end
|
|
48
48
|
|
|
49
|
-
def search_all(name, &blk)
|
|
50
|
-
return enum_for(:search_all, name) unless blk
|
|
51
|
-
specs_by_name(name).each(&blk)
|
|
52
|
-
@duplicates[name]&.each(&blk)
|
|
53
|
-
@sources.each {|source| source.search_all(name, &blk) }
|
|
54
|
-
end
|
|
55
|
-
|
|
56
49
|
# Search this index's specs, and any source indexes that this index knows
|
|
57
50
|
# about, returning all of the results.
|
|
58
51
|
def search(query)
|
|
@@ -131,6 +124,11 @@ module Bundler
|
|
|
131
124
|
return unless other
|
|
132
125
|
other.each do |spec|
|
|
133
126
|
if existing = find_by_spec(spec)
|
|
127
|
+
unless dependencies_eql?(existing, spec)
|
|
128
|
+
Bundler.ui.warn "Local specification for #{spec.full_name} has different dependencies than the remote gem, ignoring it"
|
|
129
|
+
next
|
|
130
|
+
end
|
|
131
|
+
|
|
134
132
|
add_duplicate(existing)
|
|
135
133
|
end
|
|
136
134
|
add spec
|
|
@@ -153,8 +151,8 @@ module Bundler
|
|
|
153
151
|
end
|
|
154
152
|
|
|
155
153
|
def dependencies_eql?(spec, other_spec)
|
|
156
|
-
deps = spec.
|
|
157
|
-
other_deps = other_spec.
|
|
154
|
+
deps = spec.runtime_dependencies
|
|
155
|
+
other_deps = other_spec.runtime_dependencies
|
|
158
156
|
deps.sort == other_deps.sort
|
|
159
157
|
end
|
|
160
158
|
|
data/lib/bundler/injector.rb
CHANGED
|
@@ -80,11 +80,10 @@ module Bundler
|
|
|
80
80
|
def conservative_version(spec)
|
|
81
81
|
version = spec.version
|
|
82
82
|
return ">= 0" if version.nil?
|
|
83
|
-
segments = version.segments
|
|
84
83
|
seg_end_index = version >= Gem::Version.new("1.0") ? 1 : 2
|
|
85
84
|
|
|
86
85
|
prerelease_suffix = version.to_s.delete_prefix(version.release.to_s) if version.prerelease?
|
|
87
|
-
"#{version_prefix}#{segments[0..seg_end_index].join(".")}#{prerelease_suffix}"
|
|
86
|
+
"#{version_prefix}#{version.segments[0..seg_end_index].join(".")}#{prerelease_suffix}"
|
|
88
87
|
end
|
|
89
88
|
|
|
90
89
|
def version_prefix
|