rubygems-update 1.3.6 → 1.3.7

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 (80) hide show
  1. data.tar.gz.sig +0 -0
  2. data/ChangeLog +86 -0
  3. data/History.txt +34 -1
  4. data/Manifest.txt +6 -1
  5. data/Rakefile +79 -34
  6. data/lib/rubygems.rb +52 -30
  7. data/lib/rubygems/builder.rb +2 -0
  8. data/lib/rubygems/command.rb +12 -0
  9. data/lib/rubygems/command_manager.rb +17 -12
  10. data/lib/rubygems/commands/contents_command.rb +1 -1
  11. data/lib/rubygems/commands/dependency_command.rb +3 -1
  12. data/lib/rubygems/commands/environment_command.rb +3 -2
  13. data/lib/rubygems/commands/fetch_command.rb +7 -3
  14. data/lib/rubygems/commands/install_command.rb +2 -1
  15. data/lib/rubygems/commands/query_command.rb +16 -3
  16. data/lib/rubygems/commands/server_command.rb +5 -3
  17. data/lib/rubygems/commands/setup_command.rb +1 -1
  18. data/lib/rubygems/commands/unpack_command.rb +35 -23
  19. data/lib/rubygems/commands/update_command.rb +1 -1
  20. data/lib/rubygems/defaults.rb +4 -6
  21. data/lib/rubygems/dependency.rb +32 -6
  22. data/lib/rubygems/dependency_installer.rb +10 -3
  23. data/lib/rubygems/doc_manager.rb +5 -2
  24. data/lib/rubygems/errors.rb +35 -0
  25. data/lib/rubygems/exceptions.rb +10 -1
  26. data/lib/rubygems/indexer.rb +1 -1
  27. data/lib/rubygems/installer.rb +6 -5
  28. data/lib/rubygems/package.rb +6 -3
  29. data/lib/rubygems/package/f_sync_dir.rb +4 -3
  30. data/lib/rubygems/package/tar_header.rb +4 -3
  31. data/lib/rubygems/package/tar_output.rb +4 -3
  32. data/lib/rubygems/package/tar_reader.rb +4 -3
  33. data/lib/rubygems/package/tar_writer.rb +4 -3
  34. data/lib/rubygems/package_task.rb +4 -3
  35. data/lib/rubygems/platform.rb +4 -1
  36. data/lib/rubygems/remote_fetcher.rb +9 -3
  37. data/lib/rubygems/requirement.rb +5 -0
  38. data/lib/rubygems/security.rb +3 -3
  39. data/lib/rubygems/server.rb +33 -18
  40. data/lib/rubygems/source_index.rb +4 -4
  41. data/lib/rubygems/source_info_cache.rb +4 -2
  42. data/lib/rubygems/spec_fetcher.rb +33 -11
  43. data/lib/rubygems/specification.rb +40 -32
  44. data/lib/rubygems/test_utilities.rb +2 -2
  45. data/lib/rubygems/validator.rb +3 -4
  46. data/lib/rubygems/version.rb +1 -1
  47. data/test/gem_package_tar_test_case.rb +2 -2
  48. data/test/gemutilities.rb +15 -9
  49. data/test/insure_session.rb +1 -1
  50. data/test/plugin/exception/rubygems_plugin.rb +2 -0
  51. data/test/plugin/load/rubygems_plugin.rb +1 -0
  52. data/test/plugin/standarderror/rubygems_plugin.rb +2 -0
  53. data/test/rubygems/commands/crash_command.rb +5 -0
  54. data/test/rubygems_plugin.rb +5 -0
  55. data/test/simple_gem.rb +15 -15
  56. data/test/test_gem.rb +45 -2
  57. data/test/test_gem_command_manager.rb +14 -0
  58. data/test/test_gem_commands_contents_command.rb +7 -5
  59. data/test/test_gem_commands_environment_command.rb +3 -1
  60. data/test/test_gem_commands_fetch_command.rb +21 -1
  61. data/test/test_gem_commands_install_command.rb +2 -4
  62. data/test/test_gem_commands_query_command.rb +33 -6
  63. data/test/test_gem_commands_server_command.rb +9 -2
  64. data/test/test_gem_commands_uninstall_command.rb +4 -2
  65. data/test/test_gem_commands_unpack_command.rb +46 -2
  66. data/test/test_gem_config_file.rb +2 -0
  67. data/test/test_gem_dependency.rb +11 -0
  68. data/test/test_gem_doc_manager.rb +1 -1
  69. data/test/test_gem_indexer.rb +2 -2
  70. data/test/test_gem_installer.rb +1 -1
  71. data/test/test_gem_package_tar_input.rb +1 -1
  72. data/test/test_gem_package_tar_writer.rb +3 -3
  73. data/test/test_gem_platform.rb +19 -0
  74. data/test/test_gem_server.rb +11 -0
  75. data/test/test_gem_source_index.rb +2 -2
  76. data/test/test_gem_spec_fetcher.rb +42 -0
  77. data/test/test_gem_specification.rb +46 -7
  78. data/util/{gem_prelude.rb.template → gem_prelude.rb} +53 -23
  79. metadata +16 -6
  80. metadata.gz.sig +0 -0
@@ -69,6 +69,10 @@ class Gem::DependencyInstaller
69
69
 
70
70
  @install_dir = options[:install_dir] || Gem.dir
71
71
  @cache_dir = options[:cache_dir] || @install_dir
72
+
73
+ # Set with any errors that SpecFetcher finds while search through
74
+ # gemspecs for a dep
75
+ @errors = nil
72
76
  end
73
77
 
74
78
  ##
@@ -78,6 +82,8 @@ class Gem::DependencyInstaller
78
82
  # local gems preferred over remote gems.
79
83
 
80
84
  def find_gems_with_sources(dep)
85
+ # Reset the errors
86
+ @errors = nil
81
87
  gems_and_sources = []
82
88
 
83
89
  if @domain == :both or @domain == :local then
@@ -99,7 +105,7 @@ class Gem::DependencyInstaller
99
105
  (requirements.length > 1 or
100
106
  (requirements.first != ">=" and requirements.first != ">"))
101
107
 
102
- found = Gem::SpecFetcher.fetcher.fetch dep, all, true, dep.prerelease?
108
+ found, @errors = Gem::SpecFetcher.fetcher.fetch_with_errors dep, all, true, dep.prerelease?
103
109
 
104
110
  gems_and_sources.push(*found)
105
111
 
@@ -204,8 +210,9 @@ class Gem::DependencyInstaller
204
210
  end
205
211
 
206
212
  if spec_and_source.nil? then
207
- raise Gem::GemNotFoundException,
208
- "could not find gem #{gem_name} locally or in a repository"
213
+ raise Gem::GemNotFoundException.new(
214
+ "Could not find a valid gem '#{gem_name}' (#{version}) locally or in a repository",
215
+ gem_name, version, @errors)
209
216
  end
210
217
 
211
218
  @specs_and_sources = [spec_and_source]
@@ -179,7 +179,10 @@ class Gem::DocManager
179
179
  r = RDoc::RDoc.new
180
180
 
181
181
  old_pwd = Dir.pwd
182
- Dir.chdir(@spec.full_gem_path)
182
+ Dir.chdir @spec.full_gem_path
183
+
184
+ say "rdoc #{args.join ' '}" if Gem.configuration.really_verbose
185
+
183
186
  begin
184
187
  r.document args
185
188
  rescue Errno::EACCES => e
@@ -193,7 +196,7 @@ class Gem::DocManager
193
196
  Gem.configuration.backtrace
194
197
  ui.errs.puts "(continuing with the rest of the installation)"
195
198
  ensure
196
- Dir.chdir(old_pwd)
199
+ Dir.chdir old_pwd
197
200
  end
198
201
  end
199
202
 
@@ -0,0 +1,35 @@
1
+ class Gem::ErrorReason; end
2
+
3
+ # Generated when trying to lookup a gem to indicate that the gem
4
+ # was found, but that it isn't usable on the current platform.
5
+ #
6
+ # fetch and install read these and report them to the user to aid
7
+ # in figuring out why a gem couldn't be installed.
8
+ #
9
+ class Gem::PlatformMismatch < Gem::ErrorReason
10
+
11
+ attr_reader :name
12
+ attr_reader :version
13
+ attr_reader :platforms
14
+
15
+ def initialize(name, version)
16
+ @name = name
17
+ @version = version
18
+ @platforms = []
19
+ end
20
+
21
+ def add_platform(platform)
22
+ @platforms << platform
23
+ end
24
+
25
+ def wordy
26
+ prefix = "Found #{@name} (#{@version})"
27
+
28
+ if @platforms.size == 1
29
+ "#{prefix}, but was for platform #{@platforms[0]}"
30
+ else
31
+ "#{prefix}, but was for platforms #{@platforms.join(' ,')}"
32
+ end
33
+ end
34
+
35
+ end
@@ -37,7 +37,16 @@ class Gem::FormatException < Gem::Exception
37
37
  attr_accessor :file_path
38
38
  end
39
39
 
40
- class Gem::GemNotFoundException < Gem::Exception; end
40
+ class Gem::GemNotFoundException < Gem::Exception
41
+ def initialize(msg, name=nil, version=nil, errors=nil)
42
+ super msg
43
+ @name = name
44
+ @version = version
45
+ @errors = errors
46
+ end
47
+
48
+ attr_reader :name, :version, :errors
49
+ end
41
50
 
42
51
  class Gem::InstallError < Gem::Exception; end
43
52
 
@@ -320,7 +320,7 @@ class Gem::Indexer
320
320
  <title>#{rss_title}</title>
321
321
  <link>http://#{rss_host}</link>
322
322
  <description>Recently released gems from http://#{rss_host}</description>
323
- <generator>RubyGems v#{Gem::RubyGemsVersion}</generator>
323
+ <generator>RubyGems v#{Gem::VERSION}</generator>
324
324
  <docs>http://cyber.law.harvard.edu/rss/rss.html</docs>
325
325
  HEADER
326
326
 
@@ -133,7 +133,8 @@ class Gem::Installer
133
133
  end
134
134
 
135
135
  FileUtils.mkdir_p @gem_home
136
- raise Gem::FilePermissionError, @gem_home unless File.writable? @gem_home
136
+ raise Gem::FilePermissionError, @gem_home unless
137
+ options[:unpack] or File.writable? @gem_home
137
138
 
138
139
  @spec = @format.spec
139
140
 
@@ -165,7 +166,7 @@ class Gem::Installer
165
166
  end
166
167
 
167
168
  if rrgv = @spec.required_rubygems_version then
168
- unless rrgv.satisfied_by? Gem::Version.new(Gem::RubyGemsVersion) then
169
+ unless rrgv.satisfied_by? Gem::Version.new(Gem::VERSION) then
169
170
  raise Gem::InstallError,
170
171
  "#{@spec.name} requires RubyGems version #{rrgv}. " +
171
172
  "Try 'gem update --system' to update RubyGems itself."
@@ -270,7 +271,7 @@ class Gem::Installer
270
271
  ##
271
272
  # Creates windows .bat files for easy running of commands
272
273
 
273
- def generate_windows_script(bindir, filename)
274
+ def generate_windows_script(filename, bindir)
274
275
  if Gem.win_platform? then
275
276
  script_name = filename + ".bat"
276
277
  script_path = File.join bindir, File.basename(script_name)
@@ -295,7 +296,7 @@ class Gem::Installer
295
296
 
296
297
  @spec.executables.each do |filename|
297
298
  filename.untaint
298
- bin_path = File.expand_path File.join(@gem_dir, @spec.bindir, filename)
299
+ bin_path = File.expand_path "#{@spec.bindir}/#{filename}", @gem_dir
299
300
  mode = File.stat(bin_path).mode | 0111
300
301
  File.chmod mode, bin_path
301
302
 
@@ -329,7 +330,7 @@ class Gem::Installer
329
330
 
330
331
  say bin_script_path if Gem.configuration.really_verbose
331
332
 
332
- generate_windows_script bindir, filename
333
+ generate_windows_script filename, bindir
333
334
  #else
334
335
  # FileUtils.rm_f bin_script_path
335
336
  # FileUtils.cp exec_path, bin_script_path,
@@ -1,7 +1,8 @@
1
- #++
2
- # Copyright (C) 2004 Mauricio Julio Fern�ndez Pradier
3
- # See LICENSE.txt for additional licensing information.
1
+ # -*- coding: utf-8 -*-
4
2
  #--
3
+ # Copyright (C) 2004 Mauricio Julio Fernández Pradier
4
+ # See LICENSE.txt for additional licensing information.
5
+ #++
5
6
 
6
7
  require 'fileutils'
7
8
  require 'find'
@@ -12,8 +13,10 @@ require 'zlib'
12
13
  require 'rubygems/security'
13
14
  require 'rubygems/specification'
14
15
 
16
+ ##
15
17
  # Wrapper for FileUtils meant to provide logging and additional operations if
16
18
  # needed.
19
+
17
20
  class Gem::FileOperations
18
21
 
19
22
  def initialize(logger = nil)
@@ -1,7 +1,8 @@
1
- #++
2
- # Copyright (C) 2004 Mauricio Julio Fern�ndez Pradier
3
- # See LICENSE.txt for additional licensing information.
1
+ # -*- coding: utf-8 -*-
4
2
  #--
3
+ # Copyright (C) 2004 Mauricio Julio Fernández Pradier
4
+ # See LICENSE.txt for additional licensing information.
5
+ #++
5
6
 
6
7
  module Gem::Package::FSyncDir
7
8
 
@@ -1,7 +1,8 @@
1
- #++
2
- # Copyright (C) 2004 Mauricio Julio Fern�ndez Pradier
3
- # See LICENSE.txt for additional licensing information.
1
+ # -*- coding: utf-8 -*-
4
2
  #--
3
+ # Copyright (C) 2004 Mauricio Julio Fernández Pradier
4
+ # See LICENSE.txt for additional licensing information.
5
+ #++
5
6
 
6
7
  ##
7
8
  #--
@@ -1,7 +1,8 @@
1
- #++
2
- # Copyright (C) 2004 Mauricio Julio Fern�ndez Pradier
3
- # See LICENSE.txt for additional licensing information.
1
+ # -*- coding: utf-8 -*-
4
2
  #--
3
+ # Copyright (C) 2004 Mauricio Julio Fernández Pradier
4
+ # See LICENSE.txt for additional licensing information.
5
+ #++
5
6
 
6
7
  ##
7
8
  # TarOutput is a wrapper to TarWriter that builds gem-format tar file.
@@ -1,7 +1,8 @@
1
- #++
2
- # Copyright (C) 2004 Mauricio Julio Fern�ndez Pradier
3
- # See LICENSE.txt for additional licensing information.
1
+ # -*- coding: utf-8 -*-
4
2
  #--
3
+ # Copyright (C) 2004 Mauricio Julio Fernández Pradier
4
+ # See LICENSE.txt for additional licensing information.
5
+ #++
5
6
 
6
7
  ##
7
8
  # TarReader reads tar files and allows iteration over their items
@@ -1,7 +1,8 @@
1
- #++
2
- # Copyright (C) 2004 Mauricio Julio Fern�ndez Pradier
3
- # See LICENSE.txt for additional licensing information.
1
+ # -*- coding: utf-8 -*-
4
2
  #--
3
+ # Copyright (C) 2004 Mauricio Julio Fernández Pradier
4
+ # See LICENSE.txt for additional licensing information.
5
+ #++
5
6
 
6
7
  ##
7
8
  # Allows writing of tar files
@@ -41,7 +41,7 @@ require 'rake/packagetask'
41
41
  #
42
42
  # require 'rubygems'
43
43
  # require 'rubygems/package_task'
44
- #
44
+ #
45
45
  # spec = Gem::Specification.new do |s|
46
46
  # s.platform = Gem::Platform::RUBY
47
47
  # s.summary = "Ruby based make-like utility."
@@ -56,7 +56,7 @@ require 'rake/packagetask'
56
56
  # and dependencies are specified in standard Ruby syntax.
57
57
  # EOF
58
58
  # end
59
- #
59
+ #
60
60
  # Gem::PackageTask.new(spec) do |pkg|
61
61
  # pkg.need_zip = true
62
62
  # pkg.need_tar = true
@@ -102,6 +102,7 @@ class Gem::PackageTask < Rake::PackageTask
102
102
 
103
103
  gem_file = gem_spec.file_name
104
104
  gem_path = File.join package_dir, gem_file
105
+ gem_dir = File.join package_dir, gem_spec.full_name
105
106
 
106
107
  desc "Build the gem file #{gem_file}"
107
108
  task :gem => [gem_path]
@@ -109,7 +110,7 @@ class Gem::PackageTask < Rake::PackageTask
109
110
  trace = Rake.application.options.trace
110
111
  Gem.configuration.verbose = trace
111
112
 
112
- file gem_path => [package_dir] + @gem_spec.files do
113
+ file gem_path => [package_dir, gem_dir] + @gem_spec.files do
113
114
  when_writing "Creating #{gem_spec.file_name}" do
114
115
  Gem::Builder.new(gem_spec).build
115
116
  verbose trace do
@@ -70,6 +70,8 @@ class Gem::Platform
70
70
  when /hpux(\d+)/ then [ 'hpux', $1 ]
71
71
  when /^java$/, /^jruby$/ then [ 'java', nil ]
72
72
  when /^java([\d.]*)/ then [ 'java', $1 ]
73
+ when /^dotnet$/ then [ 'dotnet', nil ]
74
+ when /^dotnet([\d.]*)/ then [ 'dotnet', $1 ]
73
75
  when /linux/ then [ 'linux', $1 ]
74
76
  when /mingw32/ then [ 'mingw32', nil ]
75
77
  when /(mswin\d+)(\_(\d+))?/ then
@@ -103,7 +105,7 @@ class Gem::Platform
103
105
  def to_s
104
106
  to_a.compact.join '-'
105
107
  end
106
-
108
+
107
109
  def empty?
108
110
  to_s.empty?
109
111
  end
@@ -148,6 +150,7 @@ class Gem::Platform
148
150
  when /^i686-darwin(\d)/ then ['x86', 'darwin', $1 ]
149
151
  when /^i\d86-linux/ then ['x86', 'linux', nil ]
150
152
  when 'java', 'jruby' then [nil, 'java', nil ]
153
+ when /dotnet(\-(\d+\.\d+))?/ then ['universal','dotnet', $2 ]
151
154
  when /mswin32(\_(\d+))?/ then ['x86', 'mswin32', $2 ]
152
155
  when 'powerpc-darwin' then ['powerpc', 'darwin', nil ]
153
156
  when /powerpc-darwin(\d)/ then ['powerpc', 'darwin', $1 ]
@@ -88,7 +88,9 @@ class Gem::RemoteFetcher
88
88
 
89
89
  # Always escape URI's to deal with potential spaces and such
90
90
  unless URI::Generic === source_uri
91
- source_uri = URI.parse(URI.escape(source_uri))
91
+ source_uri = URI.parse(URI.const_defined?(:DEFAULT_PARSER) ?
92
+ URI::DEFAULT_PARSER.escape(source_uri) :
93
+ URI.escape(source_uri))
92
94
  end
93
95
 
94
96
  scheme = source_uri.scheme
@@ -252,6 +254,8 @@ class Gem::RemoteFetcher
252
254
  connection.start unless connection.started?
253
255
 
254
256
  connection
257
+ rescue Errno::EHOSTDOWN => e
258
+ raise FetchError.new(e.message, uri)
255
259
  end
256
260
 
257
261
  ##
@@ -309,7 +313,7 @@ class Gem::RemoteFetcher
309
313
  request.basic_auth uri.user, uri.password
310
314
  end
311
315
 
312
- ua = "RubyGems/#{Gem::RubyGemsVersion} #{Gem::Platform.local}"
316
+ ua = "RubyGems/#{Gem::VERSION} #{Gem::Platform.local}"
313
317
  ua << " Ruby/#{RUBY_VERSION} (#{RUBY_RELEASE_DATE}"
314
318
  ua << " patchlevel #{RUBY_PATCHLEVEL}" if defined? RUBY_PATCHLEVEL
315
319
  ua << ")"
@@ -351,7 +355,9 @@ class Gem::RemoteFetcher
351
355
  # HACK work around EOFError bug in Net::HTTP
352
356
  # NOTE Errno::ECONNABORTED raised a lot on Windows, and make impossible
353
357
  # to install gems.
354
- rescue EOFError, Errno::ECONNABORTED, Errno::ECONNRESET, Errno::EPIPE
358
+ rescue EOFError, Timeout::Error,
359
+ Errno::ECONNABORTED, Errno::ECONNRESET, Errno::EPIPE
360
+
355
361
  requests = @requests[connection.object_id]
356
362
  say "connection reset after #{requests} requests, retrying" if
357
363
  Gem.configuration.really_verbose
@@ -93,9 +93,14 @@ class Gem::Requirement
93
93
  requirements.uniq!
94
94
 
95
95
  requirements << ">= 0" if requirements.empty?
96
+ @none = (requirements == ">= 0")
96
97
  @requirements = requirements.map! { |r| self.class.parse r }
97
98
  end
98
99
 
100
+ def none?
101
+ @none ||= (to_s == ">= 0")
102
+ end
103
+
99
104
  def as_list # :nodoc:
100
105
  requirements.map { |op, version| "#{op} #{version}" }
101
106
  end
@@ -218,7 +218,7 @@ require 'rubygems/gem_openssl'
218
218
  #
219
219
  # # signing key (still kept in an undisclosed location!)
220
220
  # s.signing_key = '/mnt/floppy/alf-private_key.pem'
221
- #
221
+ #
222
222
  # # certificate chain (includes the issuer certificate now too)
223
223
  # s.cert_chain = ['/home/alf/doc/seattlerb-public_cert.pem',
224
224
  # '/home/alf/doc/alf_at_seattle-public_cert.pem']
@@ -274,7 +274,7 @@ require 'rubygems/gem_openssl'
274
274
  # # convert a PEM format X509 certificate into DER format:
275
275
  # # (note: Windows .cer files are X509 certificates in DER format)
276
276
  # $ openssl x509 -in input.pem -outform der -out output.der
277
- #
277
+ #
278
278
  # # print out the certificate in a human-readable format:
279
279
  # $ openssl x509 -in input.pem -noout -text
280
280
  #
@@ -282,7 +282,7 @@ require 'rubygems/gem_openssl'
282
282
  #
283
283
  # # convert a PEM format RSA key into DER format:
284
284
  # $ openssl rsa -in input_key.pem -outform der -out output_key.der
285
- #
285
+ #
286
286
  # # print out the key in a human readable format:
287
287
  # $ openssl rsa -in input_key.pem -noout -text
288
288
  #
@@ -33,6 +33,8 @@ require 'rubygems/doc_manager'
33
33
 
34
34
  class Gem::Server
35
35
 
36
+ attr_reader :spec_dirs
37
+
36
38
  include ERB::Util
37
39
  include Gem::UserInteraction
38
40
 
@@ -430,29 +432,36 @@ div.method-source-code pre { color: #ffdead; overflow: hidden; }
430
432
  options[:addresses]).run
431
433
  end
432
434
 
433
- def initialize(gem_dir, port, daemon, addresses = nil)
435
+ ##
436
+ # Only the first directory in gem_dirs is used for serving gems
437
+
438
+ def initialize(gem_dirs, port, daemon, addresses = nil)
434
439
  Socket.do_not_reverse_lookup = true
435
440
 
436
- @gem_dir = gem_dir
441
+ @gem_dirs = Array gem_dirs
437
442
  @port = port
438
443
  @daemon = daemon
439
444
  @addresses = addresses
440
445
  logger = WEBrick::Log.new nil, WEBrick::BasicLog::FATAL
441
446
  @server = WEBrick::HTTPServer.new :DoNotListen => true, :Logger => logger
442
447
 
443
- @spec_dir = File.join @gem_dir, 'specifications'
448
+ @spec_dirs = @gem_dirs.map do |gem_dir|
449
+ spec_dir = File.join gem_dir, 'specifications'
444
450
 
445
- unless File.directory? @spec_dir then
446
- raise ArgumentError, "#{@gem_dir} does not appear to be a gem repository"
451
+ unless File.directory? spec_dir then
452
+ raise ArgumentError, "#{gem_dir} does not appear to be a gem repository"
453
+ end
454
+
455
+ spec_dir
447
456
  end
448
457
 
449
- @source_index = Gem::SourceIndex.from_gems_in @spec_dir
458
+ @source_index = Gem::SourceIndex.from_gems_in(*@spec_dirs)
450
459
  end
451
460
 
452
461
  def Marshal(req, res)
453
462
  @source_index.refresh!
454
463
 
455
- res['date'] = File.stat(@spec_dir).mtime
464
+ add_date res
456
465
 
457
466
  index = Marshal.dump @source_index
458
467
 
@@ -471,12 +480,18 @@ div.method-source-code pre { color: #ffdead; overflow: hidden; }
471
480
  res.body << index
472
481
  end
473
482
 
483
+ def add_date res
484
+ res['date'] = @spec_dirs.map do |spec_dir|
485
+ File.stat(spec_dir).mtime
486
+ end.max
487
+ end
488
+
474
489
  def latest_specs(req, res)
475
490
  @source_index.refresh!
476
491
 
477
492
  res['content-type'] = 'application/x-gzip'
478
493
 
479
- res['date'] = File.stat(@spec_dir).mtime
494
+ add_date res
480
495
 
481
496
  specs = @source_index.latest_specs.sort.map do |spec|
482
497
  platform = spec.original_platform
@@ -535,7 +550,7 @@ div.method-source-code pre { color: #ffdead; overflow: hidden; }
535
550
  @source_index.refresh!
536
551
 
537
552
  res['content-type'] = 'text/plain'
538
- res['date'] = File.stat(@spec_dir).mtime
553
+ add_date res
539
554
 
540
555
  case req.request_uri.path
541
556
  when '/quick/index' then
@@ -586,7 +601,7 @@ div.method-source-code pre { color: #ffdead; overflow: hidden; }
586
601
 
587
602
  def root(req, res)
588
603
  @source_index.refresh!
589
- res['date'] = File.stat(@spec_dir).mtime
604
+ add_date res
590
605
 
591
606
  raise WEBrick::HTTPStatus::NotFound, "`#{req.path}' not found." unless
592
607
  req.path == '/'
@@ -630,16 +645,16 @@ div.method-source-code pre { color: #ffdead; overflow: hidden; }
630
645
  specs << {
631
646
  "authors" => "Chad Fowler, Rich Kilmer, Jim Weirich, Eric Hodel and others",
632
647
  "dependencies" => [],
633
- "doc_path" => "/doc_root/rubygems-#{Gem::RubyGemsVersion}/rdoc/index.html",
648
+ "doc_path" => "/doc_root/rubygems-#{Gem::VERSION}/rdoc/index.html",
634
649
  "executables" => [{"executable" => 'gem', "is_last" => true}],
635
650
  "only_one_executable" => true,
636
- "full_name" => "rubygems-#{Gem::RubyGemsVersion}",
651
+ "full_name" => "rubygems-#{Gem::VERSION}",
637
652
  "has_deps" => false,
638
653
  "homepage" => "http://docs.rubygems.org/",
639
654
  "name" => 'rubygems',
640
655
  "rdoc_installed" => true,
641
656
  "summary" => "RubyGems itself",
642
- "version" => Gem::RubyGemsVersion,
657
+ "version" => Gem::VERSION,
643
658
  }
644
659
 
645
660
  specs = specs.sort_by { |spec| [spec["name"].downcase, spec["version"]] }
@@ -718,7 +733,7 @@ div.method-source-code pre { color: #ffdead; overflow: hidden; }
718
733
  # documentation - just put it underneath the main doc folder.
719
734
 
720
735
  def show_rdoc_for_pattern(pattern, res)
721
- found_gems = Dir.glob("#{@gem_dir}/doc/#{pattern}").select {|path|
736
+ found_gems = Dir.glob("{#{@gem_dirs.join ','}}/doc/#{pattern}").select {|path|
722
737
  File.exist? File.join(path, 'rdoc/index.html')
723
738
  }
724
739
  case found_gems.length
@@ -771,7 +786,7 @@ div.method-source-code pre { color: #ffdead; overflow: hidden; }
771
786
 
772
787
  @server.mount_proc("/gem-server-rdoc-style.css") do |req, res|
773
788
  res['content-type'] = 'text/css'
774
- res['date'] = File.stat(@spec_dir).mtime
789
+ add_date res
775
790
  res.body << RDOC_CSS
776
791
  end
777
792
 
@@ -782,7 +797,7 @@ div.method-source-code pre { color: #ffdead; overflow: hidden; }
782
797
  paths = { "/gems" => "/cache/", "/doc_root" => "/doc/" }
783
798
  paths.each do |mount_point, mount_dir|
784
799
  @server.mount(mount_point, WEBrick::HTTPServlet::FileHandler,
785
- File.join(@gem_dir, mount_dir), true)
800
+ File.join(@gem_dirs.first, mount_dir), true)
786
801
  end
787
802
 
788
803
  trap("INT") { @server.shutdown; exit! }
@@ -794,7 +809,7 @@ div.method-source-code pre { color: #ffdead; overflow: hidden; }
794
809
  def specs(req, res)
795
810
  @source_index.refresh!
796
811
 
797
- res['date'] = File.stat(@spec_dir).mtime
812
+ add_date res
798
813
 
799
814
  specs = @source_index.sort.map do |_, spec|
800
815
  platform = spec.original_platform
@@ -821,7 +836,7 @@ div.method-source-code pre { color: #ffdead; overflow: hidden; }
821
836
  def yaml(req, res)
822
837
  @source_index.refresh!
823
838
 
824
- res['date'] = File.stat(@spec_dir).mtime
839
+ add_date res
825
840
 
826
841
  index = @source_index.to_yaml
827
842