rubygems-update 2.5.2 → 2.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. checksums.yaml +4 -4
  2. data/History.txt +39 -0
  3. data/MAINTAINERS.md +1 -0
  4. data/README.rdoc +2 -2
  5. data/lib/rubygems.rb +26 -9
  6. data/lib/rubygems/basic_specification.rb +1 -2
  7. data/lib/rubygems/command.rb +8 -1
  8. data/lib/rubygems/commands/cleanup_command.rb +8 -3
  9. data/lib/rubygems/commands/install_command.rb +1 -0
  10. data/lib/rubygems/commands/open_command.rb +4 -0
  11. data/lib/rubygems/commands/push_command.rb +7 -3
  12. data/lib/rubygems/commands/update_command.rb +1 -0
  13. data/lib/rubygems/config_file.rb +11 -2
  14. data/lib/rubygems/dependency.rb +2 -1
  15. data/lib/rubygems/gemcutter_utilities.rb +9 -1
  16. data/lib/rubygems/install_update_options.rb +1 -0
  17. data/lib/rubygems/package.rb +1 -1
  18. data/lib/rubygems/package/tar_header.rb +1 -2
  19. data/lib/rubygems/package/tar_reader.rb +1 -2
  20. data/lib/rubygems/package/tar_reader/entry.rb +1 -1
  21. data/lib/rubygems/package/tar_writer.rb +1 -1
  22. data/lib/rubygems/path_support.rb +13 -23
  23. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph.rb +4 -0
  24. data/lib/rubygems/resolver/molinillo/lib/molinillo/gem_metadata.rb +1 -1
  25. data/lib/rubygems/resolver/molinillo/lib/molinillo/modules/ui.rb +2 -1
  26. data/lib/rubygems/resolver/molinillo/lib/molinillo/resolution.rb +37 -14
  27. data/lib/rubygems/source_list.rb +1 -1
  28. data/lib/rubygems/specification.rb +4 -1
  29. data/lib/rubygems/test_case.rb +1 -1
  30. data/lib/rubygems/version.rb +16 -12
  31. data/test/rubygems/test_gem.rb +59 -0
  32. data/test/rubygems/test_gem_command.rb +4 -0
  33. data/test/rubygems/test_gem_commands_cleanup_command.rb +29 -1
  34. data/test/rubygems/test_gem_commands_open_command.rb +18 -1
  35. data/test/rubygems/test_gem_commands_push_command.rb +49 -9
  36. data/test/rubygems/test_gem_ext_cmake_builder.rb +3 -1
  37. data/test/rubygems/test_gem_gemcutter_utilities.rb +2 -2
  38. data/test/rubygems/test_gem_path_support.rb +42 -6
  39. data/test/rubygems/test_gem_remote_fetcher.rb +2 -0
  40. data/test/rubygems/test_gem_source_list.rb +6 -0
  41. data/test/rubygems/test_gem_version.rb +8 -0
  42. metadata +5 -5
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c7a47cbfb82b12348825937adf26e751760d82c5
4
- data.tar.gz: 9af93cb24d58f63dcf049af89ec9f8a4f2b50501
3
+ metadata.gz: dbc3146d444b0206ed2811c6e2827fcc64547fee
4
+ data.tar.gz: 8fdcaecea808e972b177eb780f351bf09a2ec884
5
5
  SHA512:
6
- metadata.gz: b2b09e3eb5ebb5c45221f0276d9d027a9eab4ab6ed4b57cb8482a846f508adbc19e423d7a63104a3eabd23affc49570d64380f8884354bbf6fff5e7daf9b249e
7
- data.tar.gz: 701530716e4a95ab496ec65d22b2b38f74e43a6ebe022be5183aefcc2ec075b926628c0a931c52d0262f4f35ad3d96fb6c1d081a2133bbdcaced4f71df204d0c
6
+ metadata.gz: c98ed35c5cf9f940941cf8bde958d4e6b479d4f69fb89e2cc1118a7119e9c41771488939ee86828c218f0e0207320604b8afa52a28529dffb65ae22f11873515
7
+ data.tar.gz: 0e560eaee32adc1be7cd038294434d6f3df03acdc3641b553c976c315651e4f9572f7ed50254ac3f01237df4121b305f1910ab1e5b9f7df3f87e5335adbb632e
@@ -1,5 +1,44 @@
1
1
  # coding: UTF-8
2
2
 
3
+ === 2.6.0 / 2016-02-26
4
+
5
+ Minor enhancements:
6
+
7
+ * RubyGems now defaults the `gem push` to the gem's "allowed_push_host"
8
+ metadata setting. Pull request #1486 by Josh Lane.
9
+ * Update bundled Molinillo to 0.4.3. Pull request #1493 by Samuel E. Giddins.
10
+ * Add version option to gem open command. Pull request #1483 by Hrvoje
11
+ Šimić.
12
+ * Feature/add silent flag. Pull request #1455 by Luis Sagastume.
13
+ * Allow specifying gem requirements via env variables. Pull request #1472
14
+ by Samuel E. Giddins.
15
+
16
+ Bug fixes:
17
+
18
+ * RubyGems now stores `gem push` credentials under the host you signed-in for.
19
+ Pull request #1485 by Josh Lane.
20
+ * Move `coding` location to first line. Pull request #1471 by SHIBATA
21
+ Hiroshi.
22
+ * [PathSupport] Handle a regexp path separator. Pull request #1469 by
23
+ Samuel E. Giddins.
24
+ * Clean up the PathSupport object. Pull request #1094 by Aaron Patterson.
25
+ * Join with File::PATH_SEPARATOR in Gem.use_paths. Pull request #1476 by
26
+ Samuel E. Giddins.
27
+ * Handle when the gem home and gem path arent set in the config file. Pull
28
+ request #1478 by Samuel E. Giddins.
29
+ * Terminate TimeoutHandler. Pull request #1479 by Nobuyoshi Nakada.
30
+ * Remove redundant cache. Pull request #1482 by Eileen M. Uchitelle.
31
+ * Freeze `Gem::Version@segments` instance variable. Pull request #1487 by
32
+ Ben Dean.
33
+ * Gem cleanup is trying to uninstall gems outside GEM_HOME and reporting
34
+ an error after it tries. Pull request #1353 by Luis Sagastume.
35
+ * Avoid duplicated sources. Pull request #1489 by Luis Sagastume.
36
+ * Better description for quiet flag. Pull request #1491 by Luis Sagastume.
37
+ * Raise error if find_by_name returns with nil. Pull request #1494 by
38
+ Zoltán Hegedüs.
39
+ * Find_files only from loaded_gems when using gemdeps. Pull request #1277
40
+ by Michal Papis.
41
+
3
42
  === 2.5.2 / 2016-01-31
4
43
 
5
44
  Bug fixes:
@@ -2,3 +2,4 @@ André Arko <andre@arko.net> (@indirect)
2
2
  Jeremy Hinegardner <jeremy@copiousfreetime.org> (@copiousfreetime)
3
3
  Kurtis Rainbolt-Greene <me@kurtisrainboltgreene.name> (@krainboltgreene)
4
4
  Samuel Giddins <segiddins@segiddins.me> (@segiddins)
5
+ Marie Markwell <me@marie.so> (@duckinator)
@@ -26,8 +26,8 @@ See UPGRADING.rdoc for more details and alternative instructions.
26
26
 
27
27
  If you don't have RubyGems installed, you can still do it manually:
28
28
 
29
- * Download from: https://rubygems.org/pages/download
30
- * Unpack into a directory and cd there
29
+ * Download from: https://rubygems.org/pages/download, unpack, and cd there
30
+ * OR clone this repository and cd there
31
31
  * Install with: ruby setup.rb # you may need admin/root privilege
32
32
 
33
33
  For more details and other options, see:
@@ -10,7 +10,7 @@ require 'rbconfig'
10
10
  require 'thread'
11
11
 
12
12
  module Gem
13
- VERSION = '2.5.2'
13
+ VERSION = '2.6.0'
14
14
  end
15
15
 
16
16
  # Must be first since it unloads the prelude from 1.9.2
@@ -174,6 +174,14 @@ module Gem
174
174
  @pre_reset_hooks ||= []
175
175
  @post_reset_hooks ||= []
176
176
 
177
+ def self.env_requirement(gem_name)
178
+ @env_requirements_by_name ||= {}
179
+ @env_requirements_by_name[gem_name] ||= begin
180
+ req = ENV["GEM_REQUIREMENT_#{gem_name.upcase}"] || '>= 0'.freeze
181
+ Gem::Requirement.create(req)
182
+ end
183
+ end
184
+
177
185
  ##
178
186
  # Try to activate a gem containing +path+. Returns true if
179
187
  # activation succeeded or wasn't needed because it was already
@@ -192,8 +200,13 @@ module Gem
192
200
 
193
201
  begin
194
202
  spec.activate
195
- rescue Gem::LoadError # this could fail due to gem dep collisions, go lax
196
- Gem::Specification.find_by_name(spec.name).activate
203
+ rescue Gem::LoadError => e # this could fail due to gem dep collisions, go lax
204
+ spec_by_name = Gem::Specification.find_by_name(spec.name)
205
+ if spec_by_name.nil?
206
+ raise e
207
+ else
208
+ spec_by_name.activate
209
+ end
197
210
  end
198
211
 
199
212
  return true
@@ -326,7 +339,7 @@ module Gem
326
339
  # lookup files.
327
340
 
328
341
  def self.paths
329
- @paths ||= Gem::PathSupport.new
342
+ @paths ||= Gem::PathSupport.new(ENV)
330
343
  end
331
344
 
332
345
  # Initialize the filesystem paths to use from +env+.
@@ -335,7 +348,7 @@ module Gem
335
348
 
336
349
  def self.paths=(env)
337
350
  clear_paths
338
- @paths = Gem::PathSupport.new env
351
+ @paths = Gem::PathSupport.new ENV.to_hash.merge(env)
339
352
  Gem::Specification.dirs = @paths.path
340
353
  end
341
354
 
@@ -430,7 +443,9 @@ module Gem
430
443
 
431
444
  files = find_files_from_load_path glob if check_load_path
432
445
 
433
- files.concat Gem::Specification.stubs.map { |spec|
446
+ gem_specifications = @gemdeps ? Gem.loaded_specs.values : Gem::Specification.stubs
447
+
448
+ files.concat gem_specifications.map { |spec|
434
449
  spec.matches_for_glob("#{glob}#{Gem.suffix_pattern}")
435
450
  }.flatten
436
451
 
@@ -939,9 +954,11 @@ module Gem
939
954
  # by the unit tests to provide environment isolation.
940
955
 
941
956
  def self.use_paths(home, *paths)
942
- paths = nil if paths == [nil]
943
- paths = paths.first if Array === Array(paths).first
944
- self.paths = { "GEM_HOME" => home, "GEM_PATH" => paths }
957
+ paths.flatten!
958
+ paths.compact!
959
+ hash = { "GEM_HOME" => home, "GEM_PATH" => paths.join(File::PATH_SEPARATOR) }
960
+ hash.delete_if { |_, v| v.nil? }
961
+ self.paths = hash
945
962
  end
946
963
 
947
964
  ##
@@ -95,7 +95,7 @@ class Gem::BasicSpecification
95
95
  # Returns path to the extensions directory.
96
96
 
97
97
  def extensions_dir
98
- @extensions_dir ||= Gem.default_ext_dir_for(base_dir) ||
98
+ Gem.default_ext_dir_for(base_dir) ||
99
99
  File.join(base_dir, 'extensions', Gem::Platform.local.to_s,
100
100
  Gem.extension_api_version)
101
101
  end
@@ -196,7 +196,6 @@ class Gem::BasicSpecification
196
196
 
197
197
  def internal_init # :nodoc:
198
198
  @extension_dir = nil
199
- @extensions_dir = nil
200
199
  @full_gem_path = nil
201
200
  @gem_dir = nil
202
201
  @ignored = nil
@@ -300,6 +300,8 @@ class Gem::Command
300
300
 
301
301
  options[:build_args] = build_args
302
302
 
303
+ self.ui = Gem::SilentUI.new if options[:silent]
304
+
303
305
  if options[:help] then
304
306
  show_help
305
307
  elsif @when_invoked then
@@ -520,10 +522,15 @@ class Gem::Command
520
522
  end
521
523
  end
522
524
 
523
- add_common_option('-q', '--quiet', 'Silence commands') do |value, options|
525
+ add_common_option('-q', '--quiet', 'Silence command progress meter') do |value, options|
524
526
  Gem.configuration.verbose = false
525
527
  end
526
528
 
529
+ add_common_option("--silent",
530
+ "Silence rubygems output") do |value, options|
531
+ options[:silent] = true
532
+ end
533
+
527
534
  # Backtrace and config-file are added so they show up in the help
528
535
  # commands. Both options are actually handled before the other
529
536
  # options get parsed.
@@ -76,6 +76,9 @@ If no gems are named all gems in GEM_HOME are cleaned.
76
76
  end
77
77
 
78
78
  def clean_gems
79
+ @original_home = Gem.dir
80
+ @original_path = Gem.path
81
+
79
82
  get_primary_gems
80
83
  get_candidate_gems
81
84
  get_gems_to_cleanup
@@ -87,9 +90,6 @@ If no gems are named all gems in GEM_HOME are cleaned.
87
90
 
88
91
  deps = deplist.strongly_connected_components.flatten
89
92
 
90
- @original_home = Gem.dir
91
- @original_path = Gem.path
92
-
93
93
  deps.reverse_each do |spec|
94
94
  uninstall_dep spec
95
95
  end
@@ -108,6 +108,7 @@ If no gems are named all gems in GEM_HOME are cleaned.
108
108
  end
109
109
 
110
110
  def get_gems_to_cleanup
111
+
111
112
  gems_to_cleanup = @candidate_gems.select { |spec|
112
113
  @primary_gems[spec.name].version != spec.version
113
114
  }
@@ -116,6 +117,10 @@ If no gems are named all gems in GEM_HOME are cleaned.
116
117
  spec.default_gem?
117
118
  }
118
119
 
120
+ gems_to_cleanup = gems_to_cleanup.select { |spec|
121
+ spec.base_dir == @original_home
122
+ }
123
+
119
124
  @default_gems += default_gems
120
125
  @default_gems.uniq!
121
126
  @gems_to_cleanup = gems_to_cleanup.uniq
@@ -186,6 +186,7 @@ to write the specification by hand. For example:
186
186
  end
187
187
 
188
188
  def execute
189
+
189
190
  if options.include? :gemdeps then
190
191
  install_from_gemdeps
191
192
  return # not reached
@@ -15,6 +15,10 @@ class Gem::Commands::OpenCommand < Gem::Command
15
15
  "Opens gem sources in EDITOR") do |editor, options|
16
16
  options[:editor] = editor || get_env_editor
17
17
  end
18
+ add_option('-v', '--version VERSION', String,
19
+ "Opens specific gem version") do |version|
20
+ options[:version] = version
21
+ end
18
22
  end
19
23
 
20
24
  def arguments # :nodoc:
@@ -76,13 +76,17 @@ You can upgrade or downgrade to the latest release version with:
76
76
  @host = gem_data.spec.metadata['default_gem_server']
77
77
  end
78
78
 
79
- # Always include this, even if it's nil
80
- args << @host
79
+ push_host = nil
81
80
 
82
81
  if gem_data.spec.metadata.has_key?('allowed_push_host')
83
- args << gem_data.spec.metadata['allowed_push_host']
82
+ push_host = gem_data.spec.metadata['allowed_push_host']
84
83
  end
85
84
 
85
+ @host ||= push_host
86
+
87
+ # Always include @host, even if it's nil
88
+ args += [ @host, push_host ]
89
+
86
90
  say "Pushing gem to #{@host || Gem.host}..."
87
91
 
88
92
  response = rubygems_api_request(*args) do |request|
@@ -85,6 +85,7 @@ command to remove old versions.
85
85
  end
86
86
 
87
87
  def execute
88
+
88
89
  if options[:system] then
89
90
  update_rubygems
90
91
  return
@@ -306,9 +306,18 @@ if you believe they were disclosed to a third party.
306
306
  # Sets the RubyGems.org API key to +api_key+
307
307
 
308
308
  def rubygems_api_key= api_key
309
+ set_api_key :rubygems_api_key, api_key
310
+
311
+ @rubygems_api_key = api_key
312
+ end
313
+
314
+ ##
315
+ # Set a specific host's API key to +api_key+
316
+
317
+ def set_api_key host, api_key
309
318
  check_credentials_permissions
310
319
 
311
- config = load_file(credentials_path).merge(:rubygems_api_key => api_key)
320
+ config = load_file(credentials_path).merge(host => api_key)
312
321
 
313
322
  dirname = File.dirname credentials_path
314
323
  Dir.mkdir(dirname) unless File.exist? dirname
@@ -320,7 +329,7 @@ if you believe they were disclosed to a third party.
320
329
  f.write config.to_yaml
321
330
  end
322
331
 
323
- @rubygems_api_key = api_key
332
+ load_api_keys # reload
324
333
  end
325
334
 
326
335
  def load_file(filename)
@@ -275,8 +275,9 @@ class Gem::Dependency
275
275
  end
276
276
 
277
277
  def matching_specs platform_only = false
278
+ env_req = Gem.env_requirement(name)
278
279
  matches = Gem::Specification.stubs_for(name).find_all { |spec|
279
- requirement.satisfied_by? spec.version
280
+ requirement.satisfied_by?(spec.version) && env_req.satisfied_by?(spec.version)
280
281
  }.map(&:to_spec)
281
282
 
282
283
  if platform_only
@@ -115,7 +115,7 @@ module Gem::GemcutterUtilities
115
115
 
116
116
  with_response response do |resp|
117
117
  say "Signed in."
118
- Gem.configuration.rubygems_api_key = resp.body
118
+ set_api_key host, resp.body
119
119
  end
120
120
  end
121
121
 
@@ -156,5 +156,13 @@ module Gem::GemcutterUtilities
156
156
  end
157
157
  end
158
158
 
159
+ def set_api_key host, key
160
+ if host == Gem::DEFAULT_HOST
161
+ Gem.configuration.rubygems_api_key = key
162
+ else
163
+ Gem.configuration.set_api_key host, key
164
+ end
165
+ end
166
+
159
167
  end
160
168
 
@@ -179,6 +179,7 @@ module Gem::InstallUpdateOptions
179
179
  "Print post install message") do |value, options|
180
180
  options[:post_install_message] = value
181
181
  end
182
+
182
183
  end
183
184
 
184
185
  ##
@@ -1,5 +1,5 @@
1
- # frozen_string_literal: true
2
1
  # -*- coding: utf-8 -*-
2
+ # frozen_string_literal: true
3
3
  #--
4
4
  # Copyright (C) 2004 Mauricio Julio Fernández Pradier
5
5
  # See LICENSE.txt for additional licensing information.
@@ -1,5 +1,5 @@
1
- # frozen_string_literal: true
2
1
  # -*- coding: utf-8 -*-
2
+ # frozen_string_literal: true
3
3
  #--
4
4
  # Copyright (C) 2004 Mauricio Julio Fernández Pradier
5
5
  # See LICENSE.txt for additional licensing information.
@@ -227,4 +227,3 @@ class Gem::Package::TarHeader
227
227
  end
228
228
 
229
229
  end
230
-
@@ -1,5 +1,5 @@
1
- # frozen_string_literal: true
2
1
  # -*- coding: utf-8 -*-
2
+ # frozen_string_literal: true
3
3
  #--
4
4
  # Copyright (C) 2004 Mauricio Julio Fernández Pradier
5
5
  # See LICENSE.txt for additional licensing information.
@@ -121,4 +121,3 @@ class Gem::Package::TarReader
121
121
  end
122
122
 
123
123
  require 'rubygems/package/tar_reader/entry'
124
-
@@ -1,5 +1,5 @@
1
- # frozen_string_literal: true
2
1
  # -*- coding: utf-8 -*-
2
+ # frozen_string_literal: true
3
3
  #++
4
4
  # Copyright (C) 2004 Mauricio Julio Fernández Pradier
5
5
  # See LICENSE.txt for additional licensing information.
@@ -1,5 +1,5 @@
1
- # frozen_string_literal: true
2
1
  # -*- coding: utf-8 -*-
2
+ # frozen_string_literal: true
3
3
  #--
4
4
  # Copyright (C) 2004 Mauricio Julio Fernández Pradier
5
5
  # See LICENSE.txt for additional licensing information.
@@ -22,21 +22,16 @@ class Gem::PathSupport
22
22
  # Constructor. Takes a single argument which is to be treated like a
23
23
  # hashtable, or defaults to ENV, the system environment.
24
24
  #
25
- def initialize(env=ENV)
26
- @env = env
27
-
28
- # note 'env' vs 'ENV'...
29
- @home = env["GEM_HOME"] || ENV["GEM_HOME"] || Gem.default_dir
25
+ def initialize(env)
26
+ @home = env["GEM_HOME"] || Gem.default_dir
30
27
 
31
28
  if File::ALT_SEPARATOR then
32
29
  @home = @home.gsub(File::ALT_SEPARATOR, File::SEPARATOR)
33
30
  end
34
31
 
35
- self.path = env["GEM_PATH"] || ENV["GEM_PATH"]
32
+ @path = split_gem_path env["GEM_PATH"], @home
36
33
 
37
- @spec_cache_dir =
38
- env["GEM_SPEC_CACHE"] || ENV["GEM_SPEC_CACHE"] ||
39
- Gem.default_spec_cache_dir
34
+ @spec_cache_dir = env["GEM_SPEC_CACHE"] || Gem.default_spec_cache_dir
40
35
 
41
36
  @spec_cache_dir = @spec_cache_dir.dup.untaint
42
37
  end
@@ -44,24 +39,19 @@ class Gem::PathSupport
44
39
  private
45
40
 
46
41
  ##
47
- # Set the Gem search path (as reported by Gem.path).
42
+ # Split the Gem search path (as reported by Gem.path).
48
43
 
49
- def path=(gpaths)
44
+ def split_gem_path gpaths, home
50
45
  # FIX: it should be [home, *path], not [*path, home]
51
46
 
52
47
  gem_path = []
53
48
 
54
- # FIX: I can't tell wtf this is doing.
55
- gpaths ||= (ENV['GEM_PATH'] || "").empty? ? nil : ENV["GEM_PATH"]
56
-
57
49
  if gpaths
58
- if gpaths.kind_of?(Array)
59
- gem_path = gpaths.dup
60
- else
61
- gem_path = gpaths.split(Gem.path_separator)
62
- if gpaths.end_with?(Gem.path_separator)
63
- gem_path += default_path
64
- end
50
+ gem_path = gpaths.split(Gem.path_separator)
51
+ # Handle the path_separator being set to a regexp, which will cause
52
+ # end_with? to error
53
+ if gpaths =~ /#{Gem.path_separator}\z/
54
+ gem_path += default_path
65
55
  end
66
56
 
67
57
  if File::ALT_SEPARATOR then
@@ -70,12 +60,12 @@ class Gem::PathSupport
70
60
  end
71
61
  end
72
62
 
73
- gem_path << @home
63
+ gem_path << home
74
64
  else
75
65
  gem_path = default_path
76
66
  end
77
67
 
78
- @path = gem_path.uniq
68
+ gem_path.uniq
79
69
  end
80
70
 
81
71
  # Return the default Gem path
@@ -127,6 +127,10 @@ module Gem::Resolver::Molinillo
127
127
  v.incoming_edges.delete(e)
128
128
  detach_vertex_named(v.name) unless v.root? || v.predecessors.any?
129
129
  end
130
+ vertex.incoming_edges.each do |e|
131
+ v = e.origin
132
+ v.outgoing_edges.delete(e)
133
+ end
130
134
  end
131
135
 
132
136
  # @param [String] name
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
  module Gem::Resolver::Molinillo
3
3
  # The version of Gem::Resolver::Molinillo.
4
- VERSION = '0.4.1'.freeze
4
+ VERSION = '0.4.3'.freeze
5
5
  end
@@ -58,7 +58,8 @@ module Gem::Resolver::Molinillo
58
58
  #
59
59
  # @return [Boolean]
60
60
  def debug?
61
- @debug_mode ||= ENV['MOLINILLO_DEBUG']
61
+ return @debug_mode if defined?(@debug_mode)
62
+ @debug_mode = ENV['MOLINILLO_DEBUG']
62
63
  end
63
64
  end
64
65
  end
@@ -342,26 +342,37 @@ module Gem::Resolver::Molinillo
342
342
  # @return [Boolean] Whether the possibility was swapped into {#activated}
343
343
  def attempt_to_swap_possibility
344
344
  swapped = activated.dup
345
- swapped.vertex_named(name).payload = possibility
346
- return unless swapped.vertex_named(name).requirements.
345
+ vertex = swapped.vertex_named(name)
346
+ vertex.payload = possibility
347
+ return unless vertex.requirements.
347
348
  all? { |r| requirement_satisfied_by?(r, swapped, possibility) }
348
- attempt_to_activate_new_spec
349
+ return unless new_spec_satisfied?
350
+ actual_vertex = activated.vertex_named(name)
351
+ actual_vertex.payload = possibility
352
+ fixup_swapped_children(actual_vertex)
353
+ activate_spec
354
+ end
355
+
356
+ # Ensures there are no orphaned successors to the given {vertex}.
357
+ # @param [DependencyGraph::Vertex] vertex the vertex to fix up.
358
+ # @return [void]
359
+ def fixup_swapped_children(vertex)
360
+ payload = vertex.payload
361
+ dep_names = dependencies_for(payload).map(&method(:name_for))
362
+ vertex.successors.each do |succ|
363
+ if !dep_names.include?(succ.name) && !succ.root? && succ.predecessors.to_a == [vertex]
364
+ debug(depth) { "Removing orphaned spec #{succ.name} after swapping #{name}" }
365
+ activated.detach_vertex_named(succ.name)
366
+ requirements.delete_if { |r| name_for(r) == succ.name }
367
+ end
368
+ end
349
369
  end
350
370
 
351
371
  # Attempts to activate the current {#possibility} (given that it hasn't
352
372
  # already been activated)
353
373
  # @return [void]
354
374
  def attempt_to_activate_new_spec
355
- satisfied = begin
356
- locked_requirement = locked_requirement_named(name)
357
- requested_spec_satisfied = requirement_satisfied_by?(requirement, activated, possibility)
358
- locked_spec_satisfied = !locked_requirement ||
359
- requirement_satisfied_by?(locked_requirement, activated, possibility)
360
- debug(depth) { 'Unsatisfied by requested spec' } unless requested_spec_satisfied
361
- debug(depth) { 'Unsatisfied by locked spec' } unless locked_spec_satisfied
362
- requested_spec_satisfied && locked_spec_satisfied
363
- end
364
- if satisfied
375
+ if new_spec_satisfied?
365
376
  activate_spec
366
377
  else
367
378
  create_conflict
@@ -369,6 +380,18 @@ module Gem::Resolver::Molinillo
369
380
  end
370
381
  end
371
382
 
383
+ # @return [Boolean] whether the current spec is satisfied as a new
384
+ # possibility.
385
+ def new_spec_satisfied?
386
+ locked_requirement = locked_requirement_named(name)
387
+ requested_spec_satisfied = requirement_satisfied_by?(requirement, activated, possibility)
388
+ locked_spec_satisfied = !locked_requirement ||
389
+ requirement_satisfied_by?(locked_requirement, activated, possibility)
390
+ debug(depth) { 'Unsatisfied by requested spec' } unless requested_spec_satisfied
391
+ debug(depth) { 'Unsatisfied by locked spec' } unless locked_spec_satisfied
392
+ requested_spec_satisfied && locked_spec_satisfied
393
+ end
394
+
372
395
  # @param [String] requirement_name the spec name to search for
373
396
  # @return [Object] the locked spec named `requirement_name`, if one
374
397
  # is found on {#base}
@@ -394,7 +417,7 @@ module Gem::Resolver::Molinillo
394
417
  # @return [void]
395
418
  def require_nested_dependencies_for(activated_spec)
396
419
  nested_dependencies = dependencies_for(activated_spec)
397
- debug(depth) { "Requiring nested dependencies (#{nested_dependencies.map(&:to_s).join(', ')})" }
420
+ debug(depth) { "Requiring nested dependencies (#{nested_dependencies.join(', ')})" }
398
421
  nested_dependencies.each { |d| activated.add_child_vertex(name_for(d), nil, [name_for(activated_spec)], d) }
399
422
 
400
423
  push_state_for_requirements(requirements + nested_dependencies, nested_dependencies.size > 0)
@@ -59,7 +59,7 @@ class Gem::SourceList
59
59
  Gem::Source.new(URI.parse(obj))
60
60
  end
61
61
 
62
- @sources << src
62
+ @sources << src unless @sources.include?(src)
63
63
  src
64
64
  end
65
65
 
@@ -1,5 +1,5 @@
1
- # frozen_string_literal: true
2
1
  # -*- coding: utf-8 -*-
2
+ # frozen_string_literal: true
3
3
  #--
4
4
  # Copyright 2006 by Chad Fowler, Rich Kilmer, Jim Weirich and others.
5
5
  # All rights reserved.
@@ -1684,6 +1684,8 @@ class Gem::Specification < Gem::BasicSpecification
1684
1684
  (conflicts[spec] ||= []) << dep
1685
1685
  end
1686
1686
  }
1687
+ env_req = Gem.env_requirement(name)
1688
+ (conflicts[self] ||= []) << env_req unless env_req.satisfied_by? version
1687
1689
  conflicts
1688
1690
  end
1689
1691
 
@@ -1701,6 +1703,7 @@ class Gem::Specification < Gem::BasicSpecification
1701
1703
  # Return true if there are possible conflicts against the currently loaded specs.
1702
1704
 
1703
1705
  def has_conflicts?
1706
+ return true unless Gem.env_requirement(name).satisfied_by?(version)
1704
1707
  self.dependencies.any? { |dep|
1705
1708
  if dep.runtime? then
1706
1709
  spec = Gem.loaded_specs[dep.name]
@@ -570,7 +570,7 @@ class Gem::TestCase < MiniTest::Unit::TestCase
570
570
  def write_file(path)
571
571
  path = File.join @gemhome, path unless Pathname.new(path).absolute?
572
572
  dir = File.dirname path
573
- FileUtils.mkdir_p dir
573
+ FileUtils.mkdir_p dir unless File.directory? dir
574
574
 
575
575
  open path, 'wb' do |io|
576
576
  yield io if block_given?
@@ -219,7 +219,7 @@ class Gem::Version
219
219
 
220
220
  def bump
221
221
  @bump ||= begin
222
- segments = self.segments.dup
222
+ segments = self.segments
223
223
  segments.pop while segments.any? { |s| String === s }
224
224
  segments.pop if segments.size > 1
225
225
 
@@ -298,7 +298,7 @@ class Gem::Version
298
298
 
299
299
  def release
300
300
  @release ||= if prerelease?
301
- segments = self.segments.dup
301
+ segments = self.segments
302
302
  segments.pop while segments.any? { |s| String === s }
303
303
  self.class.new segments.join('.')
304
304
  else
@@ -307,20 +307,14 @@ class Gem::Version
307
307
  end
308
308
 
309
309
  def segments # :nodoc:
310
-
311
- # segments is lazy so it can pick up version values that come from
312
- # old marshaled versions, which don't go through marshal_load.
313
-
314
- @segments ||= @version.scan(/[0-9]+|[a-z]+/i).map do |s|
315
- /^\d+$/ =~ s ? s.to_i : s
316
- end
310
+ _segments.dup
317
311
  end
318
312
 
319
313
  ##
320
314
  # A recommended version for use with a ~> Requirement.
321
315
 
322
316
  def approximate_recommendation
323
- segments = self.segments.dup
317
+ segments = self.segments
324
318
 
325
319
  segments.pop while segments.any? { |s| String === s }
326
320
  segments.pop while segments.size > 2
@@ -339,8 +333,8 @@ class Gem::Version
339
333
  return unless Gem::Version === other
340
334
  return 0 if @version == other._version
341
335
 
342
- lhsegments = segments
343
- rhsegments = other.segments
336
+ lhsegments = _segments
337
+ rhsegments = other._segments
344
338
 
345
339
  lhsize = lhsegments.size
346
340
  rhsize = rhsegments.size
@@ -367,4 +361,14 @@ class Gem::Version
367
361
  def _version
368
362
  @version
369
363
  end
364
+
365
+ def _segments
366
+ # segments is lazy so it can pick up version values that come from
367
+ # old marshaled versions, which don't go through marshal_load.
368
+ # since this version object is cached in @@all, its @segments should be frozen
369
+
370
+ @segments ||= @version.scan(/[0-9]+|[a-z]+/i).map do |s|
371
+ /^\d+$/ =~ s ? s.to_i : s
372
+ end.freeze
373
+ end
370
374
  end
@@ -473,6 +473,45 @@ class TestGem < Gem::TestCase
473
473
  assert_equal cwd, $LOAD_PATH.shift
474
474
  end
475
475
 
476
+ def test_self_find_files_with_gemfile
477
+ # write_file(File.join Dir.pwd, 'Gemfile') fails on travis 1.8.7 with $SAFE=1
478
+ skip if RUBY_VERSION <= "1.8.7"
479
+
480
+ cwd = File.expand_path("test/rubygems", @@project_dir)
481
+ $LOAD_PATH.unshift cwd
482
+
483
+ discover_path = File.join 'lib', 'sff', 'discover.rb'
484
+
485
+ foo1, _ = %w(1 2).map { |version|
486
+ spec = quick_gem 'sff', version do |s|
487
+ s.files << discover_path
488
+ end
489
+
490
+ write_file(File.join 'gems', spec.full_name, discover_path) do |fp|
491
+ fp.puts "# #{spec.full_name}"
492
+ end
493
+
494
+ spec
495
+ }
496
+ Gem.refresh
497
+
498
+ write_file(File.join Dir.pwd, 'Gemfile') do |fp|
499
+ fp.puts "source 'https://rubygems.org'"
500
+ fp.puts "gem '#{foo1.name}', '#{foo1.version}'"
501
+ end
502
+ Gem.use_gemdeps(File.join Dir.pwd, 'Gemfile')
503
+
504
+ expected = [
505
+ File.expand_path('test/rubygems/sff/discover.rb', @@project_dir),
506
+ File.join(foo1.full_gem_path, discover_path)
507
+ ]
508
+
509
+ assert_equal expected, Gem.find_files('sff/discover')
510
+ assert_equal expected, Gem.find_files('sff/**.rb'), '[ruby-core:31730]'
511
+ ensure
512
+ assert_equal cwd, $LOAD_PATH.shift unless RUBY_VERSION <= "1.8.7"
513
+ end
514
+
476
515
  def test_self_find_latest_files
477
516
  cwd = File.expand_path("test/rubygems", @@project_dir)
478
517
  $LOAD_PATH.unshift cwd
@@ -929,6 +968,26 @@ class TestGem < Gem::TestCase
929
968
  assert_match %r%Could not find 'b' %, e.message
930
969
  end
931
970
 
971
+ def test_self_try_activate_missing_prerelease
972
+ b = util_spec 'b', '1.0rc1'
973
+ a = util_spec 'a', '1.0rc1', 'b' => '1.0rc1'
974
+
975
+ install_specs b, a
976
+ uninstall_gem b
977
+
978
+ a_file = File.join a.gem_dir, 'lib', 'a_file.rb'
979
+
980
+ write_file a_file do |io|
981
+ io.puts '# a_file.rb'
982
+ end
983
+
984
+ e = assert_raises Gem::LoadError do
985
+ Gem.try_activate 'a_file'
986
+ end
987
+
988
+ assert_match %r%Could not find 'b' \(= 1.0rc1\)%, e.message
989
+ end
990
+
932
991
  def test_self_try_activate_missing_extensions
933
992
  spec = util_spec 'ext', '1' do |s|
934
993
  s.extensions = %w[ext/extconf.rb]
@@ -170,12 +170,16 @@ class TestGemCommand < Gem::TestCase
170
170
  @cmd.add_option('-f', '--file FILE', 'File option') do |value, options|
171
171
  options[:help] = true
172
172
  end
173
+ @cmd.add_option('--silent', 'Silence rubygems output') do |value, options|
174
+ options[:silent] = true
175
+ end
173
176
  assert @cmd.handles?(['-x'])
174
177
  assert @cmd.handles?(['-h'])
175
178
  assert @cmd.handles?(['-h', 'command'])
176
179
  assert @cmd.handles?(['--help', 'command'])
177
180
  assert @cmd.handles?(['-f', 'filename'])
178
181
  assert @cmd.handles?(['--file=filename'])
182
+ assert @cmd.handles?(['--silent'])
179
183
  refute @cmd.handles?(['-z'])
180
184
  refute @cmd.handles?(['-f'])
181
185
  refute @cmd.handles?(['--toothpaste'])
@@ -112,7 +112,7 @@ class TestGemCommandsCleanupCommand < Gem::TestCase
112
112
  @cmd.execute
113
113
 
114
114
  assert_path_exists @a_1.gem_dir
115
- refute_path_exists @a_1_1.gem_dir
115
+ assert_path_exists @a_1_1.gem_dir
116
116
  ensure
117
117
  FileUtils.chmod 0755, @gemhome
118
118
  end unless win_platform?
@@ -165,5 +165,33 @@ class TestGemCommandsCleanupCommand < Gem::TestCase
165
165
  assert_match %r%^Skipped default gems: b-2%, @ui.output
166
166
  assert_empty @ui.error
167
167
  end
168
+
169
+ def test_execute_remove_gem_home_only
170
+ c_1, = util_gem 'c', '1'
171
+ c_2, = util_gem 'c', '2'
172
+ d_1, = util_gem 'd', '1'
173
+ d_2, = util_gem 'd', '2'
174
+ e_1, = util_gem 'e', '1'
175
+ e_2, = util_gem 'e', '2'
176
+
177
+ c_1 = install_gem c_1, :user_install => true # pick up user install path
178
+ c_2 = install_gem c_2
179
+
180
+ d_1 = install_gem d_1
181
+ d_2 = install_gem d_2, :user_install => true # pick up user install path
182
+
183
+ e_1 = install_gem e_1
184
+ e_2 = install_gem e_2
185
+
186
+ Gem::Specification.dirs = [Gem.dir, Gem.user_dir]
187
+
188
+ @cmd.options[:args] = []
189
+
190
+ @cmd.execute
191
+
192
+ assert_path_exists c_1.gem_dir
193
+ refute_path_exists d_1.gem_dir
194
+ refute_path_exists e_1.gem_dir
195
+ end
168
196
  end
169
197
 
@@ -10,9 +10,10 @@ class TestGemCommandsOpenCommand < Gem::TestCase
10
10
  @cmd = Gem::Commands::OpenCommand.new
11
11
  end
12
12
 
13
- def gem name
13
+ def gem(name, version = "1.0")
14
14
  spec = quick_gem name do |gem|
15
15
  gem.files = %W[lib/#{name}.rb Rakefile]
16
+ gem.version = version
16
17
  end
17
18
  write_file File.join(*%W[gems #{spec.full_name} lib #{name}.rb])
18
19
  write_file File.join(*%W[gems #{spec.full_name} Rakefile])
@@ -37,6 +38,22 @@ class TestGemCommandsOpenCommand < Gem::TestCase
37
38
  assert_equal "", @ui.error
38
39
  end
39
40
 
41
+ def test_wrong_version
42
+ @cmd.options[:version] = "4.0"
43
+ @cmd.options[:args] = %w[foo]
44
+
45
+ spec = gem "foo", "5.0"
46
+
47
+ assert_raises Gem::MockGemUi::TermError do
48
+ use_ui @ui do
49
+ @cmd.execute
50
+ end
51
+ end
52
+
53
+ assert_match %r|Unable to find gem 'foo'|, @ui.output
54
+ assert_equal "", @ui.error
55
+ end
56
+
40
57
  def test_execute_bad_gem
41
58
  @cmd.options[:args] = %w[foo]
42
59
 
@@ -118,7 +118,7 @@ class TestGemCommandsPushCommand < Gem::TestCase
118
118
  end
119
119
 
120
120
  def test_sending_gem_to_metadata_host
121
- @host = "http://rubygems.engineyard.com"
121
+ @host = "http://privategemserver.example"
122
122
 
123
123
  @spec, @path = util_gem "freebird", "1.0.1" do |spec|
124
124
  spec.metadata['default_gem_server'] = @host
@@ -152,7 +152,7 @@ class TestGemCommandsPushCommand < Gem::TestCase
152
152
  end
153
153
 
154
154
  def test_sending_gem_to_allowed_push_host
155
- @host = "http://privategemserver.com"
155
+ @host = "http://privategemserver.example"
156
156
 
157
157
  @spec, @path = util_gem "freebird", "1.0.1" do |spec|
158
158
  spec.metadata['allowed_push_host'] = @host
@@ -179,8 +179,8 @@ class TestGemCommandsPushCommand < Gem::TestCase
179
179
  end
180
180
 
181
181
  def test_sending_gem_to_allowed_push_host_with_basic_credentials
182
- @sanitized_host = "http://privategemserver.com"
183
- @host = "http://user:password@privategemserver.com"
182
+ @sanitized_host = "http://privategemserver.example"
183
+ @host = "http://user:password@privategemserver.example"
184
184
 
185
185
  @spec, @path = util_gem "freebird", "1.0.1" do |spec|
186
186
  spec.metadata['allowed_push_host'] = @sanitized_host
@@ -207,10 +207,10 @@ class TestGemCommandsPushCommand < Gem::TestCase
207
207
 
208
208
  def test_sending_gem_to_disallowed_default_host
209
209
  @spec, @path = util_gem "freebird", "1.0.1" do |spec|
210
- spec.metadata['allowed_push_host'] = "https://privategemserver.com"
210
+ spec.metadata['allowed_push_host'] = "https://privategemserver.example"
211
211
  end
212
212
 
213
- response = %{ERROR: "#{@host}" is not allowed by the gemspec, which only allows "https://privategemserver.com"}
213
+ response = %{ERROR: "#{@host}" is not allowed by the gemspec, which only allows "https://privategemserver.example"}
214
214
 
215
215
  assert_raises Gem::MockGemUi::TermError do
216
216
  send_battery
@@ -220,10 +220,11 @@ class TestGemCommandsPushCommand < Gem::TestCase
220
220
  end
221
221
 
222
222
  def test_sending_gem_to_disallowed_push_host
223
- @host = "https://somebodyelse.com"
223
+ @host = "https://anotherprivategemserver.example"
224
+ push_host = "https://privategemserver.example"
224
225
 
225
226
  @spec, @path = util_gem "freebird", "1.0.1" do |spec|
226
- spec.metadata['allowed_push_host'] = "https://privategemserver.com"
227
+ spec.metadata['allowed_push_host'] = push_host
227
228
  end
228
229
 
229
230
  @api_key = "PRIVKEY"
@@ -241,7 +242,7 @@ class TestGemCommandsPushCommand < Gem::TestCase
241
242
 
242
243
  FileUtils.rm Gem.configuration.credentials_path
243
244
 
244
- response = 'ERROR: "https://somebodyelse.com" is not allowed by the gemspec, which only allows "https://privategemserver.com"'
245
+ response = "ERROR: \"#{@host}\" is not allowed by the gemspec, which only allows \"#{push_host}\""
245
246
 
246
247
  assert_raises Gem::MockGemUi::TermError do
247
248
  send_battery
@@ -250,6 +251,45 @@ class TestGemCommandsPushCommand < Gem::TestCase
250
251
  assert_match response, @ui.error
251
252
  end
252
253
 
254
+ def test_sending_gem_defaulting_to_allowed_push_host
255
+ host = "http://privategemserver.example"
256
+
257
+ @spec, @path = util_gem "freebird", "1.0.1" do |spec|
258
+ spec.metadata.delete('default_gem_server')
259
+ spec.metadata['allowed_push_host'] = host
260
+ end
261
+
262
+ api_key = "PRIVKEY"
263
+
264
+ keys = {
265
+ host => api_key
266
+ }
267
+
268
+ FileUtils.mkdir_p File.dirname Gem.configuration.credentials_path
269
+ open Gem.configuration.credentials_path, 'w' do |f|
270
+ f.write keys.to_yaml
271
+ end
272
+ Gem.configuration.load_api_keys
273
+
274
+ FileUtils.rm Gem.configuration.credentials_path
275
+
276
+ @response = "Successfully registered gem: freebird (1.0.1)"
277
+ @fetcher.data["#{host}/api/v1/gems"] = [@response, 200, 'OK']
278
+
279
+ # do not set @host
280
+ use_ui(@ui) { @cmd.send_gem(@path) }
281
+
282
+ assert_match %r{Pushing gem to #{host}...}, @ui.output
283
+
284
+ assert_equal Net::HTTP::Post, @fetcher.last_request.class
285
+ assert_equal Gem.read_binary(@path), @fetcher.last_request.body
286
+ assert_equal File.size(@path), @fetcher.last_request["Content-Length"].to_i
287
+ assert_equal "application/octet-stream", @fetcher.last_request["Content-Type"]
288
+ assert_equal api_key, @fetcher.last_request["Authorization"]
289
+
290
+ assert_match @response, @ui.output
291
+ end
292
+
253
293
  def test_raises_error_with_no_arguments
254
294
  def @cmd.sign_in(*); end
255
295
  assert_raises Gem::CommandLineError do
@@ -7,6 +7,9 @@ class TestGemExtCmakeBuilder < Gem::TestCase
7
7
  def setup
8
8
  super
9
9
 
10
+ # Details: https://github.com/rubygems/rubygems/issues/1270#issuecomment-177368340
11
+ skip "CmakeBuilder doesn't work on Windows." if Gem.win_platform?
12
+
10
13
  `cmake #{Gem::Ext::Builder.redirector}`
11
14
 
12
15
  skip 'cmake not present' unless $?.success?
@@ -82,4 +85,3 @@ install (FILES test.txt DESTINATION bin)
82
85
  end
83
86
 
84
87
  end
85
-
@@ -110,7 +110,7 @@ class TestGemGemcutterUtilities < Gem::TestCase
110
110
  assert_match %r{Signed in.}, @sign_in_ui.output
111
111
 
112
112
  credentials = YAML.load_file Gem.configuration.credentials_path
113
- assert_equal api_key, credentials[:rubygems_api_key]
113
+ assert_equal api_key, credentials['http://example.com']
114
114
  end
115
115
 
116
116
  def test_sign_in_with_host_nil
@@ -137,7 +137,7 @@ class TestGemGemcutterUtilities < Gem::TestCase
137
137
  assert_match %r{Signed in.}, @sign_in_ui.output
138
138
 
139
139
  credentials = YAML.load_file Gem.configuration.credentials_path
140
- assert_equal api_key, credentials[:rubygems_api_key]
140
+ assert_equal api_key, credentials['http://example.com']
141
141
  end
142
142
 
143
143
  def test_sign_in_skips_with_existing_credentials
@@ -12,7 +12,7 @@ class TestGemPathSupport < Gem::TestCase
12
12
  end
13
13
 
14
14
  def test_initialize
15
- ps = Gem::PathSupport.new
15
+ ps = Gem::PathSupport.new ENV
16
16
 
17
17
  assert_equal ENV["GEM_HOME"], ps.home
18
18
 
@@ -21,7 +21,7 @@ class TestGemPathSupport < Gem::TestCase
21
21
  end
22
22
 
23
23
  def test_initialize_home
24
- ps = Gem::PathSupport.new "GEM_HOME" => "#{@tempdir}/foo"
24
+ ps = Gem::PathSupport.new ENV.to_hash.merge("GEM_HOME" => "#{@tempdir}/foo")
25
25
 
26
26
  assert_equal File.join(@tempdir, "foo"), ps.home
27
27
 
@@ -39,7 +39,7 @@ class TestGemPathSupport < Gem::TestCase
39
39
  end
40
40
 
41
41
  def test_initialize_path
42
- ps = Gem::PathSupport.new "GEM_PATH" => %W[#{@tempdir}/foo #{@tempdir}/bar]
42
+ ps = Gem::PathSupport.new ENV.to_hash.merge("GEM_PATH" => %W[#{@tempdir}/foo #{@tempdir}/bar].join(Gem.path_separator))
43
43
 
44
44
  assert_equal ENV["GEM_HOME"], ps.home
45
45
 
@@ -52,9 +52,45 @@ class TestGemPathSupport < Gem::TestCase
52
52
  assert_equal expected, ps.path
53
53
  end
54
54
 
55
+ def test_initialize_regexp_path_separator
56
+ Gem.stub(:path_separator, /#{File::PATH_SEPARATOR}/) do
57
+ path = %W[#{@tempdir}/foo
58
+ #{File::PATH_SEPARATOR}
59
+ #{@tempdir}/bar
60
+ #{File::PATH_SEPARATOR}].join
61
+ ps = Gem::PathSupport.new "GEM_PATH" => path, "GEM_HOME" => ENV["GEM_HOME"]
62
+
63
+ assert_equal ENV["GEM_HOME"], ps.home
64
+
65
+ expected = [
66
+ File.join(@tempdir, 'foo'),
67
+ File.join(@tempdir, 'bar'),
68
+ ] + Gem.default_path << ENV["GEM_HOME"]
69
+
70
+ assert_equal expected, ps.path
71
+ end
72
+ end
73
+
74
+ def test_initialize_path_with_defaults
75
+ path = %W[#{@tempdir}/foo
76
+ #{File::PATH_SEPARATOR}
77
+ #{@tempdir}/bar
78
+ #{File::PATH_SEPARATOR}].join
79
+ ps = Gem::PathSupport.new "GEM_PATH" => path, "GEM_HOME" => ENV["GEM_HOME"]
80
+
81
+ assert_equal ENV["GEM_HOME"], ps.home
82
+
83
+ expected = [
84
+ File.join(@tempdir, 'foo'),
85
+ File.join(@tempdir, 'bar'),
86
+ ] + Gem.default_path << ENV["GEM_HOME"]
87
+
88
+ assert_equal expected, ps.path
89
+ end
90
+
55
91
  def test_initialize_home_path
56
92
  ps = Gem::PathSupport.new("GEM_HOME" => "#{@tempdir}/foo",
57
- "GEM_PATH" => %W[#{@tempdir}/foo #{@tempdir}/bar])
93
+ "GEM_PATH" => %W[#{@tempdir}/foo #{@tempdir}/bar].join(Gem.path_separator))
58
94
 
59
95
  assert_equal File.join(@tempdir, "foo"), ps.home
60
96
 
@@ -69,12 +105,12 @@ class TestGemPathSupport < Gem::TestCase
69
105
  def test_initialize_spec
70
106
  ENV["GEM_SPEC_CACHE"] = nil
71
107
 
72
- ps = Gem::PathSupport.new
108
+ ps = Gem::PathSupport.new ENV
73
109
  assert_equal Gem.default_spec_cache_dir, ps.spec_cache_dir
74
110
 
75
111
  ENV["GEM_SPEC_CACHE"] = 'bar'
76
112
 
77
- ps = Gem::PathSupport.new
113
+ ps = Gem::PathSupport.new ENV
78
114
  assert_equal ENV["GEM_SPEC_CACHE"], ps.spec_cache_dir
79
115
 
80
116
  ENV["GEM_SPEC_CACHE"] = File.join @tempdir, 'spec_cache'
@@ -924,6 +924,8 @@ PeIQQkFng2VVot/WAQbv3ePqWq07g1BBcwIBAg==
924
924
  @ssl_server_thread.kill.join
925
925
  @ssl_server_thread = nil
926
926
  end
927
+ utils = WEBrick::Utils # TimeoutHandler is since 1.9
928
+ utils::TimeoutHandler.terminate if defined?(utils::TimeoutHandler.terminate)
927
929
  end
928
930
 
929
931
  def normal_server_port
@@ -25,6 +25,12 @@ class TestGemSourceList < Gem::TestCase
25
25
 
26
26
  def test_append
27
27
  sl = Gem::SourceList.new
28
+ sl << @uri
29
+ sl << @uri
30
+
31
+ assert_equal sl.to_a.size, 1
32
+
33
+ sl.clear
28
34
  source = (sl << @uri)
29
35
 
30
36
  assert_kind_of Gem::Source, source
@@ -146,6 +146,14 @@ class TestGemVersion < Gem::TestCase
146
146
  assert_less_than "1.0.0-1", "1"
147
147
  end
148
148
 
149
+ # modifying the segments of a version should not affect the segments of the cached version object
150
+ def test_segments
151
+ v('9.8.7').segments[2] += 1
152
+
153
+ refute_version_equal "9.8.8", "9.8.7"
154
+ assert_equal [9,8,7], v("9.8.7").segments
155
+ end
156
+
149
157
  # Asserts that +version+ is a prerelease.
150
158
 
151
159
  def assert_prerelease version
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rubygems-update
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.5.2
4
+ version: 2.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jim Weirich
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2016-02-01 00:00:00.000000000 Z
13
+ date: 2016-02-26 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: minitest
@@ -128,8 +128,8 @@ description: |-
128
128
 
129
129
  If you don't have RubyGems installed, you can still do it manually:
130
130
 
131
- * Download from: https://rubygems.org/pages/download
132
- * Unpack into a directory and cd there
131
+ * Download from: https://rubygems.org/pages/download, unpack, and cd there
132
+ * OR clone this repository and cd there
133
133
  * Install with: ruby setup.rb # you may need admin/root privilege
134
134
 
135
135
  For more details and other options, see:
@@ -555,7 +555,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
555
555
  version: '0'
556
556
  requirements: []
557
557
  rubyforge_project:
558
- rubygems_version: 2.5.1
558
+ rubygems_version: 2.5.2
559
559
  signing_key:
560
560
  specification_version: 4
561
561
  summary: RubyGems is a package management framework for Ruby