rubygems-update 2.0.0 → 2.0.2
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.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +2 -1
- data/.autotest +1 -0
- data/History.txt +32 -0
- data/Manifest.txt +2 -0
- data/lib/rubygems.rb +14 -5
- data/lib/rubygems/available_set.rb +70 -72
- data/lib/rubygems/commands/cert_command.rb +1 -0
- data/lib/rubygems/commands/query_command.rb +7 -7
- data/lib/rubygems/commands/setup_command.rb +21 -4
- data/lib/rubygems/commands/sources_command.rb +13 -0
- data/lib/rubygems/config_file.rb +29 -16
- data/lib/rubygems/defaults.rb +1 -1
- data/lib/rubygems/dependency_installer.rb +18 -10
- data/lib/rubygems/dependency_list.rb +1 -1
- data/lib/rubygems/dependency_resolver.rb +17 -4
- data/lib/rubygems/ext/builder.rb +0 -7
- data/lib/rubygems/ext/ext_conf_builder.rb +43 -8
- data/lib/rubygems/installer.rb +4 -4
- data/lib/rubygems/package.rb +2 -1
- data/lib/rubygems/rdoc.rb +10 -1
- data/lib/rubygems/remote_fetcher.rb +8 -3
- data/lib/rubygems/security.rb +21 -1
- data/lib/rubygems/security/policy.rb +2 -0
- data/lib/rubygems/source.rb +10 -0
- data/lib/rubygems/spec_fetcher.rb +38 -0
- data/lib/rubygems/specification.rb +1 -1
- data/lib/rubygems/ssl_certs/GeoTrust_Global_CA.pem +20 -0
- data/lib/rubygems/test_utilities.rb +6 -3
- data/test/rubygems/test_gem.rb +13 -1
- data/test/rubygems/test_gem_commands_fetch_command.rb +4 -0
- data/test/rubygems/test_gem_commands_query_command.rb +16 -0
- data/test/rubygems/test_gem_commands_setup_command.rb +18 -1
- data/test/rubygems/test_gem_commands_sources_command.rb +39 -0
- data/test/rubygems/test_gem_config_file.rb +15 -0
- data/test/rubygems/test_gem_dependency_installer.rb +55 -0
- data/test/rubygems/test_gem_dependency_resolver_api_set.rb +80 -0
- data/test/rubygems/test_gem_ext_ext_conf_builder.rb +1 -7
- data/test/rubygems/test_gem_installer.rb +92 -1
- data/test/rubygems/test_gem_remote_fetcher.rb +3 -0
- data/test/rubygems/test_gem_source.rb +11 -0
- data/test/rubygems/test_gem_source_list.rb +1 -1
- data/test/rubygems/test_gem_spec_fetcher.rb +80 -8
- data/test/rubygems/test_require.rb +19 -8
- metadata +14 -11
- metadata.gz.sig +0 -0
data/lib/rubygems/defaults.rb
CHANGED
@@ -88,6 +88,7 @@ class Gem::DependencyInstaller
|
|
88
88
|
# we absolutely must.
|
89
89
|
@minimal_deps = options[:minimal_deps]
|
90
90
|
|
91
|
+
@available = nil
|
91
92
|
@installed_gems = []
|
92
93
|
@toplevel_specs = nil
|
93
94
|
|
@@ -100,6 +101,22 @@ class Gem::DependencyInstaller
|
|
100
101
|
|
101
102
|
attr_reader :errors
|
102
103
|
|
104
|
+
##
|
105
|
+
# Creates an AvailableSet to install from based on +dep_or_name+ and
|
106
|
+
# +version+
|
107
|
+
|
108
|
+
def available_set_for dep_or_name, version # :nodoc:
|
109
|
+
if String === dep_or_name then
|
110
|
+
find_spec_by_name_and_version dep_or_name, version, @prerelease
|
111
|
+
else
|
112
|
+
dep = dep_or_name.dup
|
113
|
+
dep.prerelease = @prerelease
|
114
|
+
@available = find_gems_with_sources dep
|
115
|
+
end
|
116
|
+
|
117
|
+
@available.pick_best!
|
118
|
+
end
|
119
|
+
|
103
120
|
##
|
104
121
|
# Indicated, based on the requested domain, if local
|
105
122
|
# gems should be considered.
|
@@ -302,13 +319,7 @@ class Gem::DependencyInstaller
|
|
302
319
|
# separately.
|
303
320
|
|
304
321
|
def install dep_or_name, version = Gem::Requirement.default
|
305
|
-
|
306
|
-
find_spec_by_name_and_version dep_or_name, version, @prerelease
|
307
|
-
else
|
308
|
-
dep = dep_or_name.dup
|
309
|
-
dep.prerelease = @prerelease
|
310
|
-
@available = find_gems_with_sources(dep).pick_best!
|
311
|
-
end
|
322
|
+
available_set_for dep_or_name, version
|
312
323
|
|
313
324
|
@installed_gems = []
|
314
325
|
|
@@ -367,12 +378,9 @@ class Gem::DependencyInstaller
|
|
367
378
|
# it's documentation. Ideally the hook adder could decide whether to be in
|
368
379
|
# the background or not, and what to call it.
|
369
380
|
in_background "Installing documentation" do
|
370
|
-
start = Time.now
|
371
381
|
Gem.done_installing_hooks.each do |hook|
|
372
382
|
hook.call self, @installed_gems
|
373
383
|
end
|
374
|
-
finish = Time.now
|
375
|
-
say "Done installing documentation for #{@installed_gems.map(&:name).join(', ')} (#{(finish-start).to_i} sec)."
|
376
384
|
end unless Gem.done_installing_hooks.empty?
|
377
385
|
|
378
386
|
@installed_gems
|
@@ -69,6 +69,8 @@ module Gem
|
|
69
69
|
# and dependencies.
|
70
70
|
#
|
71
71
|
class APISpecification
|
72
|
+
attr_reader :set # :nodoc:
|
73
|
+
|
72
74
|
def initialize(set, api_data)
|
73
75
|
@set = set
|
74
76
|
@name = api_data[:name]
|
@@ -80,6 +82,14 @@ module Gem
|
|
80
82
|
|
81
83
|
attr_reader :name, :version, :dependencies
|
82
84
|
|
85
|
+
def == other # :nodoc:
|
86
|
+
self.class === other and
|
87
|
+
@set == other.set and
|
88
|
+
@name == other.name and
|
89
|
+
@version == other.version and
|
90
|
+
@dependencies == other.dependencies
|
91
|
+
end
|
92
|
+
|
83
93
|
def full_name
|
84
94
|
"#{@name}-#{@version}"
|
85
95
|
end
|
@@ -91,6 +101,7 @@ module Gem
|
|
91
101
|
class APISet
|
92
102
|
def initialize
|
93
103
|
@data = Hash.new { |h,k| h[k] = [] }
|
104
|
+
@dep_uri = URI 'https://rubygems.org/api/v1/dependencies'
|
94
105
|
end
|
95
106
|
|
96
107
|
# Return data for all versions of the gem +name+.
|
@@ -100,8 +111,8 @@ module Gem
|
|
100
111
|
return @data[name]
|
101
112
|
end
|
102
113
|
|
103
|
-
|
104
|
-
str =
|
114
|
+
uri = @dep_uri + "?gems=#{name}"
|
115
|
+
str = Gem::RemoteFetcher.fetcher.fetch_path uri
|
105
116
|
|
106
117
|
Marshal.load(str).each do |ver|
|
107
118
|
@data[ver[:name]] << ver
|
@@ -134,8 +145,8 @@ module Gem
|
|
134
145
|
|
135
146
|
return if needed.empty?
|
136
147
|
|
137
|
-
|
138
|
-
str =
|
148
|
+
uri = @dep_uri + "?gems=#{needed.sort.join ','}"
|
149
|
+
str = Gem::RemoteFetcher.fetcher.fetch_path uri
|
139
150
|
|
140
151
|
Marshal.load(str).each do |ver|
|
141
152
|
@data[ver[:name]] << ver
|
@@ -395,6 +406,8 @@ module Gem
|
|
395
406
|
source = Gem.sources.first
|
396
407
|
end
|
397
408
|
|
409
|
+
Gem.ensure_gem_subdirectories path
|
410
|
+
|
398
411
|
source.download full_spec, path
|
399
412
|
end
|
400
413
|
|
data/lib/rubygems/ext/builder.rb
CHANGED
@@ -16,13 +16,6 @@ class Gem::Ext::Builder
|
|
16
16
|
raise Gem::InstallError, "Makefile not found:\n\n#{results.join "\n"}"
|
17
17
|
end
|
18
18
|
|
19
|
-
mf = Gem.read_binary 'Makefile'
|
20
|
-
mf = mf.gsub(/^RUBYARCHDIR\s*=\s*\$[^$]*/, "RUBYARCHDIR = #{dest_path}")
|
21
|
-
mf = mf.gsub(/^RUBYLIBDIR\s*=\s*\$[^$]*/, "RUBYLIBDIR = #{dest_path}")
|
22
|
-
mf = mf.gsub(/\s*\S+\.time$/, "")
|
23
|
-
|
24
|
-
File.open('Makefile', 'wb') {|f| f.print mf}
|
25
|
-
|
26
19
|
# try to find make program from Ruby configure arguments first
|
27
20
|
RbConfig::CONFIG['configure_args'] =~ /with-make-prog\=(\w+)/
|
28
21
|
make_program = $1 || ENV['MAKE'] || ENV['make']
|
@@ -6,18 +6,53 @@
|
|
6
6
|
|
7
7
|
require 'rubygems/ext/builder'
|
8
8
|
require 'rubygems/command'
|
9
|
+
require 'fileutils'
|
10
|
+
require 'tempfile'
|
9
11
|
|
10
12
|
class Gem::Ext::ExtConfBuilder < Gem::Ext::Builder
|
13
|
+
FileEntry = FileUtils::Entry_ # :nodoc:
|
11
14
|
|
12
15
|
def self.build(extension, directory, dest_path, results, args=[])
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
16
|
+
tmp_dest = Dir.mktmpdir(".gem.", ".") if File.identical?(dest_path, ".")
|
17
|
+
|
18
|
+
Tempfile.open %w"siteconf .rb", "." do |siteconf|
|
19
|
+
siteconf.puts "require 'rbconfig'"
|
20
|
+
siteconf.puts "dest_path = #{(tmp_dest || dest_path).dump}"
|
21
|
+
%w[sitearchdir sitelibdir].each do |dir|
|
22
|
+
siteconf.puts "RbConfig::MAKEFILE_CONFIG['#{dir}'] = dest_path"
|
23
|
+
siteconf.puts "RbConfig::CONFIG['#{dir}'] = dest_path"
|
24
|
+
end
|
25
|
+
|
26
|
+
siteconf.flush
|
27
|
+
|
28
|
+
rubyopt = ENV["RUBYOPT"]
|
29
|
+
destdir = ENV["DESTDIR"]
|
30
|
+
|
31
|
+
begin
|
32
|
+
ENV["RUBYOPT"] = ["-r#{siteconf.path}", rubyopt].compact.join(' ')
|
33
|
+
cmd = [Gem.ruby, File.basename(extension), *args].join ' '
|
34
|
+
|
35
|
+
run cmd, results
|
36
|
+
|
37
|
+
ENV["DESTDIR"] = nil
|
38
|
+
|
39
|
+
make dest_path, results
|
40
|
+
|
41
|
+
if tmp_dest
|
42
|
+
FileEntry.new(tmp_dest).traverse do |ent|
|
43
|
+
destent = ent.class.new(dest_path, ent.rel)
|
44
|
+
destent.exist? or File.rename(ent.path, destent.path)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
results
|
49
|
+
ensure
|
50
|
+
ENV["RUBYOPT"] = rubyopt
|
51
|
+
ENV["DESTDIR"] = destdir
|
52
|
+
end
|
53
|
+
end
|
54
|
+
ensure
|
55
|
+
FileUtils.rm_rf tmp_dest if tmp_dest
|
21
56
|
end
|
22
57
|
|
23
58
|
end
|
data/lib/rubygems/installer.rb
CHANGED
@@ -132,7 +132,7 @@ class Gem::Installer
|
|
132
132
|
def check_executable_overwrite filename # :nodoc:
|
133
133
|
return if @force
|
134
134
|
|
135
|
-
generated_bin = File.join @bin_dir, filename
|
135
|
+
generated_bin = File.join @bin_dir, formatted_program_filename(filename)
|
136
136
|
|
137
137
|
return unless File.exist? generated_bin
|
138
138
|
|
@@ -681,7 +681,7 @@ TEXT
|
|
681
681
|
say results.join("\n") if Gem.configuration.really_verbose
|
682
682
|
end
|
683
683
|
rescue
|
684
|
-
extension_build_error(extension_dir, results.join("\n"))
|
684
|
+
extension_build_error(extension_dir, results.join("\n"), $@)
|
685
685
|
end
|
686
686
|
end
|
687
687
|
end
|
@@ -689,7 +689,7 @@ TEXT
|
|
689
689
|
##
|
690
690
|
# Logs the build +output+ in +build_dir+, then raises ExtensionBuildError.
|
691
691
|
|
692
|
-
def extension_build_error(build_dir, output)
|
692
|
+
def extension_build_error(build_dir, output, backtrace = nil)
|
693
693
|
gem_make_out = File.join build_dir, 'gem_make.out'
|
694
694
|
|
695
695
|
open gem_make_out, 'wb' do |io| io.puts output end
|
@@ -703,7 +703,7 @@ Gem files will remain installed in #{gem_dir} for inspection.
|
|
703
703
|
Results logged to #{gem_make_out}
|
704
704
|
EOF
|
705
705
|
|
706
|
-
raise ExtensionBuildError, message
|
706
|
+
raise ExtensionBuildError, message, backtrace
|
707
707
|
end
|
708
708
|
|
709
709
|
##
|
data/lib/rubygems/package.rb
CHANGED
@@ -388,7 +388,8 @@ EOM
|
|
388
388
|
when 'metadata.gz' then
|
389
389
|
args = [entry]
|
390
390
|
args << { :external_encoding => Encoding::UTF_8 } if
|
391
|
-
Object.const_defined?
|
391
|
+
Object.const_defined?(:Encoding) &&
|
392
|
+
Zlib::GzipReader.method(:wrap).arity != 1
|
392
393
|
|
393
394
|
Zlib::GzipReader.wrap(*args) do |gzio|
|
394
395
|
@spec = Gem::Specification.from_yaml gzio.read
|
data/lib/rubygems/rdoc.rb
CHANGED
@@ -37,6 +37,7 @@ end
|
|
37
37
|
class Gem::RDoc # :nodoc: all
|
38
38
|
|
39
39
|
include Gem::UserInteraction
|
40
|
+
extend Gem::UserInteraction
|
40
41
|
|
41
42
|
@rdoc_version = nil
|
42
43
|
@specs = []
|
@@ -70,7 +71,8 @@ class Gem::RDoc # :nodoc: all
|
|
70
71
|
# +specs+
|
71
72
|
|
72
73
|
def self.generation_hook installer, specs
|
73
|
-
|
74
|
+
start = Time.now
|
75
|
+
types = installer.document
|
74
76
|
|
75
77
|
generate_rdoc = types.include? 'rdoc'
|
76
78
|
generate_ri = types.include? 'ri'
|
@@ -78,6 +80,13 @@ class Gem::RDoc # :nodoc: all
|
|
78
80
|
specs.each do |spec|
|
79
81
|
new(spec, generate_rdoc, generate_ri).generate
|
80
82
|
end
|
83
|
+
|
84
|
+
return unless generate_rdoc or generate_ri
|
85
|
+
|
86
|
+
duration = (Time.now - start).to_i
|
87
|
+
names = specs.map(&:name).join ', '
|
88
|
+
|
89
|
+
say "Done installing documentation for #{names} after #{duration} seconds"
|
81
90
|
end
|
82
91
|
|
83
92
|
##
|
@@ -127,8 +127,6 @@ class Gem::RemoteFetcher
|
|
127
127
|
# always replaced.
|
128
128
|
|
129
129
|
def download(spec, source_uri, install_dir = Gem.dir)
|
130
|
-
Gem.ensure_gem_subdirectories(install_dir) rescue nil
|
131
|
-
|
132
130
|
cache_dir =
|
133
131
|
if Dir.pwd == install_dir then # see fetch_command
|
134
132
|
install_dir
|
@@ -403,7 +401,8 @@ class Gem::RemoteFetcher
|
|
403
401
|
connection.start unless connection.started?
|
404
402
|
|
405
403
|
connection
|
406
|
-
rescue OpenSSL::SSL::SSLError
|
404
|
+
rescue defined?(OpenSSL::SSL) ? OpenSSL::SSL::SSLError : Errno::EHOSTDOWN,
|
405
|
+
Errno::EHOSTDOWN => e
|
407
406
|
raise FetchError.new(e.message, uri)
|
408
407
|
end
|
409
408
|
|
@@ -424,6 +423,12 @@ class Gem::RemoteFetcher
|
|
424
423
|
add_rubygems_trusted_certs(store)
|
425
424
|
end
|
426
425
|
connection.cert_store = store
|
426
|
+
rescue LoadError => e
|
427
|
+
raise unless (e.respond_to?(:path) && e.path == 'openssl') ||
|
428
|
+
e.message =~ / -- openssl$/
|
429
|
+
|
430
|
+
raise Gem::Exception.new(
|
431
|
+
'Unable to require openssl, install OpenSSL and rebuild ruby (preferred) or use non-HTTPS sources')
|
427
432
|
end
|
428
433
|
|
429
434
|
def add_rubygems_trusted_certs(store)
|
data/lib/rubygems/security.rb
CHANGED
@@ -5,9 +5,29 @@
|
|
5
5
|
#++
|
6
6
|
|
7
7
|
require 'rubygems/exceptions'
|
8
|
-
require 'openssl'
|
9
8
|
require 'fileutils'
|
10
9
|
|
10
|
+
begin
|
11
|
+
require 'openssl'
|
12
|
+
rescue LoadError => e
|
13
|
+
raise unless (e.respond_to?(:path) && e.path == 'openssl') ||
|
14
|
+
e.message =~ / -- openssl$/
|
15
|
+
|
16
|
+
module OpenSSL # :nodoc:
|
17
|
+
class Digest # :nodoc:
|
18
|
+
class SHA1 # :nodoc:
|
19
|
+
def name
|
20
|
+
'SHA1'
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
module PKey # :nodoc:
|
25
|
+
class RSA # :nodoc:
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
11
31
|
##
|
12
32
|
# = Signing gems
|
13
33
|
#
|
data/lib/rubygems/source.rb
CHANGED
@@ -141,4 +141,14 @@ class Gem::Source
|
|
141
141
|
fetcher = Gem::RemoteFetcher.fetcher
|
142
142
|
fetcher.download spec, @uri.to_s, dir
|
143
143
|
end
|
144
|
+
|
145
|
+
##
|
146
|
+
# Replaces the URI for this source with +uri+. Used for upgrading this
|
147
|
+
# source to HTTPS
|
148
|
+
|
149
|
+
def uri= uri # :nodoc:
|
150
|
+
@api_uri = nil
|
151
|
+
@uri = uri
|
152
|
+
end
|
153
|
+
|
144
154
|
end
|
@@ -188,6 +188,8 @@ class Gem::SpecFetcher
|
|
188
188
|
list = {}
|
189
189
|
|
190
190
|
Gem.sources.each_source do |source|
|
191
|
+
source = upgrade_http_source source
|
192
|
+
|
191
193
|
begin
|
192
194
|
names = case type
|
193
195
|
when :latest
|
@@ -225,5 +227,41 @@ class Gem::SpecFetcher
|
|
225
227
|
cache[source.uri] ||= source.load_specs(type)
|
226
228
|
end
|
227
229
|
end
|
230
|
+
|
231
|
+
##
|
232
|
+
# Attempts to upgrade +source+ to HTTPS if it is for http://rubygems.org
|
233
|
+
|
234
|
+
def upgrade_http_source source
|
235
|
+
uri = source.uri
|
236
|
+
|
237
|
+
return source unless uri.scheme.downcase == 'http' &&
|
238
|
+
uri.host.downcase == 'rubygems.org'
|
239
|
+
|
240
|
+
https_uri = uri.dup
|
241
|
+
https_uri.scheme = 'https'
|
242
|
+
https_uri += '/'
|
243
|
+
|
244
|
+
https_uri = URI https_uri.to_s # cast to URI::HTTPS
|
245
|
+
|
246
|
+
begin
|
247
|
+
Gem::RemoteFetcher.fetcher.fetch_path https_uri, nil, true
|
248
|
+
rescue Gem::RemoteFetcher::FetchError => e
|
249
|
+
raise unless e.message =~ / Not Allowed 405 /
|
250
|
+
end
|
251
|
+
|
252
|
+
say "Upgraded #{uri} to HTTPS"
|
253
|
+
|
254
|
+
https_uri += uri.request_uri
|
255
|
+
|
256
|
+
source.uri = URI https_uri.to_s # cast to URI::HTTPS
|
257
|
+
|
258
|
+
source
|
259
|
+
rescue Gem::RemoteFetcher::FetchError
|
260
|
+
say "Upgrading #{uri} to HTTPS failed, continuing" if
|
261
|
+
Gem.configuration.really_verbose
|
262
|
+
|
263
|
+
source
|
264
|
+
end
|
265
|
+
|
228
266
|
end
|
229
267
|
|
@@ -17,7 +17,7 @@
|
|
17
17
|
# s.authors = ["Ruby Coder"]
|
18
18
|
# s.email = 'rubycoder@example.com'
|
19
19
|
# s.files = ["lib/example.rb"]
|
20
|
-
# s.homepage = '
|
20
|
+
# s.homepage = 'https://rubygems.org/gems/example'
|
21
21
|
# end
|
22
22
|
#
|
23
23
|
# Starting in RubyGems 1.9.0, a Specification can hold arbitrary
|