rubygems-update 0.8.10 → 0.8.11

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of rubygems-update might be problematic. Click here for more details.

Files changed (51) hide show
  1. data/ChangeLog +66 -0
  2. data/README +17 -3
  3. data/Rakefile +29 -11
  4. data/bin/gem_mirror +67 -0
  5. data/examples/application/an-app.gemspec +2 -0
  6. data/lib/rubygems.rb +18 -3
  7. data/lib/rubygems/builder.rb +14 -1
  8. data/lib/rubygems/cmd_manager.rb +2 -0
  9. data/lib/rubygems/command.rb +26 -2
  10. data/lib/rubygems/custom_require.rb +30 -21
  11. data/lib/rubygems/format.rb +4 -4
  12. data/lib/rubygems/gem_commands.rb +161 -9
  13. data/lib/rubygems/gem_openssl.rb +34 -0
  14. data/lib/rubygems/gem_runner.rb +5 -1
  15. data/lib/rubygems/installer.rb +117 -38
  16. data/lib/rubygems/package.rb +135 -25
  17. data/lib/rubygems/remote_installer.rb +59 -29
  18. data/lib/rubygems/rubygems_version.rb +1 -1
  19. data/lib/rubygems/security.rb +478 -0
  20. data/lib/rubygems/specification.rb +48 -28
  21. data/post-install.rb +2 -1
  22. data/scripts/gemdoc.rb +2 -2
  23. data/scripts/specdoc.rb +25 -24
  24. data/scripts/upload_gemdoc.rb +134 -0
  25. data/setup.rb +1 -1
  26. data/test/data/a-0.0.1.gem +0 -0
  27. data/test/data/a-0.0.2.gem +0 -0
  28. data/test/data/b-0.0.2.gem +0 -0
  29. data/test/data/c-1.2.gem +0 -0
  30. data/test/data/gemhome/cache/a-0.0.1.gem +0 -0
  31. data/test/data/gemhome/cache/a-0.0.2.gem +0 -0
  32. data/test/data/gemhome/cache/b-0.0.2.gem +0 -0
  33. data/test/data/gemhome/cache/c-1.2.gem +0 -0
  34. data/test/data/gemhome/specifications/a-0.0.1.gemspec +1 -1
  35. data/test/data/gemhome/specifications/a-0.0.2.gemspec +1 -1
  36. data/test/data/gemhome/specifications/b-0.0.2.gemspec +1 -1
  37. data/test/data/gemhome/specifications/c-1.2.gemspec +1 -1
  38. data/test/data/one/one-0.0.1.gem +0 -0
  39. data/test/fake_certlib/openssl.rb +1 -0
  40. data/test/functional.rb +49 -14
  41. data/test/gemutilities.rb +69 -5
  42. data/test/test_cached_fetcher.rb +5 -7
  43. data/test/test_file_list.rb +96 -0
  44. data/test/test_gempaths.rb +36 -34
  45. data/test/test_installer.rb +214 -0
  46. data/test/test_local_cache.rb +45 -102
  47. data/test/test_parse_commands.rb +3 -1
  48. data/test/test_remote_installer.rb +24 -5
  49. data/test/test_specific_extras.rb +40 -0
  50. data/test/test_specification.rb +106 -16
  51. metadata +14 -3
data/ChangeLog CHANGED
@@ -1,5 +1,71 @@
1
+ 2005-07-08 Jim Weirich <jim@weirichhouse.org>
2
+
3
+ * Preparing for release 0.8.11.
4
+
5
+ 2005-06-12 Jim Weirich <jim@weirichhouse.org>
6
+
7
+ * lib/rubygems/installer.rb
8
+ (Gem::Installer::installation_satisfies_dependency): Refactored
9
+ dependency check into ensure_dependency! and
10
+ installation_satisfies_dependency?.
11
+
12
+ 2005-06-12 Chad Fowler <chad@chadfowler.com>
13
+ * lib/rubygems.rb,lib/rubygems/installer.rb: Applied Mark Hubbart's
14
+ * lib/rubygems/remote_installer.rb: Applied David Glasser's install-
15
+ * Applied Paul Duncan's incredibly complete gem signing patch.
16
+ Thanks, Paul!
17
+ * lib/rubygems/installer.rb: Fixed bug in installer that caused
18
+ dependency installation not to work.
19
+
20
+ 2005-06-06 Chad Fowler <chad@chadfowler.com>
21
+ * lib/rubygems/specification.rb: Fixed Erik hatcher's reported bug
22
+ of gem directories having "-" at the end of their names (e.g.
23
+ "BlueCloth-1.0.0-".
24
+
25
+ 2005-06-01 Jim Weirich <jim@weirichhouse.org>
26
+
27
+ * scripts/specdoc.rb (_resolve_links): Updated to generate hieraki
28
+ format so it can be included in the docs.rubygems.org site.
29
+
30
+ * test/test_specification.rb (TestSpecification::test_to_ruby):
31
+ Fixed test on date that hard-coded a specific date.
32
+
33
+ 2005-05-29 Jim Weirich <jim@weirichhouse.org>
34
+
35
+ * Changes from the Seattle Code fest: (1) Package list command
36
+ (e.g. gem inspect GEM). (2) .gemrc settings now allow cvsrc like
37
+ options to set defaults per subcommand. (3) The autorequire spec
38
+ attribute will now accept a list. (4) Binwrappers vs symlinks
39
+ (more info to follow). (5) Substituted Time for Date in specs,
40
+ increasing performance dramatically in an important area.
41
+
42
+ 2005-05-04 Jim Weirich <jim@weirichhouse.org>
43
+
44
+ * lib/rubygems.rb (Gem::Exception::find_home): Changed rescue
45
+ clause from Exception to StandardError. Exception doesn't seem to
46
+ catch everything ... I'm not sure I understand why.
47
+
48
+ 2005-04-29 Chad Fowler <chad@chadfowler.com>
49
+ * lib/rubygems/specifiation.rb: Marcel Molina's patch to discover
50
+ which attributes in the spec are Array attributes.
51
+
52
+ 2005-04-27 Chad Fowler <chad@chadfowler.com>
53
+ * lib/rubygems/gem_commands.rb: -y is now a synonym for
54
+ --include-dependencies
55
+
56
+ 2005-04-21 Chad Fowler <chad@chadfowler.com>
57
+ * lib/rubygems/installer.rb: Added non-require_gem dependency check
58
+ for installation.
59
+
60
+ 2005-04-03 Chad Fowler <chad@chadfowler.com>
61
+
62
+ * pre-install.rb: Added version check to RubyGems installation.
63
+
1
64
  2005-03-25 Jim Weirich <jim@weirichhouse.org>
2
65
 
66
+ * lib/rubygems/rubygems_version.rb (Gem): Created release for
67
+ 0.8.10.
68
+
3
69
  * lib/rubygems/gem_commands.rb
4
70
  (Gem::UpdateCommand::do_rubygems_update): Update --system now runs
5
71
  the ruby command directly rather than trying to load teh
data/README CHANGED
@@ -2,10 +2,19 @@
2
2
 
3
3
  (See Releases for release-specific information)
4
4
 
5
- == For user documentation (and installation instructions) see
5
+ == Installation
6
6
 
7
- * {Quick Introduction}[http://rubygems.rubyforge.org/wiki/wiki.pl?Quick_Introduction]
8
- * {User Guide}[http://rubygems.rubyforge.org/wiki/wiki.pl?UserGuide]
7
+ Get it from RubyForge (http://rubygems.rubyforge.org) and run (as root, if appropriate and necessary)
8
+
9
+ ruby setup.rb
10
+
11
+ For more details and other options, see:
12
+
13
+ * {User Guide/Installation}[http://docs.rubygems.org/read/chapter/3]
14
+
15
+ == For User Documentation, see
16
+
17
+ * {RubyGems User Guide}[http://docs.rubygems.org/read/book/1]
9
18
 
10
19
  == For developer docs see
11
20
 
@@ -43,8 +52,13 @@ RubyGems was originally developed at RubyConf 2003 by:
43
52
  * Dick Davies -- rasputnik(at)hellooperator.net
44
53
  * Mauricio Fernandez -- batsman.geo(at)yahoo.com
45
54
  * Simon Strandgaard -- neoneye(at)adslhome.dk
55
+ * Dave Glasser -- glasser(at)mit.edu
56
+ * Paul Duncan -- pabs(at)pablotron.org
46
57
  * Ville Aine -- vaine(at)cs.helsinki.fi
47
58
 
59
+
60
+ (If your name is missing, PLEASE let us know!)
61
+
48
62
  == Feedback
49
63
 
50
64
  Please provide us feedback at http://rubyforge.org/projects/rubygems
data/Rakefile CHANGED
@@ -30,12 +30,13 @@ CLOBBER.include(
30
30
  "test/temp",
31
31
  'test/data/gemhome',
32
32
  'test/data/*.gem',
33
- 'scripts/*.wiki',
33
+ 'scripts/*.hieraki',
34
34
  'data__',
35
35
  'html',
36
36
  'pkgs/sources/sources*.gem',
37
37
  '.config',
38
- '**/debug.log'
38
+ '**/debug.log',
39
+ 'logs'
39
40
  )
40
41
 
41
42
  task :default => [:test]
@@ -71,9 +72,9 @@ task :build_tests do
71
72
  end
72
73
 
73
74
  # Shortcuts for test targets
74
- task :ft => [:functional]
75
- task :ut => [:test]
76
- task :at => [:alltests]
75
+ task :tf => [:functional]
76
+ task :tu => [:test]
77
+ task :ta => [:alltests]
77
78
 
78
79
  task :gemtest do
79
80
  ruby %{-Ilib -rscripts/runtest -e 'run_tests("test/test_gempaths.rb", true)'}
@@ -190,19 +191,26 @@ end
190
191
 
191
192
  # Wiki Doc Targets
192
193
 
193
- desc "Build the Wiki documentation"
194
- task :wiki => ['scripts/gemdoc.wiki', 'scripts/specdoc.wiki']
194
+ desc "Upload the Hieraki Data"
195
+ task :upload => [:upload_gemdoc]
195
196
 
196
- file 'scripts/gemdoc.wiki' => ['scripts/gemdoc.rb', 'scripts/gemdoc.data'] do
197
+ task :upload_gemdoc => ['scripts/gemdoc.hieraki'] do
198
+ ruby %{scripts/upload_gemdoc.rb}
199
+ end
200
+
201
+ desc "Build the Hieraki documentation"
202
+ task :hieraki => ['scripts/gemdoc.hieraki', 'scripts/specdoc.hieraki']
203
+
204
+ file 'scripts/gemdoc.hieraki' => ['scripts/gemdoc.rb', 'scripts/gemdoc.data'] do
197
205
  chdir('scripts') do
198
- ruby %{-I../lib gemdoc.rb <gemdoc.data >gemdoc.wiki}
206
+ ruby %{-I../lib gemdoc.rb <gemdoc.data >gemdoc.hieraki}
199
207
  end
200
208
  end
201
209
 
202
- file 'scripts/specdoc.wiki' =>
210
+ file 'scripts/specdoc.hieraki' =>
203
211
  ['scripts/specdoc.rb', 'scripts/specdoc.data', 'scripts/specdoc.yaml'] do
204
212
  chdir('scripts') do
205
- ruby %{-I../lib specdoc.rb >specdoc.wiki}
213
+ ruby %{-I../lib specdoc.rb >specdoc.hieraki}
206
214
  end
207
215
  end
208
216
 
@@ -248,6 +256,16 @@ installation of RubyGems before this update can be applied.
248
256
  s.rubyforge_project = "rubygems"
249
257
  s.bindir = "bin" # Use these for applications.
250
258
  s.executables = ["update_rubygems"]
259
+ certdir = ENV['CERT_DIR']
260
+ if certdir
261
+ s.signing_key = File.join(certdir, 'gem-private_key.pem')
262
+ s.cert_chain = [File.join(certdir, 'gem-public_cert.pem')]
263
+ end
264
+ end
265
+
266
+ # Add console output about signing the Gem
267
+ file "pkg/#{Spec.full_name}.gem" do
268
+ puts "Signed with certificates in '#{ENV['CERT_DIR']}'" if ENV['CERT_DIR']
251
269
  end
252
270
 
253
271
  Rake::GemPackageTask.new(Spec) do |p| end
@@ -0,0 +1,67 @@
1
+ #! /usr/bin/ruby
2
+
3
+ # sample ~/.gemmirrorc:
4
+ #---
5
+ #-
6
+ # from: http://gems.rubyforge.org/
7
+ # to: /Users/glasser/MyGEMS/gems.rubyforge.org
8
+
9
+ require 'yaml'
10
+ require 'rubygems'
11
+ require 'open-uri'
12
+
13
+ config_file = File.join(Gem.user_home, '.gemmirrorrc')
14
+
15
+ raise "Config file #{config_file} not found" unless File.exist?(config_file)
16
+
17
+ mirrors = YAML.load_file(config_file)
18
+
19
+ mirrors.each do |mir|
20
+ raise "mirror missing 'from' field" unless mir.has_key?('from')
21
+ raise "mirror missing 'to' field" unless mir.has_key?('to')
22
+
23
+ get_from = mir['from']
24
+ save_to = mir['to']
25
+
26
+ raise "Directory not found: #{save_to}" unless File.exist?(save_to)
27
+ raise "Not a directory: #{save_to}" unless File.directory?(save_to)
28
+
29
+ gems_dir = save_to + "/gems"
30
+ if File.exist?(gems_dir)
31
+ raise "Not a directory: #{gems_dir}" unless File.directory?(gems_dir)
32
+ else
33
+ Dir.mkdir(gems_dir)
34
+ end
35
+
36
+ sourceindex_text = ''
37
+
38
+ open(get_from + "/yaml", "r") do |y|
39
+ sourceindex_text = y.read
40
+ open(save_to + "/yaml", "wb") do |out|
41
+ out.write(sourceindex_text)
42
+ end
43
+ end
44
+
45
+ sourceindex = YAML.load(sourceindex_text)
46
+
47
+ sourceindex.each do |fullname, gem|
48
+ gem_file = fullname + '.gem'
49
+ unless File.exists?(gems_dir + "/" + gem_file)
50
+ puts "fetching: " + gem_file
51
+
52
+ begin
53
+ open(get_from + "/gems/" + gem_file, "r") do |g|
54
+ contents = g.read
55
+ open(gems_dir + "/" + gem_file, "wb") do |out|
56
+ out.write(contents)
57
+ end
58
+ end
59
+ rescue
60
+ old_gf = gem_file
61
+ gem_file = gem_file.downcase
62
+ retry if old_gf != gem_file
63
+ puts $!
64
+ end
65
+ end
66
+ end
67
+ end
@@ -17,6 +17,8 @@ spec = Gem::Specification.new do |s|
17
17
  #s.extra_rdoc_files = ["README", "Changes.rdoc"]
18
18
  #s.default_executable = "myapp"
19
19
  s.bindir = "bin"
20
+ s.signing_key = '/Users/chadfowler/cvs/rubygems/gem-private_key.pem'
21
+ s.cert_chain = ['/Users/chadfowler/cvs/rubygems/gem-public_cert.pem']
20
22
  end
21
23
 
22
24
  if $0==__FILE__
@@ -114,6 +114,11 @@ module Gem
114
114
  File.join(Gem.user_home, '.gemrc')
115
115
  end
116
116
 
117
+ # Return the Ruby command to use to execute the Ruby interpreter.
118
+ def ruby
119
+ "ruby"
120
+ end
121
+
117
122
  ##
118
123
  # Activate a gem (i.e. add it to the Ruby load path). The gem
119
124
  # must satisfy all the specified version constraints. If
@@ -172,7 +177,12 @@ module Gem
172
177
  $:.unshift File.join(spec.full_gem_path, path)
173
178
  end
174
179
 
175
- require spec.autorequire if autorequire && spec.autorequire
180
+ if autorequire && spec.autorequire then
181
+ Array(spec.autorequire).each do |a_lib|
182
+ require a_lib
183
+ end
184
+ end
185
+
176
186
  return true
177
187
  end
178
188
 
@@ -327,7 +337,7 @@ module Gem
327
337
  end
328
338
  begin
329
339
  File.expand_path("~")
330
- rescue Exception => ex
340
+ rescue StandardError => ex
331
341
  if File::ALT_SEPARATOR
332
342
  "C:/"
333
343
  else
@@ -357,7 +367,11 @@ module Gem
357
367
  # fundamental RubyGems dependency, so it might as well be up the
358
368
  # top. -- Gavin Sinclair, 2004-12-12
359
369
  #
360
- File.join(Config::CONFIG['libdir'], 'ruby', 'gems', Config::CONFIG['ruby_version'])
370
+ if defined? RUBY_FRAMEWORK_VERSION
371
+ return File.join(File.dirname(Config::CONFIG["sitedir"]), "Gems")
372
+ else
373
+ File.join(Config::CONFIG['libdir'], 'ruby', 'gems', Config::CONFIG['ruby_version'])
374
+ end
361
375
  end
362
376
 
363
377
  private
@@ -380,6 +394,7 @@ end
380
394
 
381
395
  require 'rubygems/source_index'
382
396
  require 'rubygems/specification'
397
+ require 'rubygems/security'
383
398
  require 'rubygems/version'
384
399
  #require 'rubygems/loadpath_manager' # custom_require replaces this
385
400
  require 'rubygems/custom_require'
@@ -1,5 +1,7 @@
1
1
  require "rubygems/package"
2
+ require "rubygems/security"
2
3
  require "yaml"
4
+ require 'rubygems/gem_openssl'
3
5
 
4
6
  module Gem
5
7
 
@@ -26,9 +28,20 @@ module Gem
26
28
  @spec.mark_version
27
29
  @spec.validate
28
30
 
31
+ # if the signing key was specified, then load the file, and swap
32
+ # to the public key (TODO: we should probably just omit the
33
+ # signing key in favor of the signing certificate, but that's for
34
+ # the future, also the signature algorihtm should be configurable)
35
+ signer = nil
36
+ if @spec.respond_to?(:signing_key) && @spec.signing_key
37
+ signer = Gem::Security::Signer.new(@spec.signing_key, @spec.cert_chain)
38
+ @spec.signing_key = nil
39
+ @spec.cert_chain = signer.cert_chain.map { |cert| cert.to_s }
40
+ end
41
+
29
42
  file_name = @spec.full_name+".gem"
30
43
 
31
- Package.open(file_name, "w") do |pkg|
44
+ Package.open(file_name, "w", signer) do |pkg|
32
45
  pkg.metadata = @spec.to_yaml
33
46
  @spec.files.each do |file|
34
47
  next if File.directory? file
@@ -47,6 +47,8 @@ module Gem
47
47
  register_command EnvironmentCommand.new
48
48
  register_command SpecificationCommand.new
49
49
  register_command UnpackCommand.new
50
+ register_command CertCommand.new
51
+ register_command ContentsCommand.new
50
52
  end
51
53
 
52
54
  def register_command(command)
@@ -76,7 +76,7 @@ module Gem
76
76
  end
77
77
  end
78
78
 
79
- private
79
+ private
80
80
 
81
81
  def command_manager
82
82
  Gem::CommandManager.instance
@@ -91,7 +91,8 @@ module Gem
91
91
 
92
92
  def add_extra_args(args)
93
93
  result = []
94
- extra = Command.extra_args.dup
94
+ s_extra = Command.specific_extra_args(@command)
95
+ extra = Command.extra_args + s_extra
95
96
  while ! extra.empty?
96
97
  ex = []
97
98
  ex << extra.shift
@@ -172,6 +173,29 @@ module Gem
172
173
  @extra_args = value.split
173
174
  end
174
175
  end
176
+
177
+ def specific_extra_args(cmd)
178
+ @specific_extra_args ||= Hash.new do |h,k|
179
+ h[k] = Array.new
180
+ end
181
+
182
+ r = @specific_extra_args[cmd]
183
+ return r
184
+ end
185
+
186
+ def add_specific_extra_args(cmd,args)
187
+ # Access @specific_extra_args so that the hash is
188
+ # created for sure.
189
+ #
190
+ specific_extra_args(cmd)
191
+
192
+ if args.kind_of? String
193
+ args = args.split(/\s+/)
194
+ end
195
+
196
+ @specific_extra_args[cmd] = args
197
+ end
198
+
175
199
  end
176
200
 
177
201
  add_common_option('--source URL', 'Use URL as the remote source for gems') do |value, options|
@@ -4,15 +4,18 @@ module Kernel
4
4
  alias require__ require
5
5
 
6
6
  #
7
- # We replace Ruby's require with our own, which is capable of loading gems on demand.
7
+ # We replace Ruby's require with our own, which is capable of
8
+ # loading gems on demand.
8
9
  #
9
10
  # When you call <tt>require 'x'</tt>, this is what happens:
10
- # * If the file can be loaded from the existing Ruby loadpath, it is.
11
- # * Otherwise, installed gems are searched for a file that matches. If it's found in gem
12
- # 'y', that gem is activated (added to the loadpath).
11
+ # * If the file can be loaded from the existing Ruby loadpath, it
12
+ # is.
13
+ # * Otherwise, installed gems are searched for a file that matches.
14
+ # If it's found in gem 'y', that gem is activated (added to the
15
+ # loadpath).
13
16
  #
14
- # The normal <tt>require</tt> functionality of returning false if that file has already been
15
- # loaded is preserved.
17
+ # The normal <tt>require</tt> functionality of returning false if
18
+ # that file has already been loaded is preserved.
16
19
  #
17
20
  def require(path)
18
21
  require__ path
@@ -33,8 +36,8 @@ end # module Kernel
33
36
  module Gem
34
37
 
35
38
  #
36
- # GemPathSearcher has the capability to find loadable files inside gems. It generates data
37
- # up front to speed up searches later.
39
+ # GemPathSearcher has the capability to find loadable files inside
40
+ # gems. It generates data up front to speed up searches later.
38
41
  #
39
42
  class GemPathSearcher
40
43
 
@@ -42,10 +45,11 @@ module Gem
42
45
  # Initialise the data we need to make searches later.
43
46
  #
44
47
  def initialize
45
- # We want a record of all the installed gemspecs, in the order we wish to examine them.
48
+ # We want a record of all the installed gemspecs, in the order
49
+ # we wish to examine them.
46
50
  @gemspecs = init_gemspecs
47
- # Map gem spec to glob of full require_path directories. Preparing this information may
48
- # speed up searches later.
51
+ # Map gem spec to glob of full require_path directories.
52
+ # Preparing this information may speed up searches later.
49
53
  @lib_dirs = {}
50
54
  @gemspecs.each do |spec|
51
55
  @lib_dirs[spec.object_id] = lib_dirs(spec)
@@ -53,10 +57,12 @@ module Gem
53
57
  end
54
58
 
55
59
  #
56
- # Look in all the installed gems until a matching _path_ is found. Return the _gemspec_
57
- # of the gem where it was found. If no match is found, return nil.
60
+ # Look in all the installed gems until a matching _path_ is found.
61
+ # Return the _gemspec_ of the gem where it was found. If no match
62
+ # is found, return nil.
58
63
  #
59
- # The gems are searched in alphabetical order, and in reverse version order.
64
+ # The gems are searched in alphabetical order, and in reverse
65
+ # version order.
60
66
  #
61
67
  # For example:
62
68
  #
@@ -65,9 +71,10 @@ module Gem
65
71
  # find('rake/rdoctask') # -> (rake-0.4.12 spec)
66
72
  # find('foobarbaz') # -> nil
67
73
  #
68
- # Matching paths can have various suffixes ('.rb', '.so', and others), which may or may
69
- # not already be attached to _file_. This method doesn't care about the full filename
70
- # that matches; only that there is a match.
74
+ # Matching paths can have various suffixes ('.rb', '.so', and
75
+ # others), which may or may not already be attached to _file_.
76
+ # This method doesn't care about the full filename that matches;
77
+ # only that there is a match.
71
78
  #
72
79
  def find(path)
73
80
  @gemspecs.each do |spec|
@@ -81,17 +88,19 @@ module Gem
81
88
  SUFFIX_PATTERN = "{,.rb,.so,.bundle,.dll,.sl}"
82
89
 
83
90
  #
84
- # Attempts to find a matching path using the require_paths of the given _spec_.
91
+ # Attempts to find a matching path using the require_paths of the
92
+ # given _spec_.
85
93
  #
86
- # Some of the intermediate results are cached in @lib_dirs for speed.
94
+ # Some of the intermediate results are cached in @lib_dirs for
95
+ # speed.
87
96
  #
88
97
  def matching_file(spec, path) # :doc:
89
98
  glob = "#{@lib_dirs[spec.object_id]}/#{path}#{SUFFIX_PATTERN}"
90
99
  return true unless Dir[glob].select { |f| File.file?(f) }.empty?
91
100
  end
92
101
 
93
- # Return a list of all installed gemspecs, sorted by alphabetical order and in reverse
94
- # version order.
102
+ # Return a list of all installed gemspecs, sorted by alphabetical
103
+ # order and in reverse version order.
95
104
  def init_gemspecs
96
105
  Gem.source_index.map { |_, spec| spec }.sort { |a,b|
97
106
  (a.name <=> b.name).nonzero? || (b.version <=> a.version)