bundler 2.3.27 → 2.4.0
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 +44 -3
- data/README.md +2 -2
- data/bundler.gemspec +2 -2
- data/exe/bundle +1 -4
- data/lib/bundler/build_metadata.rb +2 -2
- data/lib/bundler/cli/add.rb +1 -1
- data/lib/bundler/cli/check.rb +1 -1
- data/lib/bundler/cli/common.rb +1 -0
- data/lib/bundler/cli/console.rb +2 -2
- data/lib/bundler/cli/doctor.rb +4 -6
- data/lib/bundler/cli/gem.rb +62 -40
- data/lib/bundler/cli/install.rb +2 -3
- data/lib/bundler/cli/lock.rb +8 -5
- data/lib/bundler/cli/outdated.rb +1 -3
- data/lib/bundler/cli/viz.rb +1 -1
- data/lib/bundler/cli.rb +43 -2
- data/lib/bundler/compact_index_client/cache.rb +1 -1
- data/lib/bundler/compact_index_client/updater.rb +40 -39
- data/lib/bundler/constants.rb +1 -1
- data/lib/bundler/definition.rb +61 -31
- data/lib/bundler/dependency.rb +12 -11
- data/lib/bundler/digest.rb +1 -1
- data/lib/bundler/dsl.rb +1 -1
- data/lib/bundler/env.rb +1 -1
- data/lib/bundler/environment_preserver.rb +1 -0
- data/lib/bundler/errors.rb +1 -11
- data/lib/bundler/fetcher/compact_index.rb +9 -11
- data/lib/bundler/fetcher/dependency.rb +1 -1
- data/lib/bundler/fetcher/downloader.rb +2 -5
- data/lib/bundler/fetcher.rb +2 -6
- data/lib/bundler/force_platform.rb +18 -0
- data/lib/bundler/friendly_errors.rb +0 -3
- data/lib/bundler/gem_version_promoter.rb +52 -86
- data/lib/bundler/graph.rb +3 -3
- data/lib/bundler/index.rb +5 -18
- data/lib/bundler/injector.rb +1 -1
- data/lib/bundler/inline.rb +2 -2
- data/lib/bundler/installer/parallel_installer.rb +0 -31
- data/lib/bundler/installer.rb +6 -16
- data/lib/bundler/lazy_specification.rb +37 -33
- data/lib/bundler/lockfile_parser.rb +5 -5
- data/lib/bundler/man/bundle-add.1 +1 -1
- data/lib/bundler/man/bundle-binstubs.1 +1 -1
- data/lib/bundler/man/bundle-cache.1 +1 -1
- data/lib/bundler/man/bundle-check.1 +1 -1
- data/lib/bundler/man/bundle-clean.1 +1 -1
- data/lib/bundler/man/bundle-config.1 +1 -1
- data/lib/bundler/man/bundle-console.1 +1 -1
- data/lib/bundler/man/bundle-doctor.1 +1 -1
- data/lib/bundler/man/bundle-exec.1 +1 -1
- data/lib/bundler/man/bundle-gem.1 +27 -37
- data/lib/bundler/man/bundle-gem.1.ronn +5 -5
- 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-inject.1 +1 -1
- data/lib/bundler/man/bundle-install.1 +1 -30
- data/lib/bundler/man/bundle-install.1.ronn +0 -29
- data/lib/bundler/man/bundle-list.1 +1 -1
- 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 +2 -2
- data/lib/bundler/man/bundle-platform.1.ronn +1 -1
- data/lib/bundler/man/bundle-plugin.1 +1 -1
- data/lib/bundler/man/bundle-pristine.1 +1 -1
- data/lib/bundler/man/bundle-remove.1 +1 -1
- data/lib/bundler/man/bundle-show.1 +1 -1
- data/lib/bundler/man/bundle-update.1 +1 -1
- data/lib/bundler/man/bundle-version.1 +1 -1
- data/lib/bundler/man/bundle-viz.1 +1 -1
- data/lib/bundler/man/bundle.1 +1 -1
- data/lib/bundler/man/gemfile.5 +1 -1
- data/lib/bundler/mirror.rb +5 -7
- data/lib/bundler/plugin/index.rb +4 -4
- data/lib/bundler/plugin/installer/rubygems.rb +0 -4
- data/lib/bundler/resolver/base.rb +7 -11
- data/lib/bundler/resolver/candidate.rb +92 -0
- data/lib/bundler/resolver/incompatibility.rb +15 -0
- data/lib/bundler/resolver/package.rb +63 -0
- data/lib/bundler/resolver/root.rb +25 -0
- data/lib/bundler/resolver/spec_group.rb +26 -36
- data/lib/bundler/resolver.rb +285 -277
- data/lib/bundler/rubygems_ext.rb +11 -6
- data/lib/bundler/rubygems_gem_installer.rb +4 -2
- data/lib/bundler/rubygems_integration.rb +1 -9
- data/lib/bundler/runtime.rb +1 -5
- data/lib/bundler/settings.rb +0 -6
- data/lib/bundler/shared_helpers.rb +1 -0
- data/lib/bundler/source/git/git_proxy.rb +190 -67
- data/lib/bundler/source/git.rb +15 -17
- data/lib/bundler/source/metadata.rb +0 -1
- data/lib/bundler/source/path/installer.rb +1 -22
- data/lib/bundler/source/path.rb +5 -5
- data/lib/bundler/source/rubygems.rb +13 -67
- data/lib/bundler/source_list.rb +8 -2
- data/lib/bundler/spec_set.rb +7 -9
- data/lib/bundler/templates/Executable +1 -1
- data/lib/bundler/templates/Executable.bundler +4 -9
- data/lib/bundler/templates/Executable.standalone +2 -0
- data/lib/bundler/templates/newgem/Cargo.toml.tt +7 -0
- data/lib/bundler/templates/newgem/Gemfile.tt +3 -0
- data/lib/bundler/templates/newgem/README.md.tt +6 -4
- data/lib/bundler/templates/newgem/Rakefile.tt +2 -1
- 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-rust.rb.tt +6 -0
- data/lib/bundler/templates/newgem/ext/newgem/src/lib.rs.tt +12 -0
- data/lib/bundler/templates/newgem/github/workflows/main.yml.tt +10 -0
- data/lib/bundler/templates/newgem/gitignore.tt +3 -0
- data/lib/bundler/templates/newgem/gitlab-ci.yml.tt +8 -0
- data/lib/bundler/templates/newgem/newgem.gemspec.tt +8 -2
- data/lib/bundler/ui/shell.rb +35 -12
- data/lib/bundler/ui/silent.rb +21 -5
- data/lib/bundler/vendor/connection_pool/lib/connection_pool/timed_stack.rb +3 -3
- data/lib/bundler/vendor/connection_pool/lib/connection_pool/wrapper.rb +0 -1
- data/lib/bundler/vendor/connection_pool/lib/connection_pool.rb +3 -1
- data/lib/bundler/vendor/fileutils/lib/fileutils.rb +1350 -408
- data/lib/bundler/vendor/net-http-persistent/README.rdoc +1 -1
- data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb +1 -1
- 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 +151 -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 +53 -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 +124 -0
- data/lib/bundler/vendor/pub_grub/lib/pub_grub/version_range.rb +409 -0
- data/lib/bundler/vendor/pub_grub/lib/pub_grub/version_solver.rb +240 -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/lib/thor/shell/basic.rb +1 -1
- data/lib/bundler/vendor/uri/lib/uri/common.rb +64 -16
- data/lib/bundler/vendor/uri/lib/uri/file.rb +7 -1
- data/lib/bundler/vendor/uri/lib/uri/ftp.rb +2 -1
- data/lib/bundler/vendor/uri/lib/uri/generic.rb +27 -7
- data/lib/bundler/vendor/uri/lib/uri/http.rb +40 -2
- data/lib/bundler/vendor/uri/lib/uri/https.rb +2 -1
- data/lib/bundler/vendor/uri/lib/uri/ldap.rb +1 -1
- data/lib/bundler/vendor/uri/lib/uri/ldaps.rb +2 -1
- data/lib/bundler/vendor/uri/lib/uri/mailto.rb +2 -2
- data/lib/bundler/vendor/uri/lib/uri/rfc2396_parser.rb +13 -7
- data/lib/bundler/vendor/uri/lib/uri/rfc3986_parser.rb +10 -5
- data/lib/bundler/vendor/uri/lib/uri/version.rb +1 -1
- data/lib/bundler/vendor/uri/lib/uri/ws.rb +1 -2
- data/lib/bundler/vendor/uri/lib/uri/wss.rb +2 -1
- data/lib/bundler/vendor/uri/lib/uri.rb +3 -2
- data/lib/bundler/vendored_persistent.rb +1 -33
- data/lib/bundler/{vendored_tmpdir.rb → vendored_pub_grub.rb} +1 -1
- data/lib/bundler/version.rb +5 -1
- data/lib/bundler/worker.rb +5 -7
- data/lib/bundler.rb +20 -64
- metadata +33 -32
- data/lib/bundler/templates/newgem/travis.yml.tt +0 -6
- data/lib/bundler/vendor/molinillo/LICENSE +0 -9
- 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 -149
- 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/vendored_molinillo.rb +0 -4
- data/lib/bundler/version_ranges.rb +0 -122
- /data/lib/bundler/templates/newgem/ext/newgem/{extconf.rb.tt → extconf-c.rb.tt} +0 -0
|
@@ -20,63 +20,64 @@ module Bundler
|
|
|
20
20
|
|
|
21
21
|
def initialize(fetcher)
|
|
22
22
|
@fetcher = fetcher
|
|
23
|
-
require_relative "../vendored_tmpdir"
|
|
24
23
|
end
|
|
25
24
|
|
|
26
25
|
def update(local_path, remote_path, retrying = nil)
|
|
27
26
|
headers = {}
|
|
28
27
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
# first try to fetch any new bytes on the existing file
|
|
33
|
-
if retrying.nil? && local_path.file?
|
|
34
|
-
copy_file local_path, local_temp_path
|
|
35
|
-
|
|
36
|
-
headers["If-None-Match"] = etag_for(local_temp_path)
|
|
37
|
-
headers["Range"] =
|
|
38
|
-
if local_temp_path.size.nonzero?
|
|
39
|
-
# Subtract a byte to ensure the range won't be empty.
|
|
40
|
-
# Avoids 416 (Range Not Satisfiable) responses.
|
|
41
|
-
"bytes=#{local_temp_path.size - 1}-"
|
|
42
|
-
else
|
|
43
|
-
"bytes=#{local_temp_path.size}-"
|
|
44
|
-
end
|
|
45
|
-
end
|
|
28
|
+
local_temp_path = local_path.sub(/$/, ".#{$$}")
|
|
29
|
+
local_temp_path = local_temp_path.sub(/$/, ".retrying") if retrying
|
|
30
|
+
local_temp_path = local_temp_path.sub(/$/, ".tmp")
|
|
46
31
|
|
|
47
|
-
|
|
48
|
-
|
|
32
|
+
# first try to fetch any new bytes on the existing file
|
|
33
|
+
if retrying.nil? && local_path.file?
|
|
34
|
+
copy_file local_path, local_temp_path
|
|
49
35
|
|
|
50
|
-
|
|
36
|
+
headers["If-None-Match"] = etag_for(local_temp_path)
|
|
37
|
+
headers["Range"] =
|
|
38
|
+
if local_temp_path.size.nonzero?
|
|
39
|
+
# Subtract a byte to ensure the range won't be empty.
|
|
40
|
+
# Avoids 416 (Range Not Satisfiable) responses.
|
|
41
|
+
"bytes=#{local_temp_path.size - 1}-"
|
|
42
|
+
else
|
|
43
|
+
"bytes=#{local_temp_path.size}-"
|
|
44
|
+
end
|
|
45
|
+
end
|
|
51
46
|
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
if response.is_a?(Net::HTTPPartialContent) && local_temp_path.size.nonzero?
|
|
55
|
-
local_temp_path.open("a") {|f| f << slice_body(content, 1..-1) }
|
|
47
|
+
response = @fetcher.call(remote_path, headers)
|
|
48
|
+
return nil if response.is_a?(Net::HTTPNotModified)
|
|
56
49
|
|
|
57
|
-
|
|
58
|
-
else
|
|
59
|
-
local_temp_path.open("wb") {|f| f << content }
|
|
50
|
+
content = response.body
|
|
60
51
|
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
52
|
+
etag = (response["ETag"] || "").gsub(%r{\AW/}, "")
|
|
53
|
+
correct_response = SharedHelpers.filesystem_access(local_temp_path) do
|
|
54
|
+
if response.is_a?(Net::HTTPPartialContent) && local_temp_path.size.nonzero?
|
|
55
|
+
local_temp_path.open("a") {|f| f << slice_body(content, 1..-1) }
|
|
64
56
|
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
57
|
+
etag_for(local_temp_path) == etag
|
|
58
|
+
else
|
|
59
|
+
local_temp_path.open("wb") {|f| f << content }
|
|
60
|
+
|
|
61
|
+
etag.length.zero? || etag_for(local_temp_path) == etag
|
|
70
62
|
end
|
|
63
|
+
end
|
|
71
64
|
|
|
72
|
-
|
|
73
|
-
|
|
65
|
+
if correct_response
|
|
66
|
+
SharedHelpers.filesystem_access(local_path) do
|
|
67
|
+
FileUtils.mv(local_temp_path, local_path)
|
|
74
68
|
end
|
|
69
|
+
return nil
|
|
70
|
+
end
|
|
75
71
|
|
|
76
|
-
|
|
72
|
+
if retrying
|
|
73
|
+
raise MisMatchedChecksumError.new(remote_path, etag, etag_for(local_temp_path))
|
|
77
74
|
end
|
|
75
|
+
|
|
76
|
+
update(local_path, remote_path, :retrying)
|
|
78
77
|
rescue Zlib::GzipFile::Error
|
|
79
78
|
raise Bundler::HTTPError
|
|
79
|
+
ensure
|
|
80
|
+
FileUtils.remove_file(local_temp_path) if File.exist?(local_temp_path)
|
|
80
81
|
end
|
|
81
82
|
|
|
82
83
|
def etag_for(path)
|
data/lib/bundler/constants.rb
CHANGED
data/lib/bundler/definition.rb
CHANGED
|
@@ -16,7 +16,6 @@ module Bundler
|
|
|
16
16
|
:locked_deps,
|
|
17
17
|
:locked_gems,
|
|
18
18
|
:platforms,
|
|
19
|
-
:requires,
|
|
20
19
|
:ruby_version,
|
|
21
20
|
:lockfile,
|
|
22
21
|
:gemfiles
|
|
@@ -146,11 +145,11 @@ module Bundler
|
|
|
146
145
|
@dependency_changes = converge_dependencies
|
|
147
146
|
@local_changes = converge_locals
|
|
148
147
|
|
|
149
|
-
@
|
|
148
|
+
@incomplete_lockfile = check_missing_lockfile_specs
|
|
150
149
|
end
|
|
151
150
|
|
|
152
151
|
def gem_version_promoter
|
|
153
|
-
@gem_version_promoter ||= GemVersionPromoter.new
|
|
152
|
+
@gem_version_promoter ||= GemVersionPromoter.new
|
|
154
153
|
end
|
|
155
154
|
|
|
156
155
|
def resolve_only_locally!
|
|
@@ -264,10 +263,10 @@ module Bundler
|
|
|
264
263
|
@locked_specs
|
|
265
264
|
elsif !unlocking? && nothing_changed?
|
|
266
265
|
if deleted_deps.any?
|
|
267
|
-
Bundler.ui.debug
|
|
266
|
+
Bundler.ui.debug "Some dependencies were deleted, using a subset of the resolution from the lockfile"
|
|
268
267
|
SpecSet.new(filter_specs(@locked_specs, @dependencies - deleted_deps))
|
|
269
268
|
else
|
|
270
|
-
Bundler.ui.debug
|
|
269
|
+
Bundler.ui.debug "Found no changes, using resolution from the lockfile"
|
|
271
270
|
if @locked_gems.may_include_redundant_platform_specific_gems?
|
|
272
271
|
SpecSet.new(filter_specs(@locked_specs, @dependencies))
|
|
273
272
|
else
|
|
@@ -275,8 +274,8 @@ module Bundler
|
|
|
275
274
|
end
|
|
276
275
|
end
|
|
277
276
|
else
|
|
278
|
-
Bundler.ui.debug
|
|
279
|
-
|
|
277
|
+
Bundler.ui.debug "Found changes from the lockfile, re-resolving dependencies because #{change_reason}"
|
|
278
|
+
start_resolution
|
|
280
279
|
end
|
|
281
280
|
end
|
|
282
281
|
|
|
@@ -295,11 +294,11 @@ module Bundler
|
|
|
295
294
|
|
|
296
295
|
# Convert to \r\n if the existing lock has them
|
|
297
296
|
# i.e., Windows with `git config core.autocrlf=true`
|
|
298
|
-
contents.gsub!(/\n/, "\r\n") if @lockfile_contents.match("\r\n")
|
|
297
|
+
contents.gsub!(/\n/, "\r\n") if @lockfile_contents.match?("\r\n")
|
|
299
298
|
|
|
300
299
|
if @locked_bundler_version
|
|
301
300
|
locked_major = @locked_bundler_version.segments.first
|
|
302
|
-
current_major =
|
|
301
|
+
current_major = Bundler.gem_version.segments.first
|
|
303
302
|
|
|
304
303
|
updating_major = locked_major < current_major
|
|
305
304
|
end
|
|
@@ -461,7 +460,7 @@ module Bundler
|
|
|
461
460
|
private :sources
|
|
462
461
|
|
|
463
462
|
def nothing_changed?
|
|
464
|
-
!@source_changes && !@dependency_changes && !@new_platform && !@path_changes && !@local_changes
|
|
463
|
+
!@source_changes && !@dependency_changes && !@new_platform && !@path_changes && !@local_changes && !@incomplete_lockfile
|
|
465
464
|
end
|
|
466
465
|
|
|
467
466
|
def unlocking?
|
|
@@ -474,7 +473,7 @@ module Bundler
|
|
|
474
473
|
@resolver ||= begin
|
|
475
474
|
last_resolve = converge_locked_specs
|
|
476
475
|
remove_ruby_from_platforms_if_necessary!(current_dependencies)
|
|
477
|
-
Resolver.new(source_requirements, last_resolve, gem_version_promoter, additional_base_requirements_for_resolve(last_resolve)
|
|
476
|
+
Resolver.new(source_requirements, last_resolve, gem_version_promoter, additional_base_requirements_for_resolve(last_resolve))
|
|
478
477
|
end
|
|
479
478
|
end
|
|
480
479
|
|
|
@@ -482,6 +481,23 @@ module Bundler
|
|
|
482
481
|
@expanded_dependencies ||= dependencies + metadata_dependencies
|
|
483
482
|
end
|
|
484
483
|
|
|
484
|
+
def resolution_packages
|
|
485
|
+
@resolution_packages ||= begin
|
|
486
|
+
packages = Hash.new do |h, k|
|
|
487
|
+
h[k] = Resolver::Package.new(k, @platforms, @originally_locked_specs, @unlock[:gems])
|
|
488
|
+
end
|
|
489
|
+
|
|
490
|
+
expanded_dependencies.each do |dep|
|
|
491
|
+
name = dep.name
|
|
492
|
+
platforms = dep.gem_platforms(@platforms)
|
|
493
|
+
|
|
494
|
+
packages[name] = Resolver::Package.new(name, platforms, @originally_locked_specs, @unlock[:gems], :dependency => dep)
|
|
495
|
+
end
|
|
496
|
+
|
|
497
|
+
packages
|
|
498
|
+
end
|
|
499
|
+
end
|
|
500
|
+
|
|
485
501
|
def filter_specs(specs, deps)
|
|
486
502
|
SpecSet.new(specs).for(deps, false, platforms)
|
|
487
503
|
end
|
|
@@ -507,21 +523,36 @@ module Bundler
|
|
|
507
523
|
raise GemNotFound, "Could not find #{missing_specs_list.join(" nor ")}"
|
|
508
524
|
end
|
|
509
525
|
|
|
526
|
+
incomplete_specs = specs.incomplete_specs
|
|
510
527
|
loop do
|
|
511
|
-
incomplete_specs = specs.incomplete_specs
|
|
512
528
|
break if incomplete_specs.empty?
|
|
513
529
|
|
|
514
530
|
Bundler.ui.debug("The lockfile does not have all gems needed for the current platform though, Bundler will still re-resolve dependencies")
|
|
515
|
-
@resolve =
|
|
531
|
+
@resolve = start_resolution(:exclude_specs => incomplete_specs)
|
|
516
532
|
specs = resolve.materialize(dependencies)
|
|
533
|
+
|
|
534
|
+
still_incomplete_specs = specs.incomplete_specs
|
|
535
|
+
|
|
536
|
+
if still_incomplete_specs == incomplete_specs
|
|
537
|
+
package = resolution_packages[incomplete_specs.first.name]
|
|
538
|
+
resolver.raise_not_found! package
|
|
539
|
+
end
|
|
540
|
+
|
|
541
|
+
incomplete_specs = still_incomplete_specs
|
|
517
542
|
end
|
|
518
543
|
|
|
519
|
-
bundler = sources.metadata_source.specs.search(
|
|
544
|
+
bundler = sources.metadata_source.specs.search(["bundler", Bundler.gem_version]).last
|
|
520
545
|
specs["bundler"] = bundler
|
|
521
546
|
|
|
522
547
|
specs
|
|
523
548
|
end
|
|
524
549
|
|
|
550
|
+
def start_resolution(exclude_specs: [])
|
|
551
|
+
result = resolver.start(expanded_dependencies, resolution_packages, :exclude_specs => exclude_specs)
|
|
552
|
+
|
|
553
|
+
SpecSet.new(SpecSet.new(result).for(dependencies, false, @platforms))
|
|
554
|
+
end
|
|
555
|
+
|
|
525
556
|
def precompute_source_requirements_for_indirect_dependencies?
|
|
526
557
|
@remote && sources.non_global_rubygems_sources.all?(&:dependency_api_available?) && !sources.aggregate_global_source?
|
|
527
558
|
end
|
|
@@ -574,6 +605,7 @@ module Bundler
|
|
|
574
605
|
[@new_platform, "you added a new platform to your gemfile"],
|
|
575
606
|
[@path_changes, "the gemspecs for path gems changed"],
|
|
576
607
|
[@local_changes, "the gemspecs for git local gems changed"],
|
|
608
|
+
[@incomplete_lockfile, "your lock file is missing some gems"],
|
|
577
609
|
].select(&:first).map(&:last).join(", ")
|
|
578
610
|
end
|
|
579
611
|
|
|
@@ -628,6 +660,14 @@ module Bundler
|
|
|
628
660
|
!sources_with_changes.each {|source| @unlock[:sources] << source.name }.empty?
|
|
629
661
|
end
|
|
630
662
|
|
|
663
|
+
def check_missing_lockfile_specs
|
|
664
|
+
all_locked_specs = @locked_specs.map(&:name) << "bundler"
|
|
665
|
+
|
|
666
|
+
@locked_specs.any? do |s|
|
|
667
|
+
s.dependencies.any? {|dep| !all_locked_specs.include?(dep.name) }
|
|
668
|
+
end
|
|
669
|
+
end
|
|
670
|
+
|
|
631
671
|
def converge_paths
|
|
632
672
|
sources.path_sources.any? do |source|
|
|
633
673
|
specs_changed?(source)
|
|
@@ -766,12 +806,13 @@ module Bundler
|
|
|
766
806
|
end
|
|
767
807
|
|
|
768
808
|
new_spec = new_specs[s].first
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
|
|
809
|
+
if new_spec
|
|
810
|
+
s.dependencies.replace(new_spec.dependencies)
|
|
811
|
+
else
|
|
812
|
+
# If the spec is no longer in the path source, unlock it. This
|
|
813
|
+
# commonly happens if the version changed in the gemspec
|
|
814
|
+
@unlock[:gems] << s.name
|
|
815
|
+
end
|
|
775
816
|
end
|
|
776
817
|
|
|
777
818
|
if dep.nil? && requested_dependencies.find {|d| s.name == d.name }
|
|
@@ -839,17 +880,6 @@ module Bundler
|
|
|
839
880
|
current == proposed
|
|
840
881
|
end
|
|
841
882
|
|
|
842
|
-
def compute_requires
|
|
843
|
-
dependencies.reduce({}) do |requires, dep|
|
|
844
|
-
next requires unless dep.should_include?
|
|
845
|
-
requires[dep.name] = Array(dep.autorequire || dep.name).map do |file|
|
|
846
|
-
# Allow `require: true` as an alias for `require: <name>`
|
|
847
|
-
file == true ? dep.name : file
|
|
848
|
-
end
|
|
849
|
-
requires
|
|
850
|
-
end
|
|
851
|
-
end
|
|
852
|
-
|
|
853
883
|
def additional_base_requirements_for_resolve(last_resolve)
|
|
854
884
|
return [] unless @locked_gems && unlocking? && !sources.expired_sources?(@locked_gems.sources)
|
|
855
885
|
converge_specs(@originally_locked_specs - last_resolve).map do |locked_spec|
|
data/lib/bundler/dependency.rb
CHANGED
|
@@ -7,20 +7,20 @@ require_relative "rubygems_ext"
|
|
|
7
7
|
module Bundler
|
|
8
8
|
class Dependency < Gem::Dependency
|
|
9
9
|
attr_reader :autorequire
|
|
10
|
-
attr_reader :groups, :platforms, :gemfile, :path, :git, :github, :branch, :ref
|
|
10
|
+
attr_reader :groups, :platforms, :gemfile, :path, :git, :github, :branch, :ref
|
|
11
11
|
|
|
12
12
|
ALL_RUBY_VERSIONS = ((18..27).to_a + (30..31).to_a).freeze
|
|
13
13
|
PLATFORM_MAP = {
|
|
14
|
-
:ruby
|
|
15
|
-
:mri
|
|
16
|
-
:rbx
|
|
14
|
+
:ruby => [Gem::Platform::RUBY, ALL_RUBY_VERSIONS],
|
|
15
|
+
:mri => [Gem::Platform::RUBY, ALL_RUBY_VERSIONS],
|
|
16
|
+
:rbx => [Gem::Platform::RUBY],
|
|
17
17
|
:truffleruby => [Gem::Platform::RUBY],
|
|
18
|
-
:jruby
|
|
19
|
-
:windows
|
|
20
|
-
:mswin
|
|
21
|
-
:mswin64
|
|
22
|
-
:mingw
|
|
23
|
-
:x64_mingw
|
|
18
|
+
:jruby => [Gem::Platform::JAVA, [18, 19]],
|
|
19
|
+
:windows => [Gem::Platform::WINDOWS, ALL_RUBY_VERSIONS],
|
|
20
|
+
:mswin => [Gem::Platform::MSWIN, ALL_RUBY_VERSIONS],
|
|
21
|
+
:mswin64 => [Gem::Platform::MSWIN64, ALL_RUBY_VERSIONS - [18]],
|
|
22
|
+
:mingw => [Gem::Platform::MINGW, ALL_RUBY_VERSIONS],
|
|
23
|
+
:x64_mingw => [Gem::Platform::X64_MINGW, ALL_RUBY_VERSIONS - [18, 19]],
|
|
24
24
|
}.each_with_object({}) do |(platform, spec), hash|
|
|
25
25
|
hash[platform] = spec[0]
|
|
26
26
|
spec[1]&.each {|version| hash[:"#{platform}_#{version}"] = spec[0] }
|
|
@@ -42,7 +42,7 @@ module Bundler
|
|
|
42
42
|
@env = options["env"]
|
|
43
43
|
@should_include = options.fetch("should_include", true)
|
|
44
44
|
@gemfile = options["gemfile"]
|
|
45
|
-
@force_ruby_platform = options["force_ruby_platform"]
|
|
45
|
+
@force_ruby_platform = options["force_ruby_platform"] if options.key?("force_ruby_platform")
|
|
46
46
|
|
|
47
47
|
@autorequire = Array(options["require"] || []) if options.key?("require")
|
|
48
48
|
end
|
|
@@ -50,6 +50,7 @@ module Bundler
|
|
|
50
50
|
# Returns the platforms this dependency is valid for, in the same order as
|
|
51
51
|
# passed in the `valid_platforms` parameter
|
|
52
52
|
def gem_platforms(valid_platforms)
|
|
53
|
+
return [Gem::Platform::RUBY] if force_ruby_platform
|
|
53
54
|
return valid_platforms if @platforms.empty?
|
|
54
55
|
|
|
55
56
|
valid_platforms.select {|p| expanded_platforms.include?(GemHelpers.generic(p)) }
|
data/lib/bundler/digest.rb
CHANGED
|
@@ -43,7 +43,7 @@ module Bundler
|
|
|
43
43
|
f = (b ^ c ^ d)
|
|
44
44
|
k = 0xCA62C1D6
|
|
45
45
|
end
|
|
46
|
-
t = SHA1_MASK &
|
|
46
|
+
t = SHA1_MASK & rotate(a, 5) + f + e + k + w[i]
|
|
47
47
|
a, b, c, d, e = t, a, SHA1_MASK & rotate(b, 30), c, d # rubocop:disable Style/ParallelAssignment
|
|
48
48
|
end
|
|
49
49
|
mutated = [a, b, c, d, e]
|
data/lib/bundler/dsl.rb
CHANGED
|
@@ -324,7 +324,7 @@ module Bundler
|
|
|
324
324
|
if name.is_a?(Symbol)
|
|
325
325
|
raise GemfileError, %(You need to specify gem names as Strings. Use 'gem "#{name}"' instead)
|
|
326
326
|
end
|
|
327
|
-
if
|
|
327
|
+
if /\s/.match?(name)
|
|
328
328
|
raise GemfileError, %('#{name}' is not a valid gem name because it contains whitespace)
|
|
329
329
|
end
|
|
330
330
|
raise GemfileError, %(an empty gem name is not valid) if name.empty?
|
data/lib/bundler/env.rb
CHANGED
data/lib/bundler/errors.rb
CHANGED
|
@@ -21,16 +21,7 @@ module Bundler
|
|
|
21
21
|
class InstallError < BundlerError; status_code(5); end
|
|
22
22
|
|
|
23
23
|
# Internal error, should be rescued
|
|
24
|
-
class
|
|
25
|
-
attr_reader :conflicts
|
|
26
|
-
|
|
27
|
-
def initialize(conflicts, msg = nil)
|
|
28
|
-
super(msg)
|
|
29
|
-
@conflicts = conflicts
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
status_code(6)
|
|
33
|
-
end
|
|
24
|
+
class SolveFailure < BundlerError; status_code(6); end
|
|
34
25
|
|
|
35
26
|
class GemNotFound < BundlerError; status_code(7); end
|
|
36
27
|
class InstallHookError < BundlerError; status_code(8); end
|
|
@@ -55,7 +46,6 @@ module Bundler
|
|
|
55
46
|
class CyclicDependencyError < BundlerError; status_code(21); end
|
|
56
47
|
class GemfileLockNotFound < BundlerError; status_code(22); end
|
|
57
48
|
class PluginError < BundlerError; status_code(29); end
|
|
58
|
-
class SudoNotPermittedError < BundlerError; status_code(30); end
|
|
59
49
|
class ThreadCreationError < BundlerError; status_code(33); end
|
|
60
50
|
class APIResponseMismatchError < BundlerError; status_code(34); end
|
|
61
51
|
class APIResponseInvalidDependenciesError < BundlerError; status_code(35); end
|
|
@@ -12,17 +12,15 @@ module Bundler
|
|
|
12
12
|
method = instance_method(method_name)
|
|
13
13
|
undef_method(method_name)
|
|
14
14
|
define_method(method_name) do |*args, &blk|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
nil
|
|
25
|
-
end
|
|
15
|
+
method.bind(self).call(*args, &blk)
|
|
16
|
+
rescue NetworkDownError, CompactIndexClient::Updater::MisMatchedChecksumError => e
|
|
17
|
+
raise HTTPError, e.message
|
|
18
|
+
rescue AuthenticationRequiredError
|
|
19
|
+
# Fail since we got a 401 from the server.
|
|
20
|
+
raise
|
|
21
|
+
rescue HTTPError => e
|
|
22
|
+
Bundler.ui.trace(e)
|
|
23
|
+
nil
|
|
26
24
|
end
|
|
27
25
|
end
|
|
28
26
|
|
|
@@ -55,7 +55,7 @@ module Bundler
|
|
|
55
55
|
gem_list = []
|
|
56
56
|
gem_names.each_slice(Source::Rubygems::API_REQUEST_SIZE) do |names|
|
|
57
57
|
marshalled_deps = downloader.fetch(dependency_api_uri(names)).body
|
|
58
|
-
gem_list.concat(Bundler.
|
|
58
|
+
gem_list.concat(Bundler.safe_load_marshal(marshalled_deps))
|
|
59
59
|
end
|
|
60
60
|
gem_list
|
|
61
61
|
end
|
|
@@ -61,14 +61,11 @@ module Bundler
|
|
|
61
61
|
req.basic_auth(user, password)
|
|
62
62
|
end
|
|
63
63
|
connection.request(uri, req)
|
|
64
|
-
rescue NoMethodError => e
|
|
65
|
-
raise unless ["undefined method", "use_ssl="].all? {|snippet| e.message.include? snippet }
|
|
66
|
-
raise LoadError.new("cannot load such file -- openssl")
|
|
67
64
|
rescue OpenSSL::SSL::SSLError
|
|
68
65
|
raise CertificateFailureError.new(uri)
|
|
69
66
|
rescue *HTTP_ERRORS => e
|
|
70
67
|
Bundler.ui.trace e
|
|
71
|
-
if e.is_a?(SocketError) || e.message
|
|
68
|
+
if e.is_a?(SocketError) || e.message.to_s.include?("host down:")
|
|
72
69
|
raise NetworkDownError, "Could not reach host #{uri.host}. Check your network " \
|
|
73
70
|
"connection and try again."
|
|
74
71
|
else
|
|
@@ -80,7 +77,7 @@ module Bundler
|
|
|
80
77
|
private
|
|
81
78
|
|
|
82
79
|
def validate_uri_scheme!(uri)
|
|
83
|
-
return if
|
|
80
|
+
return if /\Ahttps?\z/.match?(uri.scheme)
|
|
84
81
|
raise InvalidOption,
|
|
85
82
|
"The request uri `#{uri}` has an invalid scheme (`#{uri.scheme}`). " \
|
|
86
83
|
"Did you mean `http` or `https`?"
|
data/lib/bundler/fetcher.rb
CHANGED
|
@@ -29,9 +29,7 @@ module Bundler
|
|
|
29
29
|
" is a chance you are experiencing a man-in-the-middle attack, but" \
|
|
30
30
|
" most likely your system doesn't have the CA certificates needed" \
|
|
31
31
|
" for verification. For information about OpenSSL certificates, see" \
|
|
32
|
-
" https://railsapps.github.io/openssl-certificate-verify-failed.html."
|
|
33
|
-
" To connect without using SSL, edit your Gemfile" \
|
|
34
|
-
" sources and change 'https' to 'http'."
|
|
32
|
+
" https://railsapps.github.io/openssl-certificate-verify-failed.html."
|
|
35
33
|
end
|
|
36
34
|
end
|
|
37
35
|
|
|
@@ -39,9 +37,7 @@ module Bundler
|
|
|
39
37
|
class SSLError < HTTPError
|
|
40
38
|
def initialize(msg = nil)
|
|
41
39
|
super msg || "Could not load OpenSSL.\n" \
|
|
42
|
-
"You must recompile Ruby with OpenSSL support
|
|
43
|
-
"Gemfile from 'https' to 'http'. Instructions for compiling with OpenSSL " \
|
|
44
|
-
"using RVM are available at rvm.io/packages/openssl."
|
|
40
|
+
"You must recompile Ruby with OpenSSL support."
|
|
45
41
|
end
|
|
46
42
|
end
|
|
47
43
|
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Bundler
|
|
4
|
+
module ForcePlatform
|
|
5
|
+
private
|
|
6
|
+
|
|
7
|
+
# The `:force_ruby_platform` value used by dependencies for resolution, and
|
|
8
|
+
# by locked specifications for materialization is `false` by default, except
|
|
9
|
+
# for TruffleRuby. TruffleRuby generally needs to force the RUBY platform
|
|
10
|
+
# variant unless the name is explicitly allowlisted.
|
|
11
|
+
|
|
12
|
+
def default_force_ruby_platform
|
|
13
|
+
return false unless RUBY_ENGINE == "truffleruby"
|
|
14
|
+
|
|
15
|
+
!Gem::Platform::REUSE_AS_BINARY_ON_TRUFFLERUBY.include?(name)
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
@@ -36,9 +36,6 @@ module Bundler
|
|
|
36
36
|
end
|
|
37
37
|
when Thor::Error
|
|
38
38
|
Bundler.ui.error error.message
|
|
39
|
-
when LoadError
|
|
40
|
-
raise error unless error.message =~ /cannot load such file -- openssl|openssl.so|libcrypto.so/
|
|
41
|
-
Bundler.ui.error "\nCould not load OpenSSL. #{error.class}: #{error}\n#{error.backtrace.join("\n ")}"
|
|
42
39
|
when Interrupt
|
|
43
40
|
Bundler.ui.error "\nQuitting..."
|
|
44
41
|
Bundler.ui.trace error
|