bundler 2.2.11 → 2.3.6

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 (174) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +414 -5
  3. data/README.md +1 -1
  4. data/bundler.gemspec +2 -3
  5. data/exe/bundle +7 -8
  6. data/lib/bundler/.document +1 -0
  7. data/lib/bundler/build_metadata.rb +2 -2
  8. data/lib/bundler/cli/cache.rb +1 -1
  9. data/lib/bundler/cli/check.rb +4 -2
  10. data/lib/bundler/cli/common.rb +15 -2
  11. data/lib/bundler/cli/doctor.rb +24 -5
  12. data/lib/bundler/cli/exec.rb +1 -6
  13. data/lib/bundler/cli/gem.rb +130 -26
  14. data/lib/bundler/cli/info.rb +16 -4
  15. data/lib/bundler/cli/install.rb +12 -27
  16. data/lib/bundler/cli/issue.rb +4 -3
  17. data/lib/bundler/cli/list.rb +7 -1
  18. data/lib/bundler/cli/lock.rb +5 -1
  19. data/lib/bundler/cli/open.rb +1 -2
  20. data/lib/bundler/cli/outdated.rb +10 -11
  21. data/lib/bundler/cli/platform.rb +1 -1
  22. data/lib/bundler/cli/remove.rb +1 -2
  23. data/lib/bundler/cli/update.rb +17 -8
  24. data/lib/bundler/cli.rb +41 -55
  25. data/lib/bundler/compact_index_client/cache.rb +0 -9
  26. data/lib/bundler/compact_index_client/updater.rb +10 -11
  27. data/lib/bundler/compact_index_client.rb +2 -8
  28. data/lib/bundler/current_ruby.rb +5 -4
  29. data/lib/bundler/definition.rb +147 -290
  30. data/lib/bundler/dependency.rb +5 -7
  31. data/lib/bundler/digest.rb +71 -0
  32. data/lib/bundler/dsl.rb +67 -66
  33. data/lib/bundler/endpoint_specification.rb +21 -11
  34. data/lib/bundler/env.rb +1 -1
  35. data/lib/bundler/environment_preserver.rb +4 -1
  36. data/lib/bundler/errors.rb +19 -3
  37. data/lib/bundler/feature_flag.rb +0 -4
  38. data/lib/bundler/fetcher/compact_index.rb +10 -15
  39. data/lib/bundler/fetcher/downloader.rb +9 -6
  40. data/lib/bundler/fetcher/index.rb +0 -27
  41. data/lib/bundler/fetcher.rb +10 -16
  42. data/lib/bundler/friendly_errors.rb +5 -32
  43. data/lib/bundler/gem_helper.rb +21 -16
  44. data/lib/bundler/index.rb +2 -7
  45. data/lib/bundler/injector.rb +12 -3
  46. data/lib/bundler/inline.rb +2 -1
  47. data/lib/bundler/installer/gem_installer.rb +4 -22
  48. data/lib/bundler/installer/parallel_installer.rb +36 -15
  49. data/lib/bundler/installer/standalone.rb +14 -9
  50. data/lib/bundler/installer.rb +8 -17
  51. data/lib/bundler/lazy_specification.rb +23 -2
  52. data/lib/bundler/lockfile_generator.rb +1 -1
  53. data/lib/bundler/lockfile_parser.rb +16 -45
  54. data/lib/bundler/man/bundle-add.1 +10 -2
  55. data/lib/bundler/man/bundle-add.1.ronn +7 -1
  56. data/lib/bundler/man/bundle-binstubs.1 +1 -1
  57. data/lib/bundler/man/bundle-cache.1 +1 -1
  58. data/lib/bundler/man/bundle-check.1 +1 -1
  59. data/lib/bundler/man/bundle-clean.1 +1 -1
  60. data/lib/bundler/man/bundle-config.1 +23 -15
  61. data/lib/bundler/man/bundle-config.1.ronn +24 -17
  62. data/lib/bundler/man/bundle-doctor.1 +1 -1
  63. data/lib/bundler/man/bundle-exec.1 +1 -1
  64. data/lib/bundler/man/bundle-gem.1 +14 -1
  65. data/lib/bundler/man/bundle-gem.1.ronn +16 -0
  66. data/lib/bundler/man/bundle-info.1 +1 -1
  67. data/lib/bundler/man/bundle-init.1 +1 -1
  68. data/lib/bundler/man/bundle-inject.1 +1 -1
  69. data/lib/bundler/man/bundle-install.1 +2 -2
  70. data/lib/bundler/man/bundle-install.1.ronn +2 -2
  71. data/lib/bundler/man/bundle-list.1 +1 -1
  72. data/lib/bundler/man/bundle-lock.1 +1 -1
  73. data/lib/bundler/man/bundle-open.1 +1 -1
  74. data/lib/bundler/man/bundle-outdated.1 +1 -1
  75. data/lib/bundler/man/bundle-platform.1 +1 -1
  76. data/lib/bundler/man/bundle-pristine.1 +1 -1
  77. data/lib/bundler/man/bundle-remove.1 +1 -1
  78. data/lib/bundler/man/bundle-show.1 +1 -1
  79. data/lib/bundler/man/bundle-update.1 +5 -5
  80. data/lib/bundler/man/bundle-update.1.ronn +5 -4
  81. data/lib/bundler/man/bundle-viz.1 +1 -1
  82. data/lib/bundler/man/bundle.1 +1 -1
  83. data/lib/bundler/man/gemfile.5 +28 -2
  84. data/lib/bundler/man/gemfile.5.ronn +9 -1
  85. data/lib/bundler/plugin/api/source.rb +22 -0
  86. data/lib/bundler/plugin/index.rb +4 -1
  87. data/lib/bundler/plugin/installer.rb +10 -10
  88. data/lib/bundler/plugin/source_list.rb +4 -0
  89. data/lib/bundler/plugin.rb +28 -8
  90. data/lib/bundler/process_lock.rb +1 -1
  91. data/lib/bundler/psyched_yaml.rb +1 -13
  92. data/lib/bundler/remote_specification.rb +7 -0
  93. data/lib/bundler/resolver/spec_group.rb +1 -25
  94. data/lib/bundler/resolver.rb +55 -147
  95. data/lib/bundler/retry.rb +1 -1
  96. data/lib/bundler/ruby_version.rb +1 -1
  97. data/lib/bundler/rubygems_ext.rb +30 -8
  98. data/lib/bundler/rubygems_gem_installer.rb +68 -1
  99. data/lib/bundler/rubygems_integration.rb +43 -60
  100. data/lib/bundler/runtime.rb +18 -11
  101. data/lib/bundler/self_manager.rb +168 -0
  102. data/lib/bundler/settings.rb +96 -20
  103. data/lib/bundler/setup.rb +2 -2
  104. data/lib/bundler/shared_helpers.rb +4 -19
  105. data/lib/bundler/source/git/git_proxy.rb +8 -6
  106. data/lib/bundler/source/git.rb +22 -4
  107. data/lib/bundler/source/metadata.rb +1 -5
  108. data/lib/bundler/source/path/installer.rb +1 -1
  109. data/lib/bundler/source/path.rb +3 -1
  110. data/lib/bundler/source/rubygems.rb +111 -106
  111. data/lib/bundler/source/rubygems_aggregate.rb +68 -0
  112. data/lib/bundler/source.rb +21 -0
  113. data/lib/bundler/source_list.rb +100 -60
  114. data/lib/bundler/source_map.rb +58 -0
  115. data/lib/bundler/spec_set.rb +17 -31
  116. data/lib/bundler/stub_specification.rb +8 -0
  117. data/lib/bundler/templates/Executable.bundler +7 -7
  118. data/lib/bundler/templates/Gemfile +0 -2
  119. data/lib/bundler/templates/gems.rb +0 -3
  120. data/lib/bundler/templates/newgem/Gemfile.tt +5 -2
  121. data/lib/bundler/templates/newgem/README.md.tt +5 -3
  122. data/lib/bundler/templates/newgem/Rakefile.tt +15 -2
  123. data/lib/bundler/templates/newgem/github/workflows/main.yml.tt +15 -6
  124. data/lib/bundler/templates/newgem/newgem.gemspec.tt +18 -16
  125. data/lib/bundler/templates/newgem/sig/newgem.rbs.tt +8 -0
  126. data/lib/bundler/templates/newgem/standard.yml.tt +3 -0
  127. data/lib/bundler/templates/newgem/test/minitest/{newgem_test.rb.tt → test_newgem.rb.tt} +1 -1
  128. data/lib/bundler/ui/shell.rb +1 -1
  129. data/lib/bundler/vendor/.document +1 -0
  130. data/lib/bundler/vendor/connection_pool/LICENSE +20 -0
  131. data/lib/bundler/vendor/connection_pool/lib/connection_pool/timed_stack.rb +19 -21
  132. data/lib/bundler/vendor/connection_pool/lib/connection_pool/version.rb +1 -1
  133. data/lib/bundler/vendor/connection_pool/lib/connection_pool/wrapper.rb +57 -0
  134. data/lib/bundler/vendor/connection_pool/lib/connection_pool.rb +39 -74
  135. data/lib/bundler/vendor/fileutils/LICENSE.txt +22 -0
  136. data/lib/bundler/vendor/molinillo/LICENSE +9 -0
  137. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph.rb +2 -2
  138. data/lib/bundler/vendor/molinillo/lib/molinillo/modules/specification_provider.rb +1 -1
  139. data/lib/bundler/vendor/net-http-persistent/README.rdoc +82 -0
  140. data/lib/bundler/vendor/thor/LICENSE.md +20 -0
  141. data/lib/bundler/vendor/thor/lib/thor/actions/file_manipulation.rb +5 -5
  142. data/lib/bundler/vendor/thor/lib/thor/actions/inject_into_file.rb +1 -2
  143. data/lib/bundler/vendor/thor/lib/thor/actions.rb +6 -2
  144. data/lib/bundler/vendor/thor/lib/thor/core_ext/hash_with_indifferent_access.rb +6 -0
  145. data/lib/bundler/vendor/thor/lib/thor/error.rb +9 -4
  146. data/lib/bundler/vendor/thor/lib/thor/parser/options.rb +19 -1
  147. data/lib/bundler/vendor/thor/lib/thor/shell/basic.rb +22 -4
  148. data/lib/bundler/vendor/thor/lib/thor/shell.rb +1 -1
  149. data/lib/bundler/vendor/thor/lib/thor/util.rb +1 -1
  150. data/lib/bundler/vendor/thor/lib/thor/version.rb +1 -1
  151. data/lib/bundler/vendor/tmpdir/lib/tmpdir.rb +1 -1
  152. data/lib/bundler/vendor/tsort/LICENSE.txt +22 -0
  153. data/lib/bundler/vendor/tsort/lib/tsort.rb +453 -0
  154. data/lib/bundler/vendor/uri/LICENSE.txt +22 -0
  155. data/lib/bundler/vendor/uri/lib/uri/common.rb +17 -80
  156. data/lib/bundler/vendor/uri/lib/uri/ftp.rb +0 -1
  157. data/lib/bundler/vendor/uri/lib/uri/generic.rb +5 -6
  158. data/lib/bundler/vendor/uri/lib/uri/http.rb +0 -1
  159. data/lib/bundler/vendor/uri/lib/uri/https.rb +0 -1
  160. data/lib/bundler/vendor/uri/lib/uri/ldap.rb +1 -1
  161. data/lib/bundler/vendor/uri/lib/uri/mailto.rb +0 -1
  162. data/lib/bundler/vendor/uri/lib/uri/rfc2396_parser.rb +1 -14
  163. data/lib/bundler/vendor/uri/lib/uri/rfc3986_parser.rb +1 -12
  164. data/lib/bundler/vendor/uri/lib/uri/version.rb +1 -1
  165. data/lib/bundler/vendor/uri/lib/uri/ws.rb +84 -0
  166. data/lib/bundler/vendor/uri/lib/uri/wss.rb +22 -0
  167. data/lib/bundler/vendor/uri/lib/uri.rb +0 -1
  168. data/lib/bundler/vendored_tsort.rb +4 -0
  169. data/lib/bundler/version.rb +1 -1
  170. data/lib/bundler/worker.rb +19 -4
  171. data/lib/bundler.rb +28 -31
  172. metadata +27 -9
  173. data/lib/bundler/gemdeps.rb +0 -29
  174. data/lib/bundler/vendor/connection_pool/lib/connection_pool/monotonic_time.rb +0 -66
@@ -17,15 +17,14 @@ module Bundler
17
17
  # ==== Returns
18
18
  # <GemBundle>,nil:: If the list of dependencies can be resolved, a
19
19
  # collection of gemspecs is returned. Otherwise, nil is returned.
20
- def self.resolve(requirements, index, source_requirements = {}, base = [], gem_version_promoter = GemVersionPromoter.new, additional_base_requirements = [], platforms = nil)
20
+ def self.resolve(requirements, source_requirements = {}, base = [], gem_version_promoter = GemVersionPromoter.new, additional_base_requirements = [], platforms = nil)
21
21
  base = SpecSet.new(base) unless base.is_a?(SpecSet)
22
- resolver = new(index, source_requirements, base, gem_version_promoter, additional_base_requirements, platforms)
22
+ resolver = new(source_requirements, base, gem_version_promoter, additional_base_requirements, platforms)
23
23
  result = resolver.start(requirements)
24
- SpecSet.new(result)
24
+ SpecSet.new(SpecSet.new(result).for(requirements.reject{|dep| dep.name.end_with?("\0") }))
25
25
  end
26
26
 
27
- def initialize(index, source_requirements, base, gem_version_promoter, additional_base_requirements, platforms)
28
- @index = index
27
+ def initialize(source_requirements, base, gem_version_promoter, additional_base_requirements, platforms)
29
28
  @source_requirements = source_requirements
30
29
  @base = base
31
30
  @resolver = Molinillo::Resolver.new(self, self)
@@ -40,10 +39,6 @@ module Bundler
40
39
  @resolving_only_for_ruby = platforms == [Gem::Platform::RUBY]
41
40
  @gem_version_promoter = gem_version_promoter
42
41
  @use_gvp = Bundler.feature_flag.use_gem_version_promoter_for_major_updates? || !@gem_version_promoter.major?
43
- @lockfile_uses_separate_rubygems_sources = Bundler.feature_flag.disable_multisource?
44
-
45
- @variant_specific_names = []
46
- @generic_names = ["Ruby\0", "RubyGems\0"]
47
42
  end
48
43
 
49
44
  def start(requirements)
@@ -53,7 +48,6 @@ module Bundler
53
48
  verify_gemfile_dependencies_are_found!(requirements)
54
49
  dg = @resolver.resolve(requirements, @base_dg)
55
50
  dg.
56
- tap {|resolved| validate_resolved_specs!(resolved) }.
57
51
  map(&:payload).
58
52
  reject {|sg| sg.name.end_with?("\0") }.
59
53
  map(&:to_specs).
@@ -107,26 +101,15 @@ module Bundler
107
101
  include Molinillo::SpecificationProvider
108
102
 
109
103
  def dependencies_for(specification)
110
- all_dependencies = specification.dependencies_for_activated_platforms
111
-
112
- if @variant_specific_names.include?(specification.name)
113
- @variant_specific_names |= all_dependencies.map(&:name) - @generic_names
114
- else
115
- generic_names, variant_specific_names = specification.partitioned_dependency_names_for_activated_platforms
116
- @variant_specific_names |= variant_specific_names - @generic_names
117
- @generic_names |= generic_names
118
- end
119
-
120
- all_dependencies
104
+ specification.dependencies_for_activated_platforms
121
105
  end
122
106
 
123
107
  def search_for(dependency_proxy)
124
108
  platform = dependency_proxy.__platform
125
109
  dependency = dependency_proxy.dep
126
110
  name = dependency.name
127
- search_result = @search_for[dependency_proxy] ||= begin
128
- index = index_for(dependency)
129
- results = index.search(dependency, @base[name])
111
+ @search_for[dependency_proxy] ||= begin
112
+ results = results_for(dependency, @base[name])
130
113
 
131
114
  if vertex = @base_dg.vertex_named(name)
132
115
  locked_requirement = vertex.payload.requirement
@@ -151,6 +134,7 @@ module Bundler
151
134
  end
152
135
  nested.reduce([]) do |groups, (version, specs)|
153
136
  next groups if locked_requirement && !locked_requirement.satisfied_by?(version)
137
+ next groups unless specs.any? {|spec| spec.match_platform(platform) }
154
138
 
155
139
  specs_by_platform = Hash.new do |current_specs, current_platform|
156
140
  current_specs[current_platform] = select_best_platform_match(specs, current_platform)
@@ -162,7 +146,7 @@ module Bundler
162
146
  next groups if @resolving_only_for_ruby
163
147
 
164
148
  spec_group = SpecGroup.create_for(specs_by_platform, @platforms, platform)
165
- groups << spec_group if spec_group
149
+ groups << spec_group
166
150
 
167
151
  groups
168
152
  end
@@ -177,39 +161,18 @@ module Bundler
177
161
  @gem_version_promoter.sort_versions(dependency, spec_groups)
178
162
  end
179
163
  end
164
+ end
180
165
 
181
- unless search_result.empty?
182
- specific_dependency = @variant_specific_names.include?(name)
183
- return search_result unless specific_dependency
184
-
185
- search_result.each do |sg|
186
- if @generic_names.include?(name)
187
- @variant_specific_names -= [name]
188
- sg.activate_all_platforms!
189
- else
190
- sg.activate_platform!(platform)
191
- end
192
- end
193
- end
166
+ def index_for(dependency)
167
+ source_for(dependency.name).specs
168
+ end
194
169
 
195
- search_result
170
+ def source_for(name)
171
+ @source_requirements[name] || @source_requirements[:default]
196
172
  end
197
173
 
198
- def index_for(dependency)
199
- source = @source_requirements[dependency.name]
200
- if source
201
- source.specs
202
- elsif @lockfile_uses_separate_rubygems_sources
203
- Index.build do |idx|
204
- if dependency.all_sources
205
- dependency.all_sources.each {|s| idx.add_source(s.specs) if s }
206
- else
207
- idx.add_source @source_requirements[:default].specs
208
- end
209
- end
210
- else
211
- @index
212
- end
174
+ def results_for(dependency, base)
175
+ index_for(dependency).search(dependency, base)
213
176
  end
214
177
 
215
178
  def name_for(dependency)
@@ -236,19 +199,8 @@ module Bundler
236
199
  dependencies.map(&:dep) == other_dependencies.map(&:dep)
237
200
  end
238
201
 
239
- def relevant_sources_for_vertex(vertex)
240
- if vertex.root?
241
- [@source_requirements[vertex.name]]
242
- elsif @lockfile_uses_separate_rubygems_sources
243
- vertex.recursive_predecessors.map do |v|
244
- @source_requirements[v.name]
245
- end << @source_requirements[:default]
246
- end
247
- end
248
-
249
202
  def sort_dependencies(dependencies, activated, conflicts)
250
203
  dependencies.sort_by do |dependency|
251
- dependency.all_sources = relevant_sources_for_vertex(activated.vertex_named(dependency.name))
252
204
  name = name_for(dependency)
253
205
  vertex = activated.vertex_named(name)
254
206
  [
@@ -297,16 +249,11 @@ module Bundler
297
249
  end
298
250
 
299
251
  def verify_gemfile_dependencies_are_found!(requirements)
300
- requirements.each do |requirement|
252
+ requirements.map! do |requirement|
301
253
  name = requirement.name
302
- next if name == "bundler"
303
- next unless search_for(requirement).empty?
304
-
305
- cache_message = begin
306
- " or in gems cached in #{Bundler.settings.app_cache_path}" if Bundler.app_cache.exist?
307
- rescue GemfileNotFound
308
- nil
309
- end
254
+ next requirement if name == "bundler"
255
+ next requirement unless search_for(requirement).empty?
256
+ next unless requirement.current_platform?
310
257
 
311
258
  if (base = @base[name]) && !base.empty?
312
259
  version = base.first.version
@@ -316,32 +263,38 @@ module Bundler
316
263
  "Try running `bundle update #{name}`\n\n" \
317
264
  "If you are updating multiple gems in your Gemfile at once,\n" \
318
265
  "try passing them all to `bundle update`"
319
- elsif source = @source_requirements[name]
320
- specs = source.specs[name]
321
- versions_with_platforms = specs.map {|s| [s.version, s.platform] }
322
- message = String.new("Could not find gem '#{SharedHelpers.pretty_dependency(requirement)}' in #{source}#{cache_message}.\n")
323
- message << if versions_with_platforms.any?
324
- "The source contains the following versions of '#{name}': #{formatted_versions_with_platforms(versions_with_platforms)}"
325
- else
326
- "The source does not contain any versions of '#{name}'"
327
- end
328
266
  else
329
- message = "Could not find gem '#{requirement}' in any of the gem sources " \
330
- "listed in your Gemfile#{cache_message}."
267
+ message = gem_not_found_message(name, requirement, source_for(name))
331
268
  end
332
269
  raise GemNotFound, message
333
- end
270
+ end.compact!
334
271
  end
335
272
 
336
- def formatted_versions_with_platforms(versions_with_platforms)
337
- version_platform_strs = versions_with_platforms.map do |vwp|
338
- version = vwp.first
339
- platform = vwp.last
340
- version_platform_str = String.new(version.to_s)
341
- version_platform_str << " #{platform}" unless platform.nil? || platform == Gem::Platform::RUBY
342
- version_platform_str
273
+ def gem_not_found_message(name, requirement, source, extra_message = "")
274
+ specs = source.specs.search(name)
275
+ matching_part = name
276
+ requirement_label = SharedHelpers.pretty_dependency(requirement)
277
+ cache_message = begin
278
+ " or in gems cached in #{Bundler.settings.app_cache_path}" if Bundler.app_cache.exist?
279
+ rescue GemfileNotFound
280
+ nil
281
+ end
282
+ specs_matching_requirement = specs.select {| spec| requirement.matches_spec?(spec) }
283
+
284
+ if specs_matching_requirement.any?
285
+ specs = specs_matching_requirement
286
+ matching_part = requirement_label
287
+ requirement_label = "#{requirement_label} #{requirement.__platform}"
343
288
  end
344
- version_platform_strs.join(", ")
289
+
290
+ message = String.new("Could not find gem '#{requirement_label}'#{extra_message} in #{source}#{cache_message}.\n")
291
+
292
+ if specs.any?
293
+ message << "\nThe source contains the following gems matching '#{matching_part}':\n"
294
+ message << specs.map {|s| " * #{s.full_name}" }.join("\n")
295
+ end
296
+
297
+ message
345
298
  end
346
299
 
347
300
  def version_conflict_message(e)
@@ -392,7 +345,7 @@ module Bundler
392
345
  if other_bundler_required
393
346
  o << "\n\n"
394
347
 
395
- candidate_specs = @source_requirements[:default_bundler].specs.search(conflict_dependency)
348
+ candidate_specs = source_for(:default_bundler).specs.search(conflict_dependency)
396
349
  if candidate_specs.any?
397
350
  target_version = candidate_specs.last.version
398
351
  new_command = [File.basename($PROGRAM_NAME), "_#{target_version}_", *ARGV].join(" ")
@@ -406,39 +359,18 @@ module Bundler
406
359
  o << "\n"
407
360
  o << %(Running `bundle update` will rebuild your snapshot from scratch, using only\n)
408
361
  o << %(the gems in your Gemfile, which may resolve the conflict.\n)
409
- elsif !conflict.existing
362
+ elsif !conflict.existing && !name.end_with?("\0")
410
363
  o << "\n"
411
364
 
412
- relevant_sources = if conflict.requirement.source
413
- [conflict.requirement.source]
414
- elsif conflict.requirement.all_sources
415
- conflict.requirement.all_sources
416
- elsif @lockfile_uses_separate_rubygems_sources
417
- # every conflict should have an explicit group of sources when we
418
- # enforce strict pinning
419
- raise "no source set for #{conflict}"
420
- else
421
- []
422
- end.compact.map(&:to_s).uniq.sort
423
-
424
- metadata_requirement = name.end_with?("\0")
365
+ relevant_source = conflict.requirement.source || source_for(name)
425
366
 
426
- o << "Could not find gem '" unless metadata_requirement
427
- o << SharedHelpers.pretty_dependency(conflict.requirement)
428
- o << "'" unless metadata_requirement
429
- if conflict.requirement_trees.first.size > 1
430
- o << ", which is required by "
431
- o << "gem '#{SharedHelpers.pretty_dependency(conflict.requirement_trees.first[-2])}',"
432
- end
433
- o << " "
434
-
435
- o << if relevant_sources.empty?
436
- "in any of the sources.\n"
437
- elsif metadata_requirement
438
- "is not available in #{relevant_sources.join(" or ")}"
367
+ extra_message = if conflict.requirement_trees.first.size > 1
368
+ ", which is required by gem '#{SharedHelpers.pretty_dependency(conflict.requirement_trees.first[-2])}',"
439
369
  else
440
- "in any of the relevant sources:\n #{relevant_sources * "\n "}\n"
370
+ ""
441
371
  end
372
+
373
+ o << gem_not_found_message(name, conflict.requirement, relevant_source, extra_message)
442
374
  end
443
375
  end,
444
376
  :version_for_spec => lambda {|spec| spec.version },
@@ -451,29 +383,5 @@ module Bundler
451
383
  end
452
384
  )
453
385
  end
454
-
455
- def validate_resolved_specs!(resolved_specs)
456
- resolved_specs.each do |v|
457
- name = v.name
458
- next unless sources = relevant_sources_for_vertex(v)
459
- sources.compact!
460
- if default_index = sources.index(@source_requirements[:default])
461
- sources.delete_at(default_index)
462
- end
463
- sources.reject! {|s| s.specs[name].empty? }
464
- sources.uniq!
465
- next if sources.size <= 1
466
-
467
- multisource_disabled = Bundler.feature_flag.disable_multisource?
468
-
469
- msg = ["The gem '#{name}' was found in multiple relevant sources."]
470
- msg.concat sources.map {|s| " * #{s}" }.sort
471
- msg << "You #{multisource_disabled ? :must : :should} add this gem to the source block for the source you wish it to be installed from."
472
- msg = msg.join("\n")
473
-
474
- raise SecurityError, msg if multisource_disabled
475
- Bundler.ui.warn "Warning: #{msg}"
476
- end
477
- end
478
386
  end
479
387
  end
data/lib/bundler/retry.rb CHANGED
@@ -49,7 +49,7 @@ module Bundler
49
49
  raise e
50
50
  end
51
51
  return true unless name
52
- Bundler.ui.info "" unless Bundler.ui.debug? # Add new line incase dots preceded this
52
+ Bundler.ui.info "" unless Bundler.ui.debug? # Add new line in case dots preceded this
53
53
  Bundler.ui.warn "Retrying #{name} due to error (#{current_run.next}/#{total_runs}): #{e.class} #{e.message}", Bundler.ui.debug?
54
54
  end
55
55
 
@@ -103,7 +103,7 @@ module Bundler
103
103
 
104
104
  def self.system
105
105
  ruby_engine = RUBY_ENGINE.dup
106
- ruby_version = ENV.fetch("BUNDLER_SPEC_RUBY_VERSION") { RUBY_VERSION }.dup
106
+ ruby_version = RUBY_VERSION.dup
107
107
  ruby_engine_version = RUBY_ENGINE_VERSION.dup
108
108
  patchlevel = RUBY_PATCHLEVEL.to_s
109
109
 
@@ -85,6 +85,10 @@ module Gem
85
85
  dependencies - development_dependencies
86
86
  end
87
87
 
88
+ def deleted_gem?
89
+ !default_gem? && !File.directory?(full_gem_path)
90
+ end
91
+
88
92
  private
89
93
 
90
94
  def dependencies_to_gemfile(dependencies, group = nil)
@@ -105,7 +109,7 @@ module Gem
105
109
  end
106
110
 
107
111
  class Dependency
108
- attr_accessor :source, :groups, :all_sources
112
+ attr_accessor :source, :groups
109
113
 
110
114
  alias_method :eql?, :==
111
115
 
@@ -116,7 +120,7 @@ module Gem
116
120
  end
117
121
 
118
122
  def to_yaml_properties
119
- instance_variables.reject {|p| ["@source", "@groups", "@all_sources"].include?(p.to_s) }
123
+ instance_variables.reject {|p| ["@source", "@groups"].include?(p.to_s) }
120
124
  end
121
125
 
122
126
  def to_lock
@@ -134,6 +138,8 @@ module Gem
134
138
  class Requirement
135
139
  module OrderIndependentComparison
136
140
  def ==(other)
141
+ return unless Gem::Requirement === other
142
+
137
143
  if _requirements_sorted? && other._requirements_sorted?
138
144
  super
139
145
  else
@@ -174,20 +180,36 @@ module Gem
174
180
  end
175
181
  end
176
182
 
183
+ require "rubygems/platform"
184
+
177
185
  class Platform
178
186
  JAVA = Gem::Platform.new("java") unless defined?(JAVA)
179
187
  MSWIN = Gem::Platform.new("mswin32") unless defined?(MSWIN)
180
188
  MSWIN64 = Gem::Platform.new("mswin64") unless defined?(MSWIN64)
181
189
  MINGW = Gem::Platform.new("x86-mingw32") unless defined?(MINGW)
182
190
  X64_MINGW = Gem::Platform.new("x64-mingw32") unless defined?(X64_MINGW)
191
+ end
183
192
 
184
- undef_method :hash if method_defined? :hash
185
- def hash
186
- @cpu.hash ^ @os.hash ^ @version.hash
187
- end
193
+ Platform.singleton_class.module_eval do
194
+ unless Platform.singleton_methods.include?(:match_spec?)
195
+ def match_spec?(spec)
196
+ match_gem?(spec.platform, spec.name)
197
+ end
188
198
 
189
- undef_method :eql? if method_defined? :eql?
190
- alias_method :eql?, :==
199
+ def match_gem?(platform, gem_name)
200
+ match_platforms?(platform, Gem.platforms)
201
+ end
202
+
203
+ private
204
+
205
+ def match_platforms?(platform, platforms)
206
+ platforms.any? do |local_platform|
207
+ platform.nil? ||
208
+ local_platform == platform ||
209
+ (local_platform != Gem::Platform::RUBY && local_platform =~ platform)
210
+ end
211
+ end
212
+ end
191
213
  end
192
214
 
193
215
  require "rubygems/util"
@@ -8,13 +8,68 @@ module Bundler
8
8
  # Bundler needs to install gems regardless of binstub overwriting
9
9
  end
10
10
 
11
+ def install
12
+ pre_install_checks
13
+
14
+ run_pre_install_hooks
15
+
16
+ spec.loaded_from = spec_file
17
+
18
+ # Completely remove any previous gem files
19
+ strict_rm_rf gem_dir
20
+ strict_rm_rf spec.extension_dir
21
+
22
+ SharedHelpers.filesystem_access(gem_dir, :create) do
23
+ FileUtils.mkdir_p gem_dir, :mode => 0o755
24
+ end
25
+
26
+ extract_files
27
+
28
+ build_extensions
29
+ write_build_info_file
30
+ run_post_build_hooks
31
+
32
+ generate_bin
33
+ generate_plugins
34
+
35
+ write_spec
36
+
37
+ SharedHelpers.filesystem_access("#{gem_home}/cache", :write) do
38
+ write_cache_file
39
+ end
40
+
41
+ say spec.post_install_message unless spec.post_install_message.nil?
42
+
43
+ run_post_install_hooks
44
+
45
+ spec
46
+ end
47
+
48
+ def generate_plugins
49
+ return unless Gem::Installer.instance_methods(false).include?(:generate_plugins)
50
+
51
+ latest = Gem::Specification.stubs_for(spec.name).first
52
+ return if latest && latest.version > spec.version
53
+
54
+ ensure_writable_dir @plugins_dir
55
+
56
+ if spec.plugins.empty?
57
+ remove_plugins_for(spec, @plugins_dir)
58
+ else
59
+ regenerate_plugins_for(spec, @plugins_dir)
60
+ end
61
+ end
62
+
11
63
  def pre_install_checks
12
64
  super && validate_bundler_checksum(options[:bundler_expected_checksum])
13
65
  end
14
66
 
15
67
  def build_extensions
16
68
  extension_cache_path = options[:bundler_extension_cache_path]
17
- return super unless extension_cache_path && extension_dir = spec.extension_dir
69
+ unless extension_cache_path && extension_dir = spec.extension_dir
70
+ require "shellwords" unless Bundler.rubygems.provides?(">= 3.2.25")
71
+ return super
72
+ end
18
73
 
19
74
  extension_dir = Pathname.new(extension_dir)
20
75
  build_complete = SharedHelpers.filesystem_access(extension_cache_path.join("gem.build_complete"), :read, &:file?)
@@ -24,6 +79,7 @@ module Bundler
24
79
  FileUtils.cp_r extension_cache_path, spec.extension_dir
25
80
  end
26
81
  else
82
+ require "shellwords" # compensate missing require in rubygems before version 3.2.25
27
83
  super
28
84
  if extension_dir.directory? # not made for gems without extensions
29
85
  SharedHelpers.filesystem_access(extension_cache_path.parent, &:mkpath)
@@ -36,6 +92,17 @@ module Bundler
36
92
 
37
93
  private
38
94
 
95
+ def strict_rm_rf(dir)
96
+ # FileUtils.rm_rf should probably rise in case of permission issues like
97
+ # `rm -rf` does. However, it fails to delete the folder silently due to
98
+ # https://github.com/ruby/fileutils/issues/57. It should probably be fixed
99
+ # inside `fileutils` but for now I`m checking whether the folder was
100
+ # removed after it completes, and raising otherwise.
101
+ FileUtils.rm_rf dir
102
+
103
+ raise PermissionError.new(dir, :delete) if File.directory?(dir)
104
+ end
105
+
39
106
  def validate_bundler_checksum(checksum)
40
107
  return true if Bundler.settings[:disable_checksum_validation]
41
108
  return true unless checksum