rubygems-update 1.3.6 → 1.3.7
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.
Potentially problematic release.
This version of rubygems-update might be problematic. Click here for more details.
- data.tar.gz.sig +0 -0
- data/ChangeLog +86 -0
- data/History.txt +34 -1
- data/Manifest.txt +6 -1
- data/Rakefile +79 -34
- data/lib/rubygems.rb +52 -30
- data/lib/rubygems/builder.rb +2 -0
- data/lib/rubygems/command.rb +12 -0
- data/lib/rubygems/command_manager.rb +17 -12
- data/lib/rubygems/commands/contents_command.rb +1 -1
- data/lib/rubygems/commands/dependency_command.rb +3 -1
- data/lib/rubygems/commands/environment_command.rb +3 -2
- data/lib/rubygems/commands/fetch_command.rb +7 -3
- data/lib/rubygems/commands/install_command.rb +2 -1
- data/lib/rubygems/commands/query_command.rb +16 -3
- data/lib/rubygems/commands/server_command.rb +5 -3
- data/lib/rubygems/commands/setup_command.rb +1 -1
- data/lib/rubygems/commands/unpack_command.rb +35 -23
- data/lib/rubygems/commands/update_command.rb +1 -1
- data/lib/rubygems/defaults.rb +4 -6
- data/lib/rubygems/dependency.rb +32 -6
- data/lib/rubygems/dependency_installer.rb +10 -3
- data/lib/rubygems/doc_manager.rb +5 -2
- data/lib/rubygems/errors.rb +35 -0
- data/lib/rubygems/exceptions.rb +10 -1
- data/lib/rubygems/indexer.rb +1 -1
- data/lib/rubygems/installer.rb +6 -5
- data/lib/rubygems/package.rb +6 -3
- data/lib/rubygems/package/f_sync_dir.rb +4 -3
- data/lib/rubygems/package/tar_header.rb +4 -3
- data/lib/rubygems/package/tar_output.rb +4 -3
- data/lib/rubygems/package/tar_reader.rb +4 -3
- data/lib/rubygems/package/tar_writer.rb +4 -3
- data/lib/rubygems/package_task.rb +4 -3
- data/lib/rubygems/platform.rb +4 -1
- data/lib/rubygems/remote_fetcher.rb +9 -3
- data/lib/rubygems/requirement.rb +5 -0
- data/lib/rubygems/security.rb +3 -3
- data/lib/rubygems/server.rb +33 -18
- data/lib/rubygems/source_index.rb +4 -4
- data/lib/rubygems/source_info_cache.rb +4 -2
- data/lib/rubygems/spec_fetcher.rb +33 -11
- data/lib/rubygems/specification.rb +40 -32
- data/lib/rubygems/test_utilities.rb +2 -2
- data/lib/rubygems/validator.rb +3 -4
- data/lib/rubygems/version.rb +1 -1
- data/test/gem_package_tar_test_case.rb +2 -2
- data/test/gemutilities.rb +15 -9
- data/test/insure_session.rb +1 -1
- data/test/plugin/exception/rubygems_plugin.rb +2 -0
- data/test/plugin/load/rubygems_plugin.rb +1 -0
- data/test/plugin/standarderror/rubygems_plugin.rb +2 -0
- data/test/rubygems/commands/crash_command.rb +5 -0
- data/test/rubygems_plugin.rb +5 -0
- data/test/simple_gem.rb +15 -15
- data/test/test_gem.rb +45 -2
- data/test/test_gem_command_manager.rb +14 -0
- data/test/test_gem_commands_contents_command.rb +7 -5
- data/test/test_gem_commands_environment_command.rb +3 -1
- data/test/test_gem_commands_fetch_command.rb +21 -1
- data/test/test_gem_commands_install_command.rb +2 -4
- data/test/test_gem_commands_query_command.rb +33 -6
- data/test/test_gem_commands_server_command.rb +9 -2
- data/test/test_gem_commands_uninstall_command.rb +4 -2
- data/test/test_gem_commands_unpack_command.rb +46 -2
- data/test/test_gem_config_file.rb +2 -0
- data/test/test_gem_dependency.rb +11 -0
- data/test/test_gem_doc_manager.rb +1 -1
- data/test/test_gem_indexer.rb +2 -2
- data/test/test_gem_installer.rb +1 -1
- data/test/test_gem_package_tar_input.rb +1 -1
- data/test/test_gem_package_tar_writer.rb +3 -3
- data/test/test_gem_platform.rb +19 -0
- data/test/test_gem_server.rb +11 -0
- data/test/test_gem_source_index.rb +2 -2
- data/test/test_gem_spec_fetcher.rb +42 -0
- data/test/test_gem_specification.rb +46 -7
- data/util/{gem_prelude.rb.template → gem_prelude.rb} +53 -23
- metadata +16 -6
- 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.
|
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
|
-
"
|
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]
|
data/lib/rubygems/doc_manager.rb
CHANGED
@@ -179,7 +179,10 @@ class Gem::DocManager
|
|
179
179
|
r = RDoc::RDoc.new
|
180
180
|
|
181
181
|
old_pwd = Dir.pwd
|
182
|
-
Dir.chdir
|
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
|
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
|
data/lib/rubygems/exceptions.rb
CHANGED
@@ -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
|
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
|
|
data/lib/rubygems/indexer.rb
CHANGED
@@ -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::
|
323
|
+
<generator>RubyGems v#{Gem::VERSION}</generator>
|
324
324
|
<docs>http://cyber.law.harvard.edu/rss/rss.html</docs>
|
325
325
|
HEADER
|
326
326
|
|
data/lib/rubygems/installer.rb
CHANGED
@@ -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
|
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::
|
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(
|
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
|
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
|
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,
|
data/lib/rubygems/package.rb
CHANGED
@@ -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
|
data/lib/rubygems/platform.rb
CHANGED
@@ -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.
|
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::
|
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,
|
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
|
data/lib/rubygems/requirement.rb
CHANGED
@@ -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
|
data/lib/rubygems/security.rb
CHANGED
@@ -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
|
#
|
data/lib/rubygems/server.rb
CHANGED
@@ -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
|
-
|
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
|
-
@
|
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
|
-
@
|
448
|
+
@spec_dirs = @gem_dirs.map do |gem_dir|
|
449
|
+
spec_dir = File.join gem_dir, 'specifications'
|
444
450
|
|
445
|
-
|
446
|
-
|
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
|
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
|
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
|
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
|
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
|
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::
|
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::
|
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::
|
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("#{@
|
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
|
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(@
|
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
|
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
|
839
|
+
add_date res
|
825
840
|
|
826
841
|
index = @source_index.to_yaml
|
827
842
|
|