aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--lib/rubygems/builder.rb6
-rw-r--r--lib/rubygems/commands/setup_command.rb6
-rw-r--r--lib/rubygems/commands/unpack_command.rb26
-rw-r--r--lib/rubygems/format.rb9
-rw-r--r--lib/rubygems/installer.rb24
-rw-r--r--lib/rubygems/package.rb18
-rw-r--r--lib/rubygems/package/tar_input.rb6
-rw-r--r--lib/rubygems/package/tar_reader/entry.rb4
-rw-r--r--lib/rubygems/package_task.rb10
-rw-r--r--lib/rubygems/user_interaction.rb18
-rw-r--r--test/rubygems/test_gem_commands_unpack_command.rb40
-rw-r--r--test/rubygems/test_gem_format.rb30
-rw-r--r--test/rubygems/test_gem_package_tar_input.rb21
-rw-r--r--test/rubygems/test_gem_package_tar_reader_entry.rb10
-rw-r--r--test/rubygems/test_gem_package_task.rb13
-rw-r--r--test/rubygems/test_gem_security.rb1
17 files changed, 201 insertions, 46 deletions
diff --git a/ChangeLog b/ChangeLog
index ece5b69309..63528e8b9e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Tue Feb 1 11:03:47 2011 Ryan Davis <ryan@lust.local>
+
+ * lib/rubygems*: Import rubygems 1.5.0 (released version @ 1fb59d0)
+ * test/rubygems: Ditto
+
Tue Feb 1 08:01:39 2011 Nobuyoshi Nakada <nobu@ruby-lang.org>
* ext/io/console/console.c (console_set_winsize): new method to set
diff --git a/lib/rubygems/builder.rb b/lib/rubygems/builder.rb
index b5d596b1f3..c07369f256 100644
--- a/lib/rubygems/builder.rb
+++ b/lib/rubygems/builder.rb
@@ -10,13 +10,9 @@
# See LICENSE.txt for permissions.
#++
+require 'rubygems'
require 'rubygems/user_interaction'
-begin
- require 'psych'
-rescue LoadError
-end
-
Gem.load_yaml
require 'rubygems/package'
diff --git a/lib/rubygems/commands/setup_command.rb b/lib/rubygems/commands/setup_command.rb
index b7fb62cf53..f40733a3ed 100644
--- a/lib/rubygems/commands/setup_command.rb
+++ b/lib/rubygems/commands/setup_command.rb
@@ -342,8 +342,10 @@ abort "#{deprecation_message}"
require 'rdoc/rdoc'
args << '--quiet'
- args << '--main' << 'README'
- args << '.' << 'README' << 'LICENSE.txt' << 'GPL.txt'
+ args << '--main' << 'README.rdoc'
+ args << '.'
+ args << 'README.rdoc' << 'UPGRADING.rdoc'
+ args << 'LICENSE.txt' << 'GPL.txt' << 'History.txt'
r = RDoc::RDoc.new
r.document args
diff --git a/lib/rubygems/commands/unpack_command.rb b/lib/rubygems/commands/unpack_command.rb
index 5e0bc830f2..ac1d376106 100644
--- a/lib/rubygems/commands/unpack_command.rb
+++ b/lib/rubygems/commands/unpack_command.rb
@@ -72,6 +72,22 @@ class Gem::Commands::UnpackCommand < Gem::Command
end
##
+ #
+ # Find cached filename in Gem.path. Returns nil if the file cannot be found.
+ #
+ #--
+ # TODO: see comments in get_path() about general service.
+
+ def find_in_cache(filename)
+ Gem.path.each do |gem_dir|
+ this_path = File.join gem_dir, 'cache', filename
+ return this_path if File.exist? this_path
+ end
+
+ return nil
+ end
+
+ ##
# Return the full path to the cached gem file matching the given
# name and version requirement. Returns 'nil' if no match.
#
@@ -101,13 +117,9 @@ class Gem::Commands::UnpackCommand < Gem::Command
# We expect to find (basename).gem in the 'cache' directory. Furthermore,
# the name match must be exact (ignoring case).
- filename = selected.file_name
- path = nil
-
- Gem.path.find do |gem_dir|
- path = File.join gem_dir, 'cache', filename
- File.exist? path
- end
+
+ path = find_in_cache(selected.file_name)
+ return download(dependency) unless path
path
end
diff --git a/lib/rubygems/format.rb b/lib/rubygems/format.rb
index 3b38a3a017..95388b4e51 100644
--- a/lib/rubygems/format.rb
+++ b/lib/rubygems/format.rb
@@ -47,8 +47,13 @@ class Gem::Format
Gem::OldFormat.from_file_by_path file_path
else
- open file_path, Gem.binary_mode do |io|
- from_io io, file_path, security_policy
+ begin
+ open file_path, Gem.binary_mode do |io|
+ from_io io, file_path, security_policy
+ end
+ rescue Gem::Package::TarInvalidError => e
+ message = "corrupt gem (#{e.class}: #{e.message})"
+ raise Gem::Package::FormatError.new(message, file_path)
end
end
end
diff --git a/lib/rubygems/installer.rb b/lib/rubygems/installer.rb
index 09d260dfb8..5c7c57685b 100644
--- a/lib/rubygems/installer.rb
+++ b/lib/rubygems/installer.rb
@@ -395,19 +395,19 @@ class Gem::Installer
:force => false,
:install_dir => Gem.dir,
:source_index => Gem.source_index,
- }.merge @options
+ }.merge options
- @env_shebang = @options[:env_shebang]
- @force = @options[:force]
- gem_home = @options[:install_dir]
+ @env_shebang = options[:env_shebang]
+ @force = options[:force]
+ gem_home = options[:install_dir]
@gem_home = File.expand_path(gem_home)
- @ignore_dependencies = @options[:ignore_dependencies]
- @format_executable = @options[:format_executable]
- @security_policy = @options[:security_policy]
- @wrappers = @options[:wrappers]
- @bin_dir = @options[:bin_dir]
- @development = @options[:development]
- @source_index = @options[:source_index]
+ @ignore_dependencies = options[:ignore_dependencies]
+ @format_executable = options[:format_executable]
+ @security_policy = options[:security_policy]
+ @wrappers = options[:wrappers]
+ @bin_dir = options[:bin_dir]
+ @development = options[:development]
+ @source_index = options[:source_index]
end
def load_gem_file
@@ -508,7 +508,7 @@ TEXT
rescue TypeError # extension == nil
@gem_dir
end
-
+
begin
Dir.chdir extension_dir do
diff --git a/lib/rubygems/package.rb b/lib/rubygems/package.rb
index 0fd27a0108..3a50ca118e 100644
--- a/lib/rubygems/package.rb
+++ b/lib/rubygems/package.rb
@@ -45,7 +45,23 @@ module Gem::Package
class ClosedIO < Error; end
class BadCheckSum < Error; end
class TooLongFileName < Error; end
- class FormatError < Error; end
+ class FormatError < Error
+ attr_reader :path
+
+ def initialize message, path = nil
+ @path = path
+
+ message << " in #{path}" if path
+
+ super message
+ end
+
+ end
+
+ ##
+ # Raised when a tar file is corrupt
+
+ class TarInvalidError < Error; end
def self.open(io, mode = "r", signer = nil, &block)
tar_type = case mode
diff --git a/lib/rubygems/package/tar_input.rb b/lib/rubygems/package/tar_input.rb
index 587d79c493..401df80a83 100644
--- a/lib/rubygems/package/tar_input.rb
+++ b/lib/rubygems/package/tar_input.rb
@@ -117,7 +117,11 @@ class Gem::Package::TarInput
@tarreader.rewind
@fileops = Gem::FileOperations.new
- raise Gem::Package::FormatError, "No metadata found!" unless has_meta
+ unless has_meta then
+ path = io.path if io.respond_to? :path
+ error = Gem::Package::FormatError.new 'no metadata found', path
+ raise error
+ end
end
def close
diff --git a/lib/rubygems/package/tar_reader/entry.rb b/lib/rubygems/package/tar_reader/entry.rb
index d5c624f3d5..c70248f159 100644
--- a/lib/rubygems/package/tar_reader/entry.rb
+++ b/lib/rubygems/package/tar_reader/entry.rb
@@ -73,6 +73,10 @@ class Gem::Package::TarReader::Entry
else
@header.name
end
+ rescue ArgumentError => e
+ raise unless e.message == 'string contains null byte'
+ raise Gem::Package::TarInvalidError,
+ 'tar is corrupt, name contains null byte'
end
##
diff --git a/lib/rubygems/package_task.rb b/lib/rubygems/package_task.rb
index 2e9c89d834..ae4f2019ae 100644
--- a/lib/rubygems/package_task.rb
+++ b/lib/rubygems/package_task.rb
@@ -92,7 +92,7 @@ class Gem::PackageTask < Rake::PackageTask
# Initialization tasks without the "yield self" or define operations.
def init(gem)
- super gem.name, gem.version
+ super gem.full_name, :noversion
@gem_spec = gem
@package_files += gem_spec.files if gem_spec.files
end
@@ -120,11 +120,13 @@ class Gem::PackageTask < Rake::PackageTask
chdir(gem_dir) do
when_writing "Creating #{gem_spec.file_name}" do
Gem::Builder.new(gem_spec).build
- verbose(true) {
- mv gem_file, ".."
- }
+ verbose trace do
+ mv gem_file, '..'
+ end
end
end
end
end
+
end
+
diff --git a/lib/rubygems/user_interaction.rb b/lib/rubygems/user_interaction.rb
index 9822a23c35..ff5800c116 100644
--- a/lib/rubygems/user_interaction.rb
+++ b/lib/rubygems/user_interaction.rb
@@ -530,9 +530,21 @@ end
##
# SilentUI is a UI choice that is absolutely silent.
-class Gem::SilentUI
- def method_missing(sym, *args, &block)
- self
+class Gem::SilentUI < Gem::StreamUI
+
+ def initialize
+
+ reader, writer = nil, nil
+
+ if Gem.win_platform?
+ reader = File.open('nul', 'r')
+ writer = File.open('nul', 'w')
+ else
+ reader = File.open('/dev/null', 'r')
+ writer = File.open('/dev/null', 'w')
+ end
+
+ super reader, writer, writer
end
end
diff --git a/test/rubygems/test_gem_commands_unpack_command.rb b/test/rubygems/test_gem_commands_unpack_command.rb
index e8d7984c65..0fb4ef3843 100644
--- a/test/rubygems/test_gem_commands_unpack_command.rb
+++ b/test/rubygems/test_gem_commands_unpack_command.rb
@@ -17,6 +17,46 @@ class TestGemCommandsUnpackCommand < Gem::TestCase
end
end
+ def test_find_in_cache
+ util_make_gems
+
+ assert_equal(
+ @cmd.find_in_cache(@a1.file_name),
+ File.join(@gemhome, 'cache', @a1.file_name),
+ 'found a-1.gem in the cache'
+ )
+ end
+
+ def test_get_path
+ util_make_gems
+ util_setup_fake_fetcher
+ util_setup_spec_fetcher @a1
+
+ a1_data = nil
+
+ open File.join(@gemhome, 'cache', @a1.file_name), 'rb' do |fp|
+ a1_data = fp.read
+ end
+
+ Gem::RemoteFetcher.fetcher.data['http://gems.example.com/gems/a-1.gem'] =
+ a1_data
+
+ dep = Gem::Dependency.new(@a1.name, @a1.version)
+ assert_equal(
+ @cmd.get_path(dep),
+ File.join(@gemhome, 'cache', @a1.file_name),
+ 'fetches a-1 and returns the cache path'
+ )
+
+ FileUtils.rm File.join(@gemhome, 'cache', @a1.file_name)
+
+ assert_equal(
+ @cmd.get_path(dep),
+ File.join(@gemhome, 'cache', @a1.file_name),
+ 'when removed from cache, refetches a-1'
+ )
+ end
+
def test_execute
util_make_gems
diff --git a/test/rubygems/test_gem_format.rb b/test/rubygems/test_gem_format.rb
index cbf2bc7788..f964cab143 100644
--- a/test/rubygems/test_gem_format.rb
+++ b/test/rubygems/test_gem_format.rb
@@ -4,11 +4,11 @@
# File a patch instead and assign it to Ryan Davis or Eric Hodel.
######################################################################
-require 'rubygems/test_case'
-require "test/rubygems/simple_gem"
+require 'rubygems/package/tar_test_case'
+require 'test/rubygems/simple_gem'
require 'rubygems/format'
-class TestGemFormat < Gem::TestCase
+class TestGemFormat < Gem::Package::TarTestCase
def setup
super
@@ -16,6 +16,7 @@ class TestGemFormat < Gem::TestCase
@simple_gem = SIMPLE_GEM
end
+ # HACK this test should do less
def test_class_from_file_by_path
util_make_gems
@@ -34,6 +35,23 @@ class TestGemFormat < Gem::TestCase
end
end
+ def test_class_from_file_by_path_corrupt
+ Tempfile.open 'corrupt' do |io|
+ data = Gem.gzip 'a' * 10
+ io.write tar_file_header('metadata.gz', "\000x", 0644, data.length)
+ io.write data
+ io.rewind
+
+ e = assert_raises Gem::Package::FormatError do
+ Gem::Format.from_file_by_path io.path
+ end
+
+ sub_message = 'Gem::Package::TarInvalidError: tar is corrupt, name contains null byte'
+ assert_equal "corrupt gem (#{sub_message}) in #{io.path}", e.message
+ assert_equal io.path, e.path
+ end
+ end
+
def test_class_from_file_by_path_empty
util_make_gems
@@ -55,21 +73,21 @@ class TestGemFormat < Gem::TestCase
Gem::Format.from_io(StringIO.new(@simple_gem.upcase))
end
- assert_equal 'No metadata found!', e.message
+ assert_equal 'no metadata found', e.message
e = assert_raises Gem::Package::FormatError do
# Totally bogus input
Gem::Format.from_io(StringIO.new(@simple_gem.reverse))
end
- assert_equal 'No metadata found!', e.message
+ assert_equal 'no metadata found', e.message
e = assert_raises Gem::Package::FormatError do
# This was intentionally screws up YAML parsing.
Gem::Format.from_io(StringIO.new(@simple_gem.gsub(/:/, "boom")))
end
- assert_equal 'No metadata found!', e.message
+ assert_equal 'no metadata found', e.message
end
end
diff --git a/test/rubygems/test_gem_package_tar_input.rb b/test/rubygems/test_gem_package_tar_input.rb
index 0d3de45ba4..72c1ce194a 100644
--- a/test/rubygems/test_gem_package_tar_input.rb
+++ b/test/rubygems/test_gem_package_tar_input.rb
@@ -59,7 +59,24 @@ class TestGemPackageTarInput < Gem::Package::TarTestCase
@entry_contents = %w[0123456789 01234]
end
- def test_each_works
+ def test_initialize_no_metadata_file
+ Tempfile.open 'no_meta' do |io|
+ io.write tar_file_header('a', '', 0644, 1)
+ io.write 'a'
+ io.rewind
+
+ e = assert_raises Gem::Package::FormatError do
+ open io.path, Gem.binary_mode do |file|
+ Gem::Package::TarInput.open file do end
+ end
+ end
+
+ assert_equal "no metadata found in #{io.path}", e.message
+ assert_equal io.path, e.path
+ end
+ end
+
+ def test_each
open @file, 'rb' do |io|
Gem::Package::TarInput.open io do |tar_input|
count = 0
@@ -79,7 +96,7 @@ class TestGemPackageTarInput < Gem::Package::TarTestCase
end
end
- def test_extract_entry_works
+ def test_extract_entry
open @file, 'rb' do |io|
Gem::Package::TarInput.open io do |tar_input|
assert_equal @spec, tar_input.metadata
diff --git a/test/rubygems/test_gem_package_tar_reader_entry.rb b/test/rubygems/test_gem_package_tar_reader_entry.rb
index a6d06cf00e..46e30466b9 100644
--- a/test/rubygems/test_gem_package_tar_reader_entry.rb
+++ b/test/rubygems/test_gem_package_tar_reader_entry.rb
@@ -67,6 +67,16 @@ class TestGemPackageTarReaderEntry < Gem::Package::TarTestCase
assert_equal 'lib/foo', @entry.full_name
end
+ def test_full_name_null
+ @entry.header.prefix << "\000"
+
+ e = assert_raises Gem::Package::TarInvalidError do
+ @entry.full_name
+ end
+
+ assert_equal 'tar is corrupt, name contains null byte', e.message
+ end
+
def test_getc
assert_equal ?a, @entry.getc
end
diff --git a/test/rubygems/test_gem_package_task.rb b/test/rubygems/test_gem_package_task.rb
index d13c554360..c53bdf4619 100644
--- a/test/rubygems/test_gem_package_task.rb
+++ b/test/rubygems/test_gem_package_task.rb
@@ -48,5 +48,18 @@ class TestGemPackageTask < Gem::TestCase
assert_equal ["x", "y"], pkg.package_files
end
+ def test_package_dir_path
+ gem = Gem::Specification.new do |g|
+ g.name = 'nokogiri'
+ g.version = '1.5.0'
+ g.platform = 'java'
+ end
+
+ pkg = Gem::PackageTask.new gem
+ pkg.define
+
+ assert_equal 'pkg/nokogiri-1.5.0-java', pkg.package_dir_path
+ end
+
end
diff --git a/test/rubygems/test_gem_security.rb b/test/rubygems/test_gem_security.rb
index b8ef7fde35..bb579d7927 100644
--- a/test/rubygems/test_gem_security.rb
+++ b/test/rubygems/test_gem_security.rb
@@ -93,4 +93,3 @@ class TestGemSecurity < Gem::TestCase
end
end if defined?(OpenSSL)
-