summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorhsbt <hsbt@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2015-10-30 00:54:12 +0000
committerhsbt <hsbt@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2015-10-30 00:54:12 +0000
commite00d5437d1453f0ec4fbc980a81c15630624eb71 (patch)
tree07c1340a8c4ea3d0b7ae2f209866af85de089f27
parentf363bbdf1042562e40aaccbd1bdd7b783c096ff0 (diff)
* lib/rubygems: Update to RubyGems HEAD(60d7972).
this version contains pull requests number of #1343, #1356, #1357, #1363 at https://github.com/rubygems/rubygems/pulls * test/rubygems: ditto. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@52372 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog7
-rw-r--r--lib/rubygems.rb11
-rw-r--r--lib/rubygems/basic_specification.rb2
-rw-r--r--lib/rubygems/commands/environment_command.rb2
-rw-r--r--lib/rubygems/commands/help_command.rb10
-rw-r--r--lib/rubygems/dependency.rb6
-rw-r--r--lib/rubygems/platform.rb4
-rw-r--r--lib/rubygems/remote_fetcher.rb28
-rw-r--r--lib/rubygems/stub_specification.rb4
-rw-r--r--test/rubygems/test_gem_ext_builder.rb2
-rw-r--r--test/rubygems/test_gem_platform.rb11
-rw-r--r--test/rubygems/test_gem_remote_fetcher.rb12
-rw-r--r--test/rubygems/test_gem_specification.rb4
-rw-r--r--test/rubygems/test_require.rb30
14 files changed, 110 insertions, 23 deletions
diff --git a/ChangeLog b/ChangeLog
index 41d13141a2..8280f97bbf 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+Fri Oct 30 09:54:05 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * lib/rubygems: Update to RubyGems HEAD(60d7972).
+ this version contains pull requests number of #1343, #1356, #1357, #1363
+ at https://github.com/rubygems/rubygems/pulls
+ * test/rubygems: ditto.
+
Fri Oct 30 07:38:29 2015 Koichi Sasada <ko1@atdot.net>
* insns.def (getinlinecache/setinlinecache): compare ic->ic_cref and
diff --git a/lib/rubygems.rb b/lib/rubygems.rb
index c8dbcad230..c84a67ba76 100644
--- a/lib/rubygems.rb
+++ b/lib/rubygems.rb
@@ -597,6 +597,9 @@ module Gem
test_syck = ENV['TEST_SYCK']
+ # Only Ruby 1.8 and 1.9 have syck
+ test_syck = false unless /^1\./ =~ RUBY_VERSION
+
unless test_syck
begin
gem 'psych', '>= 1.2.1'
@@ -778,6 +781,14 @@ module Gem
open path, 'rb' do |f|
f.read
end
+ rescue Errno::ENOLCK # NFS
+ if Thread.main != Thread.current
+ raise
+ else
+ open path, 'rb' do |f|
+ f.read
+ end
+ end
end
##
diff --git a/lib/rubygems/basic_specification.rb b/lib/rubygems/basic_specification.rb
index 78a45c1190..df3cab37b5 100644
--- a/lib/rubygems/basic_specification.rb
+++ b/lib/rubygems/basic_specification.rb
@@ -282,7 +282,7 @@ class Gem::BasicSpecification
self.require_paths.first
end
- "#{self.full_gem_path}/#{dirs}"
+ "#{self.full_gem_path}/#{dirs}".untaint
end
##
diff --git a/lib/rubygems/commands/environment_command.rb b/lib/rubygems/commands/environment_command.rb
index 067d0b1607..79dd710bdf 100644
--- a/lib/rubygems/commands/environment_command.rb
+++ b/lib/rubygems/commands/environment_command.rb
@@ -113,6 +113,8 @@ lib/rubygems/defaults/operating_system.rb
out << " - INSTALLATION DIRECTORY: #{Gem.dir}\n"
+ out << " - USER INSTALLATION DIRECTORY: #{Gem.user_dir}\n"
+
out << " - RUBYGEMS PREFIX: #{Gem.prefix}\n" unless Gem.prefix.nil?
out << " - RUBY EXECUTABLE: #{Gem.ruby}\n"
diff --git a/lib/rubygems/commands/help_command.rb b/lib/rubygems/commands/help_command.rb
index 955ceb929f..c407836467 100644
--- a/lib/rubygems/commands/help_command.rb
+++ b/lib/rubygems/commands/help_command.rb
@@ -370,15 +370,5 @@ platform.
end
end
- def show_help # :nodoc:
- command = @command_manager[options[:help]]
- if command then
- # help with provided command
- command.invoke("--help")
- else
- alert_error "Unknown command #{options[:help]}. Try 'gem help commands'"
- end
- end
-
end
diff --git a/lib/rubygems/dependency.rb b/lib/rubygems/dependency.rb
index b4a6dd8673..da990fa139 100644
--- a/lib/rubygems/dependency.rb
+++ b/lib/rubygems/dependency.rb
@@ -280,7 +280,7 @@ class Gem::Dependency
if platform_only
matches.reject! { |spec|
- not Gem::Platform.match spec.platform
+ spec.nil? || !Gem::Platform.match(spec.platform)
}
end
@@ -326,11 +326,11 @@ class Gem::Dependency
def to_spec
matches = self.to_specs
- active = matches.find { |spec| spec.activated? }
+ active = matches.find { |spec| spec && spec.activated? }
return active if active
- matches.delete_if { |spec| spec.version.prerelease? } unless prerelease?
+ matches.delete_if { |spec| spec.nil? || spec.version.prerelease? } unless prerelease?
matches.last
end
diff --git a/lib/rubygems/platform.rb b/lib/rubygems/platform.rb
index 10d699d6b9..487d245a01 100644
--- a/lib/rubygems/platform.rb
+++ b/lib/rubygems/platform.rb
@@ -148,8 +148,8 @@ class Gem::Platform
return nil unless Gem::Platform === other
# cpu
- (@cpu == 'universal' or other.cpu == 'universal' or @cpu == other.cpu or
- (@cpu == 'arm' and other.cpu =~ /\Aarm/)) and
+ ([nil,'universal'].include?(@cpu) or [nil, 'universal'].include?(other.cpu) or @cpu == other.cpu or
+ (@cpu == 'arm' and other.cpu =~ /\Aarm/)) and
# os
@os == other.os and
diff --git a/lib/rubygems/remote_fetcher.rb b/lib/rubygems/remote_fetcher.rb
index e3c78af908..8c7ee78f84 100644
--- a/lib/rubygems/remote_fetcher.rb
+++ b/lib/rubygems/remote_fetcher.rb
@@ -51,6 +51,8 @@ class Gem::RemoteFetcher
@fetcher ||= self.new Gem.configuration[:http_proxy]
end
+ attr_accessor :headers
+
##
# Initialize a remote fetcher using the source URI and possible proxy
# information.
@@ -64,8 +66,11 @@ class Gem::RemoteFetcher
#
# +dns+: An object to use for DNS resolution of the API endpoint.
# By default, use Resolv::DNS.
+ #
+ # +headers+: A set of additional HTTP headers to be sent to the server when
+ # fetching the gem.
- def initialize(proxy=nil, dns=Resolv::DNS.new)
+ def initialize(proxy=nil, dns=Resolv::DNS.new, headers={})
require 'net/http'
require 'stringio'
require 'time'
@@ -79,6 +84,7 @@ class Gem::RemoteFetcher
@cert_files = Gem::Request.get_cert_files
@dns = dns
+ @headers = headers
end
##
@@ -235,7 +241,9 @@ class Gem::RemoteFetcher
def fetch_http uri, last_modified = nil, head = false, depth = 0
fetch_type = head ? Net::HTTP::Head : Net::HTTP::Get
- response = request uri, fetch_type, last_modified
+ response = request uri, fetch_type, last_modified do |req|
+ headers.each { |k,v| req.add_field(k,v) }
+ end
case response
when Net::HTTPOK, Net::HTTPNotModified then
@@ -313,9 +321,19 @@ class Gem::RemoteFetcher
end
if update and path
- open(path, 'wb') do |io|
- io.flock(File::LOCK_EX)
- io.write data
+ begin
+ open(path, 'wb') do |io|
+ io.flock(File::LOCK_EX)
+ io.write data
+ end
+ rescue Errno::ENOLCK # NFS
+ if Thread.main != Thread.current
+ raise
+ else
+ open(path, 'wb') do |io|
+ io.write data
+ end
+ end
end
end
diff --git a/lib/rubygems/stub_specification.rb b/lib/rubygems/stub_specification.rb
index bb59077ca2..b4019fefda 100644
--- a/lib/rubygems/stub_specification.rb
+++ b/lib/rubygems/stub_specification.rb
@@ -19,7 +19,7 @@ class Gem::StubSpecification < Gem::BasicSpecification
def initialize(data)
parts = data[PREFIX.length..-1].split(" ")
- @name = parts[0]
+ @name = parts[0].freeze
@version = Gem::Version.new parts[1]
@platform = Gem::Platform.new parts[2]
@require_paths = parts.drop(3).join(" ").split("\0")
@@ -35,6 +35,8 @@ class Gem::StubSpecification < Gem::BasicSpecification
end
def initialize filename, default_gem
+ filename.untaint
+
self.loaded_from = filename
@data = nil
@extensions = nil
diff --git a/test/rubygems/test_gem_ext_builder.rb b/test/rubygems/test_gem_ext_builder.rb
index 5607096a0b..02c7593628 100644
--- a/test/rubygems/test_gem_ext_builder.rb
+++ b/test/rubygems/test_gem_ext_builder.rb
@@ -147,6 +147,8 @@ install:
class << Gem
alias orig_install_extension_in_lib install_extension_in_lib
+ remove_method :install_extension_in_lib
+
def Gem.install_extension_in_lib
false
end
diff --git a/test/rubygems/test_gem_platform.rb b/test/rubygems/test_gem_platform.rb
index 17577dc744..164977224c 100644
--- a/test/rubygems/test_gem_platform.rb
+++ b/test/rubygems/test_gem_platform.rb
@@ -190,6 +190,17 @@ class TestGemPlatform < Gem::TestCase
assert((x86_darwin8 === Gem::Platform.local), 'universal =~ x86')
end
+ def test_nil_cpu_arch_is_treated_as_universal
+ with_nil_arch = Gem::Platform.new [nil, 'mingw32']
+ with_uni_arch = Gem::Platform.new ['universal', 'mingw32']
+ with_x86_arch = Gem::Platform.new ['x86', 'mingw32']
+
+ assert((with_nil_arch === with_uni_arch), 'nil =~ universal')
+ assert((with_uni_arch === with_nil_arch), 'universal =~ nil')
+ assert((with_nil_arch === with_x86_arch), 'nil =~ x86')
+ assert((with_x86_arch === with_nil_arch), 'x86 =~ nil')
+ end
+
def test_equals3_cpu_arm
arm = Gem::Platform.new 'arm-linux'
armv5 = Gem::Platform.new 'armv5-linux'
diff --git a/test/rubygems/test_gem_remote_fetcher.rb b/test/rubygems/test_gem_remote_fetcher.rb
index 93ae73afd4..5598e46b26 100644
--- a/test/rubygems/test_gem_remote_fetcher.rb
+++ b/test/rubygems/test_gem_remote_fetcher.rb
@@ -698,6 +698,14 @@ PeIQQkFng2VVot/WAQbv3ePqWq07g1BBcwIBAg==
assert_equal "too many redirects (#{url})", e.message
end
+ def test_fetch_http_with_additional_headers
+ ENV["http_proxy"] = @proxy_uri
+ ENV["no_proxy"] = URI::parse(@server_uri).host
+ fetcher = Gem::RemoteFetcher.new nil, nil, {"X-Captain" => "murphy"}
+ @fetcher = fetcher
+ assert_equal "murphy", fetcher.fetch_path(@server_uri)
+ end
+
def test_fetch_s3
fetcher = Gem::RemoteFetcher.new nil
@fetcher = fetcher
@@ -984,7 +992,9 @@ PeIQQkFng2VVot/WAQbv3ePqWq07g1BBcwIBAg==
)
s.mount_proc("/kill") { |req, res| s.shutdown }
s.mount_proc("/yaml") { |req, res|
- if @enable_yaml
+ if req["X-Captain"]
+ res.body = req["X-Captain"]
+ elsif @enable_yaml
res.body = data
res['Content-Type'] = 'text/plain'
res['content-length'] = data.size
diff --git a/test/rubygems/test_gem_specification.rb b/test/rubygems/test_gem_specification.rb
index 0ada8db490..60f603361a 100644
--- a/test/rubygems/test_gem_specification.rb
+++ b/test/rubygems/test_gem_specification.rb
@@ -1724,6 +1724,8 @@ dependencies: []
class << Gem
alias orig_default_ext_dir_for default_ext_dir_for
+ remove_method :default_ext_dir_for
+
def Gem.default_ext_dir_for(base_dir)
'elsewhere'
end
@@ -2033,6 +2035,8 @@ dependencies: []
def test_require_paths_default_ext_dir_for
class << Gem
send :alias_method, :orig_default_ext_dir_for, :default_ext_dir_for
+
+ remove_method :default_ext_dir_for
end
def Gem.default_ext_dir_for base_dir
diff --git a/test/rubygems/test_require.rb b/test/rubygems/test_require.rb
index 96906595d7..08dd4cb9f9 100644
--- a/test/rubygems/test_require.rb
+++ b/test/rubygems/test_require.rb
@@ -80,6 +80,8 @@ class TestGemRequire < Gem::TestCase
end
def test_concurrent_require
+ skip 'deadlock' if /^1\.8\./ =~ RUBY_VERSION
+
Object.const_set :FILE_ENTERED_LATCH, Latch.new(2)
Object.const_set :FILE_EXIT_LATCH, Latch.new(1)
@@ -103,6 +105,8 @@ class TestGemRequire < Gem::TestCase
assert t1.join, "thread 1 should exit"
assert t2.join, "thread 2 should exit"
ensure
+ return if $! # skipping
+
Object.send :remove_const, :FILE_ENTERED_LATCH
Object.send :remove_const, :FILE_EXIT_LATCH
end
@@ -247,6 +251,32 @@ class TestGemRequire < Gem::TestCase
assert_equal "unable to find a version of 'b' to activate", e.message
end
+ def test_require_works_after_cleanup
+ a1 = new_default_spec "a", "1.0", nil, "a/b.rb"
+ b1 = new_default_spec "b", "1.0", nil, "b/c.rb"
+ b2 = new_default_spec "b", "2.0", nil, "b/d.rb"
+
+ install_default_gems a1
+ install_default_gems b1
+ install_default_gems b2
+
+ # Load default ruby gems fresh as if we've just started a ruby script.
+ Gem::Specification.reset
+ require 'rubygems'
+ Gem::Specification.stubs
+
+ # Remove an old default gem version directly from disk as if someone ran
+ # gem cleanup.
+ FileUtils.rm_rf(File.join @default_dir, "#{b1.full_name}")
+ FileUtils.rm_rf(File.join @default_spec_dir, "#{b1.full_name}.gemspec")
+
+ # Require gems that have not been removed.
+ assert_require 'a/b'
+ assert_equal %w(a-1.0), loaded_spec_names
+ assert_require 'b/d'
+ assert_equal %w(a-1.0 b-2.0), loaded_spec_names
+ end
+
def test_default_gem_only
default_gem_spec = new_default_spec("default", "2.0.0.0",
nil, "default/gem.rb")