bundler 2.6.3 → 2.6.9
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 +119 -6
- data/README.md +1 -1
- data/lib/bundler/build_metadata.rb +2 -2
- data/lib/bundler/checksum.rb +22 -12
- data/lib/bundler/cli/console.rb +8 -6
- data/lib/bundler/cli/doctor/diagnose.rb +167 -0
- data/lib/bundler/cli/doctor/ssl.rb +249 -0
- data/lib/bundler/cli/doctor.rb +27 -151
- data/lib/bundler/cli/info.rb +4 -4
- data/lib/bundler/cli/inject.rb +2 -2
- data/lib/bundler/cli/issue.rb +3 -3
- data/lib/bundler/cli/lock.rb +2 -1
- data/lib/bundler/cli/show.rb +1 -1
- data/lib/bundler/cli.rb +2 -11
- data/lib/bundler/compact_index_client/cache.rb +1 -1
- data/lib/bundler/compact_index_client/parser.rb +1 -1
- data/lib/bundler/compact_index_client/updater.rb +2 -1
- data/lib/bundler/current_ruby.rb +23 -33
- data/lib/bundler/definition.rb +220 -184
- data/lib/bundler/dependency.rb +92 -47
- data/lib/bundler/dsl.rb +84 -80
- data/lib/bundler/endpoint_specification.rb +10 -3
- data/lib/bundler/errors.rb +22 -0
- data/lib/bundler/friendly_errors.rb +1 -1
- data/lib/bundler/gem_helpers.rb +4 -10
- data/lib/bundler/gem_version_promoter.rb +0 -2
- data/lib/bundler/injector.rb +9 -9
- data/lib/bundler/installer.rb +2 -2
- data/lib/bundler/lazy_specification.rb +67 -45
- data/lib/bundler/lockfile_parser.rb +8 -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 +6 -6
- data/lib/bundler/man/bundle-config.1.ronn +9 -4
- data/lib/bundler/man/bundle-console.1 +1 -1
- data/lib/bundler/man/bundle-doctor.1 +1 -1
- data/lib/bundler/man/bundle-env.1 +1 -1
- data/lib/bundler/man/bundle-exec.1 +3 -3
- data/lib/bundler/man/bundle-exec.1.ronn +2 -2
- data/lib/bundler/man/bundle-fund.1 +1 -1
- data/lib/bundler/man/bundle-gem.1 +1 -1
- 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 -1
- 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 +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 +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/match_metadata.rb +13 -0
- data/lib/bundler/plugin/api/source.rb +1 -1
- data/lib/bundler/plugin/index.rb +1 -1
- data/lib/bundler/plugin/installer/path.rb +8 -0
- data/lib/bundler/plugin.rb +1 -1
- data/lib/bundler/resolver/candidate.rb +12 -9
- data/lib/bundler/resolver/package.rb +7 -3
- data/lib/bundler/resolver/spec_group.rb +1 -25
- data/lib/bundler/resolver/strategy.rb +40 -0
- data/lib/bundler/resolver.rb +29 -27
- data/lib/bundler/rubygems_ext.rb +97 -81
- data/lib/bundler/rubygems_integration.rb +2 -3
- data/lib/bundler/runtime.rb +27 -29
- data/lib/bundler/shared_helpers.rb +4 -0
- data/lib/bundler/source/gemspec.rb +1 -4
- data/lib/bundler/source/git/git_proxy.rb +14 -3
- data/lib/bundler/source/git.rb +5 -1
- data/lib/bundler/source/path.rb +2 -2
- data/lib/bundler/source/rubygems/remote.rb +11 -3
- data/lib/bundler/source/rubygems.rb +19 -4
- data/lib/bundler/source.rb +2 -0
- data/lib/bundler/source_list.rb +33 -11
- data/lib/bundler/spec_set.rb +98 -40
- data/lib/bundler/templates/newgem/Gemfile.tt +1 -0
- data/lib/bundler/vendor/connection_pool/lib/connection_pool/timed_stack.rb +53 -3
- data/lib/bundler/vendor/connection_pool/lib/connection_pool/version.rb +1 -1
- data/lib/bundler/vendor/connection_pool/lib/connection_pool.rb +11 -0
- data/lib/bundler/vendor/pub_grub/lib/pub_grub/basic_package_source.rb +4 -24
- data/lib/bundler/vendor/pub_grub/lib/pub_grub/strategy.rb +42 -0
- data/lib/bundler/vendor/pub_grub/lib/pub_grub/version_range.rb +20 -8
- data/lib/bundler/vendor/pub_grub/lib/pub_grub/version_solver.rb +17 -29
- data/lib/bundler/vendor/uri/lib/uri/common.rb +7 -3
- data/lib/bundler/vendor/uri/lib/uri/generic.rb +12 -11
- data/lib/bundler/vendor/uri/lib/uri/rfc2396_parser.rb +6 -6
- data/lib/bundler/vendor/uri/lib/uri/version.rb +1 -1
- data/lib/bundler/version.rb +1 -1
- metadata +7 -4
- data/lib/bundler/compact_index_client/gem_parser.rb +0 -32
@@ -17,7 +17,7 @@ module Bundler
|
|
17
17
|
# Some candidates may also keep some information explicitly about the
|
18
18
|
# package they refer to. These candidates are referred to as "canonical" and
|
19
19
|
# are used when materializing resolution results back into RubyGems
|
20
|
-
# specifications that can be installed, written to
|
20
|
+
# specifications that can be installed, written to lockfiles, and so on.
|
21
21
|
#
|
22
22
|
class Candidate
|
23
23
|
include Comparable
|
@@ -48,35 +48,38 @@ module Bundler
|
|
48
48
|
@version.segments
|
49
49
|
end
|
50
50
|
|
51
|
-
def sort_obj
|
52
|
-
[@version, @priority]
|
53
|
-
end
|
54
|
-
|
55
51
|
def <=>(other)
|
56
52
|
return unless other.is_a?(self.class)
|
57
53
|
|
58
|
-
|
54
|
+
version_comparison = version <=> other.version
|
55
|
+
return version_comparison unless version_comparison.zero?
|
56
|
+
|
57
|
+
priority <=> other.priority
|
59
58
|
end
|
60
59
|
|
61
60
|
def ==(other)
|
62
61
|
return unless other.is_a?(self.class)
|
63
62
|
|
64
|
-
|
63
|
+
version == other.version && priority == other.priority
|
65
64
|
end
|
66
65
|
|
67
66
|
def eql?(other)
|
68
67
|
return unless other.is_a?(self.class)
|
69
68
|
|
70
|
-
|
69
|
+
version.eql?(other.version) && priority.eql?(other.priority)
|
71
70
|
end
|
72
71
|
|
73
72
|
def hash
|
74
|
-
|
73
|
+
[@version, @priority].hash
|
75
74
|
end
|
76
75
|
|
77
76
|
def to_s
|
78
77
|
@version.to_s
|
79
78
|
end
|
79
|
+
|
80
|
+
protected
|
81
|
+
|
82
|
+
attr_reader :priority
|
80
83
|
end
|
81
84
|
end
|
82
85
|
end
|
@@ -15,7 +15,7 @@ module Bundler
|
|
15
15
|
class Package
|
16
16
|
attr_reader :name, :platforms, :dependency, :locked_version
|
17
17
|
|
18
|
-
def initialize(name, platforms, locked_specs:, unlock:, prerelease: false, prefer_local: false, dependency: nil)
|
18
|
+
def initialize(name, platforms, locked_specs:, unlock:, prerelease: false, prefer_local: false, dependency: nil, new_platforms: [])
|
19
19
|
@name = name
|
20
20
|
@platforms = platforms
|
21
21
|
@locked_version = locked_specs.version_for(name)
|
@@ -24,10 +24,14 @@ module Bundler
|
|
24
24
|
@top_level = !dependency.nil?
|
25
25
|
@prerelease = @dependency.prerelease? || @locked_version&.prerelease? || prerelease ? :consider_first : :ignore
|
26
26
|
@prefer_local = prefer_local
|
27
|
+
@new_platforms = new_platforms
|
27
28
|
end
|
28
29
|
|
29
30
|
def platform_specs(specs)
|
30
|
-
platforms.map
|
31
|
+
platforms.map do |platform|
|
32
|
+
prefer_locked = @new_platforms.include?(platform) ? false : !unlock?
|
33
|
+
GemHelpers.select_best_platform_match(specs, platform, prefer_locked: prefer_locked)
|
34
|
+
end
|
31
35
|
end
|
32
36
|
|
33
37
|
def to_s
|
@@ -55,7 +59,7 @@ module Bundler
|
|
55
59
|
end
|
56
60
|
|
57
61
|
def unlock?
|
58
|
-
@unlock
|
62
|
+
@unlock == true || @unlock.include?(name)
|
59
63
|
end
|
60
64
|
|
61
65
|
def ignores_prereleases?
|
@@ -39,9 +39,7 @@ module Bundler
|
|
39
39
|
end
|
40
40
|
|
41
41
|
def dependencies
|
42
|
-
@dependencies ||= @specs.flat_map
|
43
|
-
__dependencies(spec) + metadata_dependencies(spec)
|
44
|
-
end.uniq.sort
|
42
|
+
@dependencies ||= @specs.flat_map(&:expanded_dependencies).uniq.sort
|
45
43
|
end
|
46
44
|
|
47
45
|
def ==(other)
|
@@ -71,28 +69,6 @@ module Bundler
|
|
71
69
|
def exemplary_spec
|
72
70
|
@specs.first
|
73
71
|
end
|
74
|
-
|
75
|
-
def __dependencies(spec)
|
76
|
-
dependencies = []
|
77
|
-
spec.dependencies.each do |dep|
|
78
|
-
next if dep.type == :development
|
79
|
-
dependencies << Dependency.new(dep.name, dep.requirement)
|
80
|
-
end
|
81
|
-
dependencies
|
82
|
-
end
|
83
|
-
|
84
|
-
def metadata_dependencies(spec)
|
85
|
-
[
|
86
|
-
metadata_dependency("Ruby", spec.required_ruby_version),
|
87
|
-
metadata_dependency("RubyGems", spec.required_rubygems_version),
|
88
|
-
].compact
|
89
|
-
end
|
90
|
-
|
91
|
-
def metadata_dependency(name, requirement)
|
92
|
-
return if requirement.nil? || requirement.none?
|
93
|
-
|
94
|
-
Dependency.new("#{name}\0", requirement)
|
95
|
-
end
|
96
72
|
end
|
97
73
|
end
|
98
74
|
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Bundler
|
4
|
+
class Resolver
|
5
|
+
class Strategy
|
6
|
+
def initialize(source)
|
7
|
+
@source = source
|
8
|
+
end
|
9
|
+
|
10
|
+
def next_package_and_version(unsatisfied)
|
11
|
+
package, range = next_term_to_try_from(unsatisfied)
|
12
|
+
|
13
|
+
[package, most_preferred_version_of(package, range).first]
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def next_term_to_try_from(unsatisfied)
|
19
|
+
unsatisfied.min_by do |package, range|
|
20
|
+
matching_versions = @source.versions_for(package, range)
|
21
|
+
higher_versions = @source.versions_for(package, range.upper_invert)
|
22
|
+
|
23
|
+
[matching_versions.count <= 1 ? 0 : 1, higher_versions.count]
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def most_preferred_version_of(package, range)
|
28
|
+
versions = @source.versions_for(package, range)
|
29
|
+
|
30
|
+
# Conditional avoids (among other things) calling
|
31
|
+
# sort_versions_by_preferred with the root package
|
32
|
+
if versions.size > 1
|
33
|
+
@source.sort_versions_by_preferred(package, versions)
|
34
|
+
else
|
35
|
+
versions
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
data/lib/bundler/resolver.rb
CHANGED
@@ -12,6 +12,7 @@ module Bundler
|
|
12
12
|
require_relative "resolver/candidate"
|
13
13
|
require_relative "resolver/incompatibility"
|
14
14
|
require_relative "resolver/root"
|
15
|
+
require_relative "resolver/strategy"
|
15
16
|
|
16
17
|
include GemHelpers
|
17
18
|
|
@@ -78,7 +79,7 @@ module Bundler
|
|
78
79
|
end
|
79
80
|
|
80
81
|
def solve_versions(root:, logger:)
|
81
|
-
solver = PubGrub::VersionSolver.new(source: self, root: root, logger: logger)
|
82
|
+
solver = PubGrub::VersionSolver.new(source: self, root: root, strategy: Strategy.new(self), logger: logger)
|
82
83
|
result = solver.solve
|
83
84
|
resolved_specs = result.flat_map {|package, version| version.to_specs(package, @most_specific_locked_platform) }
|
84
85
|
SpecSet.new(resolved_specs).specs_with_additional_variants_from(@base.locked_specs)
|
@@ -167,15 +168,7 @@ module Bundler
|
|
167
168
|
end
|
168
169
|
|
169
170
|
def versions_for(package, range=VersionRange.any)
|
170
|
-
|
171
|
-
|
172
|
-
# Conditional avoids (among other things) calling
|
173
|
-
# sort_versions_by_preferred with the root package
|
174
|
-
if versions.size > 1
|
175
|
-
sort_versions_by_preferred(package, versions)
|
176
|
-
else
|
177
|
-
versions
|
178
|
-
end
|
171
|
+
range.select_versions(@sorted_versions[package])
|
179
172
|
end
|
180
173
|
|
181
174
|
def no_versions_incompatibility_for(package, unsatisfied_term)
|
@@ -237,7 +230,7 @@ module Bundler
|
|
237
230
|
sorted_versions[high]
|
238
231
|
end
|
239
232
|
|
240
|
-
range = PubGrub::VersionRange.new(min: low, max: high, include_min:
|
233
|
+
range = PubGrub::VersionRange.new(min: low, max: high, include_min: !low.nil?)
|
241
234
|
|
242
235
|
self_constraint = PubGrub::VersionConstraint.new(package, range: range)
|
243
236
|
|
@@ -284,8 +277,8 @@ module Bundler
|
|
284
277
|
ruby_group = Resolver::SpecGroup.new(ruby_specs)
|
285
278
|
|
286
279
|
unless ruby_group.empty?
|
287
|
-
platform_specs.each do |
|
288
|
-
ruby_group.merge(Resolver::SpecGroup.new(
|
280
|
+
platform_specs.each do |s|
|
281
|
+
ruby_group.merge(Resolver::SpecGroup.new(s))
|
289
282
|
end
|
290
283
|
|
291
284
|
groups << Resolver::Candidate.new(version, group: ruby_group, priority: -1)
|
@@ -319,6 +312,16 @@ module Bundler
|
|
319
312
|
"Gemfile"
|
320
313
|
end
|
321
314
|
|
315
|
+
def raise_incomplete!(incomplete_specs)
|
316
|
+
raise_not_found!(@base.get_package(incomplete_specs.first.name))
|
317
|
+
end
|
318
|
+
|
319
|
+
def sort_versions_by_preferred(package, versions)
|
320
|
+
@gem_version_promoter.sort_versions(package, versions)
|
321
|
+
end
|
322
|
+
|
323
|
+
private
|
324
|
+
|
322
325
|
def raise_not_found!(package)
|
323
326
|
name = package.name
|
324
327
|
source = source_for(name)
|
@@ -355,8 +358,6 @@ module Bundler
|
|
355
358
|
raise GemNotFound, message
|
356
359
|
end
|
357
360
|
|
358
|
-
private
|
359
|
-
|
360
361
|
def filtered_versions_for(package)
|
361
362
|
@gem_version_promoter.filter_versions(package, @all_versions[package])
|
362
363
|
end
|
@@ -389,9 +390,18 @@ module Bundler
|
|
389
390
|
end
|
390
391
|
|
391
392
|
def filter_remote_specs(specs, package)
|
392
|
-
|
393
|
+
if package.prefer_local?
|
394
|
+
local_specs = specs.select {|s| s.is_a?(StubSpecification) }
|
393
395
|
|
394
|
-
|
396
|
+
if local_specs.empty?
|
397
|
+
package.consider_remote_versions!
|
398
|
+
specs
|
399
|
+
else
|
400
|
+
local_specs
|
401
|
+
end
|
402
|
+
else
|
403
|
+
specs
|
404
|
+
end
|
395
405
|
end
|
396
406
|
|
397
407
|
# Ignore versions that depend on themselves incorrectly
|
@@ -405,10 +415,6 @@ module Bundler
|
|
405
415
|
requirement.satisfied_by?(spec.version) || spec.source.is_a?(Source::Gemspec)
|
406
416
|
end
|
407
417
|
|
408
|
-
def sort_versions_by_preferred(package, versions)
|
409
|
-
@gem_version_promoter.sort_versions(package, versions)
|
410
|
-
end
|
411
|
-
|
412
418
|
def repository_for(package)
|
413
419
|
source_for(package.name)
|
414
420
|
end
|
@@ -424,7 +430,7 @@ module Bundler
|
|
424
430
|
next [dep_package, dep_constraint] if name == "bundler"
|
425
431
|
|
426
432
|
dep_range = dep_constraint.range
|
427
|
-
versions =
|
433
|
+
versions = versions_for(dep_package, dep_range)
|
428
434
|
if versions.empty?
|
429
435
|
if dep_package.ignores_prereleases? || dep_package.prefer_local?
|
430
436
|
@all_versions.delete(dep_package)
|
@@ -432,7 +438,7 @@ module Bundler
|
|
432
438
|
end
|
433
439
|
dep_package.consider_prereleases! if dep_package.ignores_prereleases?
|
434
440
|
dep_package.consider_remote_versions! if dep_package.prefer_local?
|
435
|
-
versions =
|
441
|
+
versions = versions_for(dep_package, dep_range)
|
436
442
|
end
|
437
443
|
|
438
444
|
if versions.empty? && select_all_versions(dep_package, dep_range).any?
|
@@ -447,10 +453,6 @@ module Bundler
|
|
447
453
|
end.to_h
|
448
454
|
end
|
449
455
|
|
450
|
-
def select_sorted_versions(package, range)
|
451
|
-
range.select_versions(@sorted_versions[package])
|
452
|
-
end
|
453
|
-
|
454
456
|
def select_all_versions(package, range)
|
455
457
|
range.select_versions(@all_versions[package])
|
456
458
|
end
|
data/lib/bundler/rubygems_ext.rb
CHANGED
@@ -58,6 +58,87 @@ module Gem
|
|
58
58
|
end
|
59
59
|
end
|
60
60
|
|
61
|
+
require "rubygems/platform"
|
62
|
+
|
63
|
+
class Platform
|
64
|
+
JAVA = Gem::Platform.new("java")
|
65
|
+
MSWIN = Gem::Platform.new("mswin32")
|
66
|
+
MSWIN64 = Gem::Platform.new("mswin64")
|
67
|
+
MINGW = Gem::Platform.new("x86-mingw32")
|
68
|
+
X64_MINGW = [Gem::Platform.new("x64-mingw32"),
|
69
|
+
Gem::Platform.new("x64-mingw-ucrt")].freeze
|
70
|
+
UNIVERSAL_MINGW = Gem::Platform.new("universal-mingw")
|
71
|
+
WINDOWS = [MSWIN, MSWIN64, UNIVERSAL_MINGW].flatten.freeze
|
72
|
+
X64_LINUX = Gem::Platform.new("x86_64-linux")
|
73
|
+
X64_LINUX_MUSL = Gem::Platform.new("x86_64-linux-musl")
|
74
|
+
|
75
|
+
if X64_LINUX === X64_LINUX_MUSL
|
76
|
+
remove_method :===
|
77
|
+
|
78
|
+
def ===(other)
|
79
|
+
return nil unless Gem::Platform === other
|
80
|
+
|
81
|
+
# universal-mingw32 matches x64-mingw-ucrt
|
82
|
+
return true if (@cpu == "universal" || other.cpu == "universal") &&
|
83
|
+
@os.start_with?("mingw") && other.os.start_with?("mingw")
|
84
|
+
|
85
|
+
# cpu
|
86
|
+
([nil,"universal"].include?(@cpu) || [nil, "universal"].include?(other.cpu) || @cpu == other.cpu ||
|
87
|
+
(@cpu == "arm" && other.cpu.start_with?("armv"))) &&
|
88
|
+
|
89
|
+
# os
|
90
|
+
@os == other.os &&
|
91
|
+
|
92
|
+
# version
|
93
|
+
(
|
94
|
+
(@os != "linux" && (@version.nil? || other.version.nil?)) ||
|
95
|
+
(@os == "linux" && (normalized_linux_version_ext == other.normalized_linux_version_ext || ["musl#{@version}", "musleabi#{@version}", "musleabihf#{@version}"].include?(other.version))) ||
|
96
|
+
@version == other.version
|
97
|
+
)
|
98
|
+
end
|
99
|
+
|
100
|
+
# This is a copy of RubyGems 3.3.23 or higher `normalized_linux_method`.
|
101
|
+
# Once only 3.3.23 is supported, we can use the method in RubyGems.
|
102
|
+
def normalized_linux_version_ext
|
103
|
+
return nil unless @version
|
104
|
+
|
105
|
+
without_gnu_nor_abi_modifiers = @version.sub(/\Agnu/, "").sub(/eabi(hf)?\Z/, "")
|
106
|
+
return nil if without_gnu_nor_abi_modifiers.empty?
|
107
|
+
|
108
|
+
without_gnu_nor_abi_modifiers
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
Platform.singleton_class.module_eval do
|
114
|
+
unless Platform.singleton_methods.include?(:match_spec?)
|
115
|
+
def match_spec?(spec)
|
116
|
+
match_gem?(spec.platform, spec.name)
|
117
|
+
end
|
118
|
+
|
119
|
+
def match_gem?(platform, gem_name)
|
120
|
+
match_platforms?(platform, Gem.platforms)
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
match_platforms_defined = Gem::Platform.respond_to?(:match_platforms?, true)
|
125
|
+
|
126
|
+
if !match_platforms_defined || Gem::Platform.send(:match_platforms?, Gem::Platform::X64_LINUX_MUSL, [Gem::Platform::X64_LINUX])
|
127
|
+
|
128
|
+
private
|
129
|
+
|
130
|
+
remove_method :match_platforms? if match_platforms_defined
|
131
|
+
|
132
|
+
def match_platforms?(platform, platforms)
|
133
|
+
platforms.any? do |local_platform|
|
134
|
+
platform.nil? ||
|
135
|
+
local_platform == platform ||
|
136
|
+
(local_platform != Gem::Platform::RUBY && platform =~ local_platform)
|
137
|
+
end
|
138
|
+
end
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
61
142
|
require "rubygems/specification"
|
62
143
|
|
63
144
|
# Can be removed once RubyGems 3.5.14 support is dropped
|
@@ -177,10 +258,14 @@ module Gem
|
|
177
258
|
dependencies - development_dependencies
|
178
259
|
end
|
179
260
|
|
180
|
-
def
|
261
|
+
def installation_missing?
|
181
262
|
!default_gem? && !File.directory?(full_gem_path)
|
182
263
|
end
|
183
264
|
|
265
|
+
def lock_name
|
266
|
+
@lock_name ||= name_tuple.lock_name
|
267
|
+
end
|
268
|
+
|
184
269
|
unless VALIDATES_FOR_RESOLUTION
|
185
270
|
def validate_for_resolution
|
186
271
|
SpecificationPolicy.new(self).validate_for_resolution
|
@@ -288,86 +373,6 @@ module Gem
|
|
288
373
|
end
|
289
374
|
end
|
290
375
|
|
291
|
-
require "rubygems/platform"
|
292
|
-
|
293
|
-
class Platform
|
294
|
-
JAVA = Gem::Platform.new("java")
|
295
|
-
MSWIN = Gem::Platform.new("mswin32")
|
296
|
-
MSWIN64 = Gem::Platform.new("mswin64")
|
297
|
-
MINGW = Gem::Platform.new("x86-mingw32")
|
298
|
-
X64_MINGW = [Gem::Platform.new("x64-mingw32"),
|
299
|
-
Gem::Platform.new("x64-mingw-ucrt")].freeze
|
300
|
-
WINDOWS = [MSWIN, MSWIN64, MINGW, X64_MINGW].flatten.freeze
|
301
|
-
X64_LINUX = Gem::Platform.new("x86_64-linux")
|
302
|
-
X64_LINUX_MUSL = Gem::Platform.new("x86_64-linux-musl")
|
303
|
-
|
304
|
-
if X64_LINUX === X64_LINUX_MUSL
|
305
|
-
remove_method :===
|
306
|
-
|
307
|
-
def ===(other)
|
308
|
-
return nil unless Gem::Platform === other
|
309
|
-
|
310
|
-
# universal-mingw32 matches x64-mingw-ucrt
|
311
|
-
return true if (@cpu == "universal" || other.cpu == "universal") &&
|
312
|
-
@os.start_with?("mingw") && other.os.start_with?("mingw")
|
313
|
-
|
314
|
-
# cpu
|
315
|
-
([nil,"universal"].include?(@cpu) || [nil, "universal"].include?(other.cpu) || @cpu == other.cpu ||
|
316
|
-
(@cpu == "arm" && other.cpu.start_with?("armv"))) &&
|
317
|
-
|
318
|
-
# os
|
319
|
-
@os == other.os &&
|
320
|
-
|
321
|
-
# version
|
322
|
-
(
|
323
|
-
(@os != "linux" && (@version.nil? || other.version.nil?)) ||
|
324
|
-
(@os == "linux" && (normalized_linux_version_ext == other.normalized_linux_version_ext || ["musl#{@version}", "musleabi#{@version}", "musleabihf#{@version}"].include?(other.version))) ||
|
325
|
-
@version == other.version
|
326
|
-
)
|
327
|
-
end
|
328
|
-
|
329
|
-
# This is a copy of RubyGems 3.3.23 or higher `normalized_linux_method`.
|
330
|
-
# Once only 3.3.23 is supported, we can use the method in RubyGems.
|
331
|
-
def normalized_linux_version_ext
|
332
|
-
return nil unless @version
|
333
|
-
|
334
|
-
without_gnu_nor_abi_modifiers = @version.sub(/\Agnu/, "").sub(/eabi(hf)?\Z/, "")
|
335
|
-
return nil if without_gnu_nor_abi_modifiers.empty?
|
336
|
-
|
337
|
-
without_gnu_nor_abi_modifiers
|
338
|
-
end
|
339
|
-
end
|
340
|
-
end
|
341
|
-
|
342
|
-
Platform.singleton_class.module_eval do
|
343
|
-
unless Platform.singleton_methods.include?(:match_spec?)
|
344
|
-
def match_spec?(spec)
|
345
|
-
match_gem?(spec.platform, spec.name)
|
346
|
-
end
|
347
|
-
|
348
|
-
def match_gem?(platform, gem_name)
|
349
|
-
match_platforms?(platform, Gem.platforms)
|
350
|
-
end
|
351
|
-
end
|
352
|
-
|
353
|
-
match_platforms_defined = Gem::Platform.respond_to?(:match_platforms?, true)
|
354
|
-
|
355
|
-
if !match_platforms_defined || Gem::Platform.send(:match_platforms?, Gem::Platform::X64_LINUX_MUSL, [Gem::Platform::X64_LINUX])
|
356
|
-
|
357
|
-
private
|
358
|
-
|
359
|
-
remove_method :match_platforms? if match_platforms_defined
|
360
|
-
|
361
|
-
def match_platforms?(platform, platforms)
|
362
|
-
platforms.any? do |local_platform|
|
363
|
-
platform.nil? ||
|
364
|
-
local_platform == platform ||
|
365
|
-
(local_platform != Gem::Platform::RUBY && platform =~ local_platform)
|
366
|
-
end
|
367
|
-
end
|
368
|
-
end
|
369
|
-
end
|
370
|
-
|
371
376
|
# On universal Rubies, resolve the "universal" arch to the real CPU arch, without changing the extension directory.
|
372
377
|
class BasicSpecification
|
373
378
|
if /^universal\.(?<arch>.*?)-/ =~ (CROSS_COMPILING || RUBY_PLATFORM)
|
@@ -442,6 +447,17 @@ module Gem
|
|
442
447
|
end
|
443
448
|
end
|
444
449
|
|
450
|
+
unless Gem.rubygems_version >= Gem::Version.new("3.6.7")
|
451
|
+
module UnfreezeCompactIndexParsedResponse
|
452
|
+
def parse(line)
|
453
|
+
version, platform, dependencies, requirements = super
|
454
|
+
[version, platform, dependencies.frozen? ? dependencies.dup : dependencies, requirements.frozen? ? requirements.dup : requirements]
|
455
|
+
end
|
456
|
+
end
|
457
|
+
|
458
|
+
Resolver::APISet::GemParser.prepend(UnfreezeCompactIndexParsedResponse)
|
459
|
+
end
|
460
|
+
|
445
461
|
if Gem.rubygems_version < Gem::Version.new("3.6.0")
|
446
462
|
class Package; end
|
447
463
|
require "rubygems/package/tar_reader"
|
@@ -177,7 +177,7 @@ module Bundler
|
|
177
177
|
end
|
178
178
|
end
|
179
179
|
|
180
|
-
def replace_gem(
|
180
|
+
def replace_gem(specs_by_name)
|
181
181
|
executables = nil
|
182
182
|
|
183
183
|
[::Kernel.singleton_class, ::Kernel].each do |kernel_class|
|
@@ -274,7 +274,7 @@ module Bundler
|
|
274
274
|
else
|
275
275
|
Gem::BUNDLED_GEMS.replace_require(specs) if Gem::BUNDLED_GEMS.respond_to?(:replace_require)
|
276
276
|
end
|
277
|
-
replace_gem(
|
277
|
+
replace_gem(specs_by_name)
|
278
278
|
stub_rubygems(specs_by_name.values)
|
279
279
|
replace_bin_path(specs_by_name)
|
280
280
|
|
@@ -293,7 +293,6 @@ module Bundler
|
|
293
293
|
default_spec_name = default_spec.name
|
294
294
|
next if specs_by_name.key?(default_spec_name)
|
295
295
|
|
296
|
-
specs << default_spec
|
297
296
|
specs_by_name[default_spec_name] = default_spec
|
298
297
|
end
|
299
298
|
|
data/lib/bundler/runtime.rb
CHANGED
@@ -50,35 +50,30 @@ module Bundler
|
|
50
50
|
Plugin.hook(Plugin::Events::GEM_BEFORE_REQUIRE_ALL, dependencies)
|
51
51
|
|
52
52
|
dependencies.each do |dep|
|
53
|
-
required_file = nil
|
54
53
|
Plugin.hook(Plugin::Events::GEM_BEFORE_REQUIRE, dep)
|
55
54
|
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
55
|
+
# Loop through all the specified autorequires for the
|
56
|
+
# dependency. If there are none, use the dependency's name
|
57
|
+
# as the autorequire.
|
58
|
+
Array(dep.autorequire || dep.name).each do |file|
|
59
|
+
# Allow `require: true` as an alias for `require: <name>`
|
60
|
+
file = dep.name if file == true
|
61
|
+
required_file = file
|
62
|
+
begin
|
63
|
+
Kernel.require required_file
|
64
|
+
rescue LoadError => e
|
65
|
+
if dep.autorequire.nil? && e.path == required_file
|
66
|
+
if required_file.include?("-")
|
67
|
+
required_file = required_file.tr("-", "/")
|
68
|
+
retry
|
69
|
+
end
|
70
|
+
else
|
68
71
|
raise Bundler::GemRequireError.new e,
|
69
72
|
"There was an error while trying to load the gem '#{file}'."
|
70
73
|
end
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
if dep.autorequire.nil? && dep.name.include?("-")
|
76
|
-
begin
|
77
|
-
namespaced_file = dep.name.tr("-", "/")
|
78
|
-
Kernel.require namespaced_file
|
79
|
-
rescue LoadError => e
|
80
|
-
raise if e.path != namespaced_file
|
81
|
-
end
|
74
|
+
rescue RuntimeError => e
|
75
|
+
raise Bundler::GemRequireError.new e,
|
76
|
+
"There was an error while trying to load the gem '#{file}'."
|
82
77
|
end
|
83
78
|
end
|
84
79
|
|
@@ -135,11 +130,14 @@ module Bundler
|
|
135
130
|
|
136
131
|
specs_to_cache.each do |spec|
|
137
132
|
next if spec.name == "bundler"
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
133
|
+
|
134
|
+
source = spec.source
|
135
|
+
next if source.is_a?(Source::Gemspec)
|
136
|
+
|
137
|
+
if source.respond_to?(:migrate_cache)
|
138
|
+
source.migrate_cache(custom_path, local: local)
|
139
|
+
elsif source.respond_to?(:cache)
|
140
|
+
source.cache(spec, custom_path)
|
143
141
|
end
|
144
142
|
end
|
145
143
|
|
@@ -115,6 +115,10 @@ module Bundler
|
|
115
115
|
raise NoSpaceOnDeviceError.new(path, action)
|
116
116
|
rescue Errno::ENOTSUP
|
117
117
|
raise OperationNotSupportedError.new(path, action)
|
118
|
+
rescue Errno::EPERM
|
119
|
+
raise OperationNotPermittedError.new(path, action)
|
120
|
+
rescue Errno::EROFS
|
121
|
+
raise ReadOnlyFileSystemError.new(path, action)
|
118
122
|
rescue Errno::EEXIST, Errno::ENOENT
|
119
123
|
raise
|
120
124
|
rescue SystemCallError => e
|
@@ -4,15 +4,12 @@ module Bundler
|
|
4
4
|
class Source
|
5
5
|
class Gemspec < Path
|
6
6
|
attr_reader :gemspec
|
7
|
+
attr_writer :checksum_store
|
7
8
|
|
8
9
|
def initialize(options)
|
9
10
|
super
|
10
11
|
@gemspec = options["gemspec"]
|
11
12
|
end
|
12
|
-
|
13
|
-
def as_path_source
|
14
|
-
Path.new(options)
|
15
|
-
end
|
16
13
|
end
|
17
14
|
end
|
18
15
|
end
|