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.
Files changed (104) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +119 -6
  3. data/README.md +1 -1
  4. data/lib/bundler/build_metadata.rb +2 -2
  5. data/lib/bundler/checksum.rb +22 -12
  6. data/lib/bundler/cli/console.rb +8 -6
  7. data/lib/bundler/cli/doctor/diagnose.rb +167 -0
  8. data/lib/bundler/cli/doctor/ssl.rb +249 -0
  9. data/lib/bundler/cli/doctor.rb +27 -151
  10. data/lib/bundler/cli/info.rb +4 -4
  11. data/lib/bundler/cli/inject.rb +2 -2
  12. data/lib/bundler/cli/issue.rb +3 -3
  13. data/lib/bundler/cli/lock.rb +2 -1
  14. data/lib/bundler/cli/show.rb +1 -1
  15. data/lib/bundler/cli.rb +2 -11
  16. data/lib/bundler/compact_index_client/cache.rb +1 -1
  17. data/lib/bundler/compact_index_client/parser.rb +1 -1
  18. data/lib/bundler/compact_index_client/updater.rb +2 -1
  19. data/lib/bundler/current_ruby.rb +23 -33
  20. data/lib/bundler/definition.rb +220 -184
  21. data/lib/bundler/dependency.rb +92 -47
  22. data/lib/bundler/dsl.rb +84 -80
  23. data/lib/bundler/endpoint_specification.rb +10 -3
  24. data/lib/bundler/errors.rb +22 -0
  25. data/lib/bundler/friendly_errors.rb +1 -1
  26. data/lib/bundler/gem_helpers.rb +4 -10
  27. data/lib/bundler/gem_version_promoter.rb +0 -2
  28. data/lib/bundler/injector.rb +9 -9
  29. data/lib/bundler/installer.rb +2 -2
  30. data/lib/bundler/lazy_specification.rb +67 -45
  31. data/lib/bundler/lockfile_parser.rb +8 -5
  32. data/lib/bundler/man/bundle-add.1 +1 -1
  33. data/lib/bundler/man/bundle-binstubs.1 +1 -1
  34. data/lib/bundler/man/bundle-cache.1 +1 -1
  35. data/lib/bundler/man/bundle-check.1 +1 -1
  36. data/lib/bundler/man/bundle-clean.1 +1 -1
  37. data/lib/bundler/man/bundle-config.1 +6 -6
  38. data/lib/bundler/man/bundle-config.1.ronn +9 -4
  39. data/lib/bundler/man/bundle-console.1 +1 -1
  40. data/lib/bundler/man/bundle-doctor.1 +1 -1
  41. data/lib/bundler/man/bundle-env.1 +1 -1
  42. data/lib/bundler/man/bundle-exec.1 +3 -3
  43. data/lib/bundler/man/bundle-exec.1.ronn +2 -2
  44. data/lib/bundler/man/bundle-fund.1 +1 -1
  45. data/lib/bundler/man/bundle-gem.1 +1 -1
  46. data/lib/bundler/man/bundle-help.1 +1 -1
  47. data/lib/bundler/man/bundle-info.1 +1 -1
  48. data/lib/bundler/man/bundle-init.1 +1 -1
  49. data/lib/bundler/man/bundle-inject.1 +1 -1
  50. data/lib/bundler/man/bundle-install.1 +1 -1
  51. data/lib/bundler/man/bundle-issue.1 +1 -1
  52. data/lib/bundler/man/bundle-licenses.1 +1 -1
  53. data/lib/bundler/man/bundle-list.1 +1 -1
  54. data/lib/bundler/man/bundle-lock.1 +1 -1
  55. data/lib/bundler/man/bundle-open.1 +1 -1
  56. data/lib/bundler/man/bundle-outdated.1 +1 -1
  57. data/lib/bundler/man/bundle-platform.1 +1 -1
  58. data/lib/bundler/man/bundle-plugin.1 +1 -1
  59. data/lib/bundler/man/bundle-pristine.1 +1 -1
  60. data/lib/bundler/man/bundle-remove.1 +1 -1
  61. data/lib/bundler/man/bundle-show.1 +1 -1
  62. data/lib/bundler/man/bundle-update.1 +1 -1
  63. data/lib/bundler/man/bundle-version.1 +1 -1
  64. data/lib/bundler/man/bundle-viz.1 +1 -1
  65. data/lib/bundler/man/bundle.1 +1 -1
  66. data/lib/bundler/man/gemfile.5 +1 -1
  67. data/lib/bundler/match_metadata.rb +13 -0
  68. data/lib/bundler/plugin/api/source.rb +1 -1
  69. data/lib/bundler/plugin/index.rb +1 -1
  70. data/lib/bundler/plugin/installer/path.rb +8 -0
  71. data/lib/bundler/plugin.rb +1 -1
  72. data/lib/bundler/resolver/candidate.rb +12 -9
  73. data/lib/bundler/resolver/package.rb +7 -3
  74. data/lib/bundler/resolver/spec_group.rb +1 -25
  75. data/lib/bundler/resolver/strategy.rb +40 -0
  76. data/lib/bundler/resolver.rb +29 -27
  77. data/lib/bundler/rubygems_ext.rb +97 -81
  78. data/lib/bundler/rubygems_integration.rb +2 -3
  79. data/lib/bundler/runtime.rb +27 -29
  80. data/lib/bundler/shared_helpers.rb +4 -0
  81. data/lib/bundler/source/gemspec.rb +1 -4
  82. data/lib/bundler/source/git/git_proxy.rb +14 -3
  83. data/lib/bundler/source/git.rb +5 -1
  84. data/lib/bundler/source/path.rb +2 -2
  85. data/lib/bundler/source/rubygems/remote.rb +11 -3
  86. data/lib/bundler/source/rubygems.rb +19 -4
  87. data/lib/bundler/source.rb +2 -0
  88. data/lib/bundler/source_list.rb +33 -11
  89. data/lib/bundler/spec_set.rb +98 -40
  90. data/lib/bundler/templates/newgem/Gemfile.tt +1 -0
  91. data/lib/bundler/vendor/connection_pool/lib/connection_pool/timed_stack.rb +53 -3
  92. data/lib/bundler/vendor/connection_pool/lib/connection_pool/version.rb +1 -1
  93. data/lib/bundler/vendor/connection_pool/lib/connection_pool.rb +11 -0
  94. data/lib/bundler/vendor/pub_grub/lib/pub_grub/basic_package_source.rb +4 -24
  95. data/lib/bundler/vendor/pub_grub/lib/pub_grub/strategy.rb +42 -0
  96. data/lib/bundler/vendor/pub_grub/lib/pub_grub/version_range.rb +20 -8
  97. data/lib/bundler/vendor/pub_grub/lib/pub_grub/version_solver.rb +17 -29
  98. data/lib/bundler/vendor/uri/lib/uri/common.rb +7 -3
  99. data/lib/bundler/vendor/uri/lib/uri/generic.rb +12 -11
  100. data/lib/bundler/vendor/uri/lib/uri/rfc2396_parser.rb +6 -6
  101. data/lib/bundler/vendor/uri/lib/uri/version.rb +1 -1
  102. data/lib/bundler/version.rb +1 -1
  103. metadata +7 -4
  104. 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 lock files, and so on.
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
- sort_obj <=> other.sort_obj
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
- sort_obj == other.sort_obj
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
- sort_obj.eql?(other.sort_obj)
69
+ version.eql?(other.version) && priority.eql?(other.priority)
71
70
  end
72
71
 
73
72
  def hash
74
- sort_obj.hash
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 {|platform| GemHelpers.select_best_platform_match(specs, platform, prefer_locked: !unlock?) }
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.empty? || @unlock.include?(name)
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 do |spec|
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
@@ -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
- versions = select_sorted_versions(package, range)
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: true)
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 |specs|
288
- ruby_group.merge(Resolver::SpecGroup.new(specs))
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
- return specs unless package.prefer_local?
393
+ if package.prefer_local?
394
+ local_specs = specs.select {|s| s.is_a?(StubSpecification) }
393
395
 
394
- specs.select {|s| s.is_a?(StubSpecification) }
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 = select_sorted_versions(dep_package, dep_range)
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 = select_sorted_versions(dep_package, dep_range)
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
@@ -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 deleted_gem?
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(specs, specs_by_name)
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(specs, specs_by_name)
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
 
@@ -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
- begin
57
- # Loop through all the specified autorequires for the
58
- # dependency. If there are none, use the dependency's name
59
- # as the autorequire.
60
- Array(dep.autorequire || dep.name).each do |file|
61
- # Allow `require: true` as an alias for `require: <name>`
62
- file = dep.name if file == true
63
- required_file = file
64
- begin
65
- Kernel.require file
66
- rescue RuntimeError => e
67
- raise e if e.is_a?(LoadError) # we handle this a little later
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
- end
72
- rescue LoadError => e
73
- raise if dep.autorequire || e.path != required_file
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
- next if spec.source.is_a?(Source::Gemspec)
139
- if spec.source.respond_to?(:migrate_cache)
140
- spec.source.migrate_cache(custom_path, local: local)
141
- elsif spec.source.respond_to?(:cache)
142
- spec.source.cache(spec, custom_path)
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