rubygems-update 3.2.3 → 3.2.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (116) hide show
  1. checksums.yaml +4 -4
  2. data/{History.txt → CHANGELOG.md} +480 -427
  3. data/Manifest.txt +30 -27
  4. data/Rakefile +20 -28
  5. data/bundler/CHANGELOG.md +73 -2
  6. data/bundler/bundler.gemspec +1 -1
  7. data/bundler/lib/bundler.rb +0 -1
  8. data/bundler/lib/bundler/build_metadata.rb +2 -2
  9. data/bundler/lib/bundler/cli.rb +3 -5
  10. data/bundler/lib/bundler/cli/cache.rb +1 -0
  11. data/bundler/lib/bundler/cli/gem.rb +14 -0
  12. data/bundler/lib/bundler/compact_index_client/updater.rb +0 -8
  13. data/bundler/lib/bundler/definition.rb +17 -27
  14. data/bundler/lib/bundler/dep_proxy.rb +15 -8
  15. data/bundler/lib/bundler/feature_flag.rb +0 -1
  16. data/bundler/lib/bundler/fetcher.rb +0 -1
  17. data/bundler/lib/bundler/gem_helper.rb +9 -7
  18. data/bundler/lib/bundler/gem_version_promoter.rb +2 -2
  19. data/bundler/lib/bundler/index.rb +6 -5
  20. data/bundler/lib/bundler/installer.rb +0 -17
  21. data/bundler/lib/bundler/installer/standalone.rb +15 -0
  22. data/bundler/lib/bundler/lazy_specification.rb +9 -18
  23. data/bundler/{man → lib/bundler/man}/bundle-add.1 +1 -1
  24. data/bundler/{man → lib/bundler/man}/bundle-binstubs.1 +1 -1
  25. data/bundler/{man → lib/bundler/man}/bundle-cache.1 +1 -1
  26. data/bundler/{man → lib/bundler/man}/bundle-check.1 +1 -1
  27. data/bundler/{man → lib/bundler/man}/bundle-clean.1 +1 -1
  28. data/bundler/{man → lib/bundler/man}/bundle-config.1 +4 -4
  29. data/bundler/lib/bundler/man/bundle-config.1.ronn +3 -3
  30. data/bundler/{man → lib/bundler/man}/bundle-doctor.1 +1 -1
  31. data/bundler/{man → lib/bundler/man}/bundle-exec.1 +1 -1
  32. data/bundler/{man → lib/bundler/man}/bundle-gem.1 +1 -1
  33. data/bundler/{man → lib/bundler/man}/bundle-info.1 +1 -1
  34. data/bundler/{man → lib/bundler/man}/bundle-init.1 +1 -1
  35. data/bundler/{man → lib/bundler/man}/bundle-inject.1 +1 -1
  36. data/bundler/{man → lib/bundler/man}/bundle-install.1 +1 -1
  37. data/bundler/{man → lib/bundler/man}/bundle-list.1 +1 -1
  38. data/bundler/{man → lib/bundler/man}/bundle-lock.1 +1 -1
  39. data/bundler/{man → lib/bundler/man}/bundle-open.1 +1 -1
  40. data/bundler/{man → lib/bundler/man}/bundle-outdated.1 +1 -1
  41. data/bundler/{man → lib/bundler/man}/bundle-platform.1 +1 -1
  42. data/bundler/{man → lib/bundler/man}/bundle-pristine.1 +1 -1
  43. data/bundler/{man → lib/bundler/man}/bundle-remove.1 +1 -1
  44. data/bundler/{man → lib/bundler/man}/bundle-show.1 +1 -1
  45. data/bundler/{man → lib/bundler/man}/bundle-update.1 +1 -1
  46. data/bundler/{man → lib/bundler/man}/bundle-viz.1 +1 -1
  47. data/bundler/{man → lib/bundler/man}/bundle.1 +1 -1
  48. data/bundler/{man → lib/bundler/man}/gemfile.5 +1 -1
  49. data/bundler/{man → lib/bundler/man}/index.txt +0 -0
  50. data/bundler/lib/bundler/resolver.rb +82 -43
  51. data/bundler/lib/bundler/resolver/spec_group.rb +56 -44
  52. data/bundler/lib/bundler/rubygems_ext.rb +16 -0
  53. data/bundler/lib/bundler/settings.rb +1 -1
  54. data/bundler/lib/bundler/shared_helpers.rb +2 -2
  55. data/bundler/lib/bundler/source/git.rb +19 -17
  56. data/bundler/lib/bundler/source/git/git_proxy.rb +54 -49
  57. data/bundler/lib/bundler/source/path/installer.rb +2 -0
  58. data/bundler/lib/bundler/source/rubygems.rb +10 -2
  59. data/bundler/lib/bundler/source_list.rb +2 -4
  60. data/bundler/lib/bundler/spec_set.rb +5 -4
  61. data/bundler/lib/bundler/templates/newgem/CHANGELOG.md.tt +5 -0
  62. data/bundler/lib/bundler/templates/newgem/Gemfile.tt +1 -1
  63. data/bundler/lib/bundler/templates/newgem/newgem.gemspec.tt +1 -1
  64. data/bundler/lib/bundler/templates/newgem/rubocop.yml.tt +3 -0
  65. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/delegates/specification_provider.rb +7 -0
  66. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph.rb +0 -1
  67. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/vertex.rb +11 -5
  68. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/errors.rb +2 -2
  69. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/modules/specification_provider.rb +11 -0
  70. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/resolution.rb +11 -7
  71. data/bundler/lib/bundler/vendor/thor/lib/thor.rb +5 -6
  72. data/bundler/lib/bundler/vendor/thor/lib/thor/actions.rb +1 -1
  73. data/bundler/lib/bundler/vendor/thor/lib/thor/actions/file_manipulation.rb +4 -2
  74. data/bundler/lib/bundler/vendor/thor/lib/thor/error.rb +1 -1
  75. data/bundler/lib/bundler/vendor/thor/lib/thor/parser/arguments.rb +5 -1
  76. data/bundler/lib/bundler/vendor/thor/lib/thor/parser/options.rb +9 -8
  77. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/basic.rb +5 -2
  78. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/color.rb +5 -1
  79. data/bundler/lib/bundler/vendor/thor/lib/thor/version.rb +1 -1
  80. data/bundler/lib/bundler/version.rb +1 -1
  81. data/lib/rubygems.rb +2 -2
  82. data/lib/rubygems/commands/setup_command.rb +16 -62
  83. data/lib/rubygems/ext/builder.rb +5 -4
  84. data/lib/rubygems/ext/cmake_builder.rb +1 -2
  85. data/lib/rubygems/ext/configure_builder.rb +1 -2
  86. data/lib/rubygems/installer_uninstaller_utils.rb +6 -1
  87. data/lib/rubygems/platform.rb +0 -4
  88. data/lib/rubygems/remote_fetcher.rb +3 -1
  89. data/lib/rubygems/requirement.rb +1 -1
  90. data/lib/rubygems/resolver/best_set.rb +1 -1
  91. data/lib/rubygems/resolver/index_specification.rb +8 -2
  92. data/lib/rubygems/resolver/molinillo/lib/molinillo/delegates/specification_provider.rb +7 -0
  93. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph.rb +0 -1
  94. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/vertex.rb +11 -5
  95. data/lib/rubygems/resolver/molinillo/lib/molinillo/errors.rb +2 -2
  96. data/lib/rubygems/resolver/molinillo/lib/molinillo/modules/specification_provider.rb +11 -0
  97. data/lib/rubygems/resolver/molinillo/lib/molinillo/resolution.rb +11 -7
  98. data/lib/rubygems/specification.rb +18 -14
  99. data/lib/rubygems/test_case.rb +17 -4
  100. data/rubygems-update.gemspec +2 -2
  101. data/test/rubygems/data/null-required-ruby-version.gemspec.rz +0 -0
  102. data/test/rubygems/data/null-required-rubygems-version.gemspec.rz +0 -0
  103. data/test/rubygems/test_gem.rb +5 -0
  104. data/test/rubygems/test_gem_commands_setup_command.rb +21 -37
  105. data/test/rubygems/test_gem_dependency_installer.rb +52 -47
  106. data/test/rubygems/test_gem_ext_builder.rb +30 -6
  107. data/test/rubygems/test_gem_ext_cmake_builder.rb +2 -4
  108. data/test/rubygems/test_gem_ext_configure_builder.rb +2 -2
  109. data/test/rubygems/test_gem_installer.rb +2 -0
  110. data/test/rubygems/test_gem_platform.rb +8 -0
  111. data/test/rubygems/test_gem_remote_fetcher.rb +1 -1
  112. data/test/rubygems/test_gem_requirement.rb +35 -1
  113. data/test/rubygems/test_gem_resolver_best_set.rb +23 -0
  114. data/test/rubygems/test_gem_specification.rb +9 -3
  115. data/test/rubygems/test_gem_stream_ui.rb +1 -1
  116. metadata +34 -55
@@ -28,16 +28,17 @@ class Gem::Ext::Builder
28
28
  unless make_program
29
29
  make_program = (/mswin/ =~ RUBY_PLATFORM) ? 'nmake' : 'make'
30
30
  end
31
+ make_program = Shellwords.split(make_program)
31
32
 
32
- destdir = '"DESTDIR=%s"' % ENV['DESTDIR']
33
+ destdir = 'DESTDIR=%s' % ENV['DESTDIR']
33
34
 
34
35
  ['clean', '', 'install'].each do |target|
35
36
  # Pass DESTDIR via command line to override what's in MAKEFLAGS
36
37
  cmd = [
37
- make_program,
38
+ *make_program,
38
39
  destdir,
39
40
  target,
40
- ].join(' ').rstrip
41
+ ].reject(&:empty?)
41
42
  begin
42
43
  run(cmd, results, "make #{target}".rstrip, make_dir)
43
44
  rescue Gem::InstallError
@@ -56,7 +57,7 @@ class Gem::Ext::Builder
56
57
  p(command)
57
58
  end
58
59
  results << "current directory: #{dir}"
59
- results << (command.respond_to?(:shelljoin) ? command.shelljoin : command)
60
+ results << command.shelljoin
60
61
 
61
62
  require "open3"
62
63
  # Set $SOURCE_DATE_EPOCH for the subprocess.
@@ -4,8 +4,7 @@ require_relative '../command'
4
4
  class Gem::Ext::CmakeBuilder < Gem::Ext::Builder
5
5
  def self.build(extension, dest_path, results, args=[], lib_dir=nil, cmake_dir=Dir.pwd)
6
6
  unless File.exist?(File.join(cmake_dir, 'Makefile'))
7
- cmd = "cmake . -DCMAKE_INSTALL_PREFIX=#{dest_path}"
8
- cmd << " #{Gem::Command.build_args.join ' '}" unless Gem::Command.build_args.empty?
7
+ cmd = ["cmake", ".", "-DCMAKE_INSTALL_PREFIX=#{dest_path}", *Gem::Command.build_args]
9
8
 
10
9
  run cmd, results, class_name, cmake_dir
11
10
  end
@@ -8,8 +8,7 @@
8
8
  class Gem::Ext::ConfigureBuilder < Gem::Ext::Builder
9
9
  def self.build(extension, dest_path, results, args=[], lib_dir=nil, configure_dir=Dir.pwd)
10
10
  unless File.exist?(File.join(configure_dir, 'Makefile'))
11
- cmd = "sh ./configure --prefix=#{dest_path}"
12
- cmd << " #{args.join ' '}" unless args.empty?
11
+ cmd = ["sh", "./configure", "--prefix=#{dest_path}", *args]
13
12
 
14
13
  run cmd, results, class_name, configure_dir
15
14
  end
@@ -6,11 +6,16 @@
6
6
  module Gem::InstallerUninstallerUtils
7
7
 
8
8
  def regenerate_plugins_for(spec, plugins_dir)
9
+ plugins = spec.plugins
10
+ return if plugins.empty?
11
+
12
+ require 'pathname'
13
+
9
14
  spec.plugins.each do |plugin|
10
15
  plugin_script_path = File.join plugins_dir, "#{spec.name}_plugin#{File.extname(plugin)}"
11
16
 
12
17
  File.open plugin_script_path, 'wb' do |file|
13
- file.puts "require '#{plugin}'"
18
+ file.puts "require_relative '#{Pathname.new(plugin).relative_path_from(Pathname.new(plugins_dir))}'"
14
19
  end
15
20
 
16
21
  verbose plugin_script_path
@@ -121,10 +121,6 @@ class Gem::Platform
121
121
  end
122
122
  end
123
123
 
124
- def inspect
125
- "%s @cpu=%p, @os=%p, @version=%p>" % [super[0..-2], *to_a]
126
- end
127
-
128
124
  def to_a
129
125
  [@cpu, @os, @version]
130
126
  end
@@ -26,13 +26,15 @@ class Gem::RemoteFetcher
26
26
  ##
27
27
  # The URI which was being accessed when the exception happened.
28
28
 
29
- attr_accessor :uri
29
+ attr_accessor :uri, :original_uri
30
30
 
31
31
  def initialize(message, uri)
32
32
  super message
33
33
 
34
34
  uri = parse_uri(uri)
35
35
 
36
+ @original_uri = uri.dup
37
+
36
38
  uri.password = 'REDACTED' if uri.respond_to?(:password) && uri.password
37
39
 
38
40
  @uri = uri.to_s
@@ -190,7 +190,7 @@ class Gem::Requirement
190
190
  end
191
191
 
192
192
  def hash # :nodoc:
193
- requirements.sort.hash
193
+ requirements.map {|r| r.first == "~>" ? [r[0], r[1].to_s] : r }.sort.hash
194
194
  end
195
195
 
196
196
  def marshal_dump # :nodoc:
@@ -58,7 +58,7 @@ class Gem::Resolver::BestSet < Gem::Resolver::ComposedSet
58
58
  # The calling method must retry the exception to repeat the lookup.
59
59
 
60
60
  def replace_failed_api_set(error) # :nodoc:
61
- uri = error.uri
61
+ uri = error.original_uri
62
62
  uri = URI uri unless URI === uri
63
63
  uri = uri + "."
64
64
 
@@ -35,17 +35,23 @@ class Gem::Resolver::IndexSpecification < Gem::Resolver::Specification
35
35
 
36
36
  ##
37
37
  # The required_ruby_version constraint for this specification
38
+ #
39
+ # A fallback is included because when generated, some marshalled specs have it
40
+ # set to +nil+.
38
41
 
39
42
  def required_ruby_version
40
- spec.required_ruby_version
43
+ spec.required_ruby_version || Gem::Requirement.default
41
44
  end
42
45
 
43
46
  ##
44
47
  # The required_rubygems_version constraint for this specification
45
48
  #
49
+ # A fallback is included because the original version of the specification
50
+ # API didn't include that field, so some marshalled specs in the index have it
51
+ # set to +nil+.
46
52
 
47
53
  def required_rubygems_version
48
- spec.required_rubygems_version
54
+ spec.required_rubygems_version || Gem::Requirement.default
49
55
  end
50
56
 
51
57
  def ==(other)
@@ -26,6 +26,13 @@ module Gem::Resolver::Molinillo
26
26
  end
27
27
  end
28
28
 
29
+ # (see Gem::Resolver::Molinillo::SpecificationProvider#dependencies_equal?)
30
+ def dependencies_equal?(dependencies, other_dependencies)
31
+ with_no_such_dependency_error_handling do
32
+ specification_provider.dependencies_equal?(dependencies, other_dependencies)
33
+ end
34
+ end
35
+
29
36
  # (see Gem::Resolver::Molinillo::SpecificationProvider#name_for)
30
37
  def name_for(dependency)
31
38
  with_no_such_dependency_error_handling do
@@ -1,6 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'set'
4
3
  require 'tsort'
5
4
 
6
5
  require_relative 'dependency_graph/log'
@@ -59,7 +59,7 @@ module Gem::Resolver::Molinillo
59
59
  # @param [Set<Vertex>] vertices the set to add the predecessors to
60
60
  # @return [Set<Vertex>] the vertices of {#graph} where `self` is a
61
61
  # {#descendent?}
62
- def _recursive_predecessors(vertices = Set.new)
62
+ def _recursive_predecessors(vertices = new_vertex_set)
63
63
  incoming_edges.each do |edge|
64
64
  vertex = edge.origin
65
65
  next unless vertices.add?(vertex)
@@ -85,7 +85,7 @@ module Gem::Resolver::Molinillo
85
85
  # @param [Set<Vertex>] vertices the set to add the successors to
86
86
  # @return [Set<Vertex>] the vertices of {#graph} where `self` is an
87
87
  # {#ancestor?}
88
- def _recursive_successors(vertices = Set.new)
88
+ def _recursive_successors(vertices = new_vertex_set)
89
89
  outgoing_edges.each do |edge|
90
90
  vertex = edge.destination
91
91
  next unless vertices.add?(vertex)
@@ -128,7 +128,7 @@ module Gem::Resolver::Molinillo
128
128
 
129
129
  # Is there a path from `self` to `other` following edges in the
130
130
  # dependency graph?
131
- # @return true iff there is a path following edges within this {#graph}
131
+ # @return whether there is a path following edges within this {#graph}
132
132
  def path_to?(other)
133
133
  _path_to?(other)
134
134
  end
@@ -138,7 +138,7 @@ module Gem::Resolver::Molinillo
138
138
  # @param [Vertex] other the vertex to check if there's a path to
139
139
  # @param [Set<Vertex>] visited the vertices of {#graph} that have been visited
140
140
  # @return [Boolean] whether there is a path to `other` from `self`
141
- def _path_to?(other, visited = Set.new)
141
+ def _path_to?(other, visited = new_vertex_set)
142
142
  return false unless visited.add?(self)
143
143
  return true if equal?(other)
144
144
  successors.any? { |v| v._path_to?(other, visited) }
@@ -147,12 +147,18 @@ module Gem::Resolver::Molinillo
147
147
 
148
148
  # Is there a path from `other` to `self` following edges in the
149
149
  # dependency graph?
150
- # @return true iff there is a path following edges within this {#graph}
150
+ # @return whether there is a path following edges within this {#graph}
151
151
  def ancestor?(other)
152
152
  other.path_to?(self)
153
153
  end
154
154
 
155
155
  alias is_reachable_from? ancestor?
156
+
157
+ def new_vertex_set
158
+ require 'set'
159
+ Set.new
160
+ end
161
+ private :new_vertex_set
156
162
  end
157
163
  end
158
164
  end
@@ -34,7 +34,7 @@ module Gem::Resolver::Molinillo
34
34
 
35
35
  # An error caused by attempting to fulfil a dependency that was circular
36
36
  #
37
- # @note This exception will be thrown iff a {Vertex} is added to a
37
+ # @note This exception will be thrown if and only if a {Vertex} is added to a
38
38
  # {DependencyGraph} that has a {DependencyGraph::Vertex#path_to?} an
39
39
  # existing {DependencyGraph::Vertex}
40
40
  class CircularDependencyError < ResolverError
@@ -121,7 +121,7 @@ module Gem::Resolver::Molinillo
121
121
  t = ''.dup
122
122
  depth = 2
123
123
  tree.each do |req|
124
- t << ' ' * depth << req.to_s
124
+ t << ' ' * depth << printable_requirement.call(req)
125
125
  unless tree.last == req
126
126
  if spec = conflict.activated_by_name[name_for(req)]
127
127
  t << %( was resolved to #{version_for_spec.call(spec)}, which)
@@ -45,6 +45,17 @@ module Gem::Resolver::Molinillo
45
45
  true
46
46
  end
47
47
 
48
+ # Determines whether two arrays of dependencies are equal, and thus can be
49
+ # grouped.
50
+ #
51
+ # @param [Array<Object>] dependencies
52
+ # @param [Array<Object>] other_dependencies
53
+ # @return [Boolean] whether `dependencies` and `other_dependencies` should
54
+ # be considered equal.
55
+ def dependencies_equal?(dependencies, other_dependencies)
56
+ dependencies == other_dependencies
57
+ end
58
+
48
59
  # Returns the name for the given `dependency`.
49
60
  # @note This method should be 'pure', i.e. the return value should depend
50
61
  # only on the `dependency` parameter.
@@ -329,11 +329,11 @@ module Gem::Resolver::Molinillo
329
329
 
330
330
  # Look for past conflicts that could be unwound to affect the
331
331
  # requirement tree for the current conflict
332
+ all_reqs = last_detail_for_current_unwind.all_requirements
333
+ all_reqs_size = all_reqs.size
332
334
  relevant_unused_unwinds = unused_unwind_options.select do |alternative|
333
- intersecting_requirements =
334
- last_detail_for_current_unwind.all_requirements &
335
- alternative.requirements_unwound_to_instead
336
- next if intersecting_requirements.empty?
335
+ diff_reqs = all_reqs - alternative.requirements_unwound_to_instead
336
+ next if diff_reqs.size == all_reqs_size
337
337
  # Find the highest index unwind whilst looping through
338
338
  current_detail = alternative if alternative > current_detail
339
339
  alternative
@@ -344,8 +344,12 @@ module Gem::Resolver::Molinillo
344
344
  state.unused_unwind_options += unwind_details.reject { |detail| detail.state_index == -1 }
345
345
 
346
346
  # Update the requirements_unwound_to_instead on any relevant unused unwinds
347
- relevant_unused_unwinds.each { |d| d.requirements_unwound_to_instead << current_detail.state_requirement }
348
- unwind_details.each { |d| d.requirements_unwound_to_instead << current_detail.state_requirement }
347
+ relevant_unused_unwinds.each do |d|
348
+ (d.requirements_unwound_to_instead << current_detail.state_requirement).uniq!
349
+ end
350
+ unwind_details.each do |d|
351
+ (d.requirements_unwound_to_instead << current_detail.state_requirement).uniq!
352
+ end
349
353
 
350
354
  current_detail
351
355
  end
@@ -803,7 +807,7 @@ module Gem::Resolver::Molinillo
803
807
 
804
808
  possibilities.reverse_each do |possibility|
805
809
  dependencies = dependencies_for(possibility)
806
- if current_possibility_set && current_possibility_set.dependencies == dependencies
810
+ if current_possibility_set && dependencies_equal?(current_possibility_set.dependencies, dependencies)
807
811
  current_possibility_set.possibilities.unshift(possibility)
808
812
  else
809
813
  possibility_sets.unshift(PossibilitySet.new(dependencies, [possibility]))
@@ -182,6 +182,7 @@ class Gem::Specification < Gem::BasicSpecification
182
182
  @@default_value[k].nil?
183
183
  end
184
184
 
185
+ @@stubs = nil
185
186
  @@stubs_by_name = {}
186
187
 
187
188
  # Sentinel object to represent "not found" stubs
@@ -800,10 +801,8 @@ class Gem::Specification < Gem::BasicSpecification
800
801
  def self.stubs
801
802
  @@stubs ||= begin
802
803
  pattern = "*.gemspec"
803
- stubs = installed_stubs(dirs, pattern) + default_stubs(pattern)
804
- stubs = stubs.uniq {|stub| stub.full_name }
804
+ stubs = stubs_for_pattern(pattern, false)
805
805
 
806
- _resort!(stubs)
807
806
  @@stubs_by_name = stubs.select {|s| Gem::Platform.match_spec? s }.group_by(&:name)
808
807
  stubs
809
808
  end
@@ -820,26 +819,31 @@ class Gem::Specification < Gem::BasicSpecification
820
819
  end
821
820
  end
822
821
 
823
- EMPTY = [].freeze # :nodoc:
824
-
825
822
  ##
826
823
  # Returns a Gem::StubSpecification for installed gem named +name+
827
824
  # only returns stubs that match Gem.platforms
828
825
 
829
826
  def self.stubs_for(name)
830
- if @@stubs_by_name[name]
831
- @@stubs_by_name[name]
827
+ if @@stubs
828
+ @@stubs_by_name[name] || []
832
829
  else
833
- pattern = "#{name}-*.gemspec"
834
- stubs = installed_stubs(dirs, pattern).select {|s| Gem::Platform.match_spec? s } + default_stubs(pattern)
835
- stubs = stubs.uniq {|stub| stub.full_name }.group_by(&:name)
836
- stubs.each_value {|v| _resort!(v) }
837
-
838
- @@stubs_by_name.merge! stubs
839
- @@stubs_by_name[name] ||= EMPTY
830
+ @@stubs_by_name[name] ||= stubs_for_pattern("#{name}-*.gemspec")
840
831
  end
841
832
  end
842
833
 
834
+ ##
835
+ # Finds stub specifications matching a pattern from the standard locations,
836
+ # optionally filtering out specs not matching the current platform
837
+ #
838
+ def self.stubs_for_pattern(pattern, match_platform = true) # :nodoc:
839
+ installed_stubs = installed_stubs(Gem::Specification.dirs, pattern)
840
+ installed_stubs.select! {|s| Gem::Platform.match_spec? s } if match_platform
841
+ stubs = installed_stubs + default_stubs(pattern)
842
+ stubs = stubs.uniq {|stub| stub.full_name }
843
+ _resort!(stubs)
844
+ stubs
845
+ end
846
+
843
847
  def self._resort!(specs) # :nodoc:
844
848
  specs.sort! do |a, b|
845
849
  names = a.name <=> b.name
@@ -26,7 +26,20 @@ begin
26
26
  rescue LoadError
27
27
  end
28
28
 
29
- require 'bundler'
29
+ if File.exist?(bundler_gemspec)
30
+ require_relative '../../bundler/lib/bundler'
31
+ else
32
+ require 'bundler'
33
+ end
34
+
35
+ # Enable server plugin needed for bisection
36
+ if ENV["RG_BISECT_SERVER_PLUGIN"]
37
+ require ENV["RG_BISECT_SERVER_PLUGIN"]
38
+
39
+ Minitest.extensions << "server"
40
+ end
41
+
42
+ ENV["MT_NO_PLUGINS"] = "true"
30
43
 
31
44
  require 'minitest/autorun'
32
45
 
@@ -250,16 +263,16 @@ class Gem::TestCase < Minitest::Test
250
263
  def assert_contains_make_command(target, output, msg = nil)
251
264
  if output.match(/\n/)
252
265
  msg = message(msg) do
253
- 'Expected output containing make command "%s": %s' % [
266
+ "Expected output containing make command \"%s\", but was \n\nBEGIN_OF_OUTPUT\n%sEND_OF_OUTPUT" % [
254
267
  ('%s %s' % [make_command, target]).rstrip,
255
- output.inspect,
268
+ output,
256
269
  ]
257
270
  end
258
271
  else
259
272
  msg = message(msg) do
260
273
  'Expected make command "%s": %s' % [
261
274
  ('%s %s' % [make_command, target]).rstrip,
262
- output.inspect,
275
+ output,
263
276
  ]
264
277
  end
265
278
  end
@@ -2,7 +2,7 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = "rubygems-update"
5
- s.version = "3.2.3"
5
+ s.version = "3.2.8"
6
6
  s.authors = ["Jim Weirich", "Chad Fowler", "Eric Hodel", "Luis Lavena", "Aaron Patterson", "Samuel Giddins", "André Arko", "Evan Phoenix", "Hiroshi SHIBATA"]
7
7
  s.email = ["", "", "drbrain@segment7.net", "luislavena@gmail.com", "aaron@tenderlovemaking.com", "segiddins@segiddins.me", "andre@arko.net", "evan@phx.io", "hsbt@ruby-lang.org"]
8
8
 
@@ -21,7 +21,7 @@ Gem::Specification.new do |s|
21
21
  s.require_paths = ["hide_lib_for_update"]
22
22
  s.rdoc_options = ["--main", "README.md", "--title=RubyGems Update Documentation"]
23
23
  s.extra_rdoc_files = [
24
- "History.txt", "LICENSE.txt", "MAINTAINERS.txt",
24
+ "CHANGELOG.md", "LICENSE.txt", "MAINTAINERS.txt",
25
25
  "MIT.txt", "Manifest.txt", "README.md",
26
26
  "UPGRADING.md", "POLICIES.md", "CODE_OF_CONDUCT.md",
27
27
  "CONTRIBUTING.md", "bundler/CHANGELOG.md",
@@ -692,6 +692,11 @@ class TestGem < Gem::TestCase
692
692
  ensure
693
693
  FileUtils.chmod 0600, parent
694
694
  end
695
+
696
+ def test_self_ensure_gem_directories_non_existent_paths
697
+ Gem.ensure_gem_subdirectories '/proc/0123456789/bogus' # should not raise
698
+ Gem.ensure_gem_subdirectories 'classpath:/bogus/x' # JRuby embed scenario
699
+ end
695
700
  end
696
701
 
697
702
  def test_self_extension_dir_shared