aboutsummaryrefslogtreecommitdiffstats
path: root/lib/rubygems/package.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/rubygems/package.rb')
-rw-r--r--lib/rubygems/package.rb41
1 files changed, 27 insertions, 14 deletions
diff --git a/lib/rubygems/package.rb b/lib/rubygems/package.rb
index 0ed6e1b91f..417b34b79f 100644
--- a/lib/rubygems/package.rb
+++ b/lib/rubygems/package.rb
@@ -54,10 +54,12 @@ class Gem::Package
class FormatError < Error
attr_reader :path
- def initialize message, path = nil
- @path = path
+ def initialize message, source = nil
+ if source
+ @path = source.path
- message << " in #{path}" if path
+ message << " in #{path}" if path
+ end
super message
end
@@ -80,6 +82,7 @@ class Gem::Package
class TarInvalidError < Error; end
+
attr_accessor :build_time # :nodoc:
##
@@ -114,19 +117,26 @@ class Gem::Package
end
##
- # Creates a new Gem::Package for the file at +gem+.
+ # Creates a new Gem::Package for the file at +gem+. +gem+ can also be
+ # provided as an IO object.
#
# If +gem+ is an existing file in the old format a Gem::Package::Old will be
# returned.
def self.new gem
- return super unless Gem::Package == self
- return super unless File.exist? gem
+ gem = if gem.is_a?(Gem::Package::Source)
+ gem
+ elsif gem.respond_to? :read
+ Gem::Package::IOSource.new gem
+ else
+ Gem::Package::FileSource.new gem
+ end
- start = File.read gem, 20
+ return super(gem) unless Gem::Package == self
+ return super unless gem.present?
- return super unless start
- return super unless start.include? 'MD5SUM ='
+ return super unless gem.start
+ return super unless gem.start.include? 'MD5SUM ='
Gem::Package::Old.new gem
end
@@ -227,7 +237,7 @@ class Gem::Package
setup_signer
- open @gem, 'wb' do |gem_io|
+ @gem.with_write_io do |gem_io|
Gem::Package::TarWriter.new gem_io do |gem|
add_metadata gem
add_contents gem
@@ -255,7 +265,7 @@ EOM
@contents = []
- open @gem, 'rb' do |io|
+ @gem.with_read_io do |io|
gem_tar = Gem::Package::TarReader.new io
gem_tar.each do |entry|
@@ -312,7 +322,7 @@ EOM
FileUtils.mkdir_p destination_dir
- open @gem, 'rb' do |io|
+ @gem.with_read_io do |io|
reader = Gem::Package::TarReader.new io
reader.each do |entry|
@@ -360,7 +370,7 @@ EOM
out.write entry.read
end if entry.file?
- say destination if Gem.configuration.really_verbose
+ verbose destination
end
end
end
@@ -490,7 +500,7 @@ EOM
@files = []
@spec = nil
- open @gem, 'rb' do |io|
+ @gem.with_read_io do |io|
Gem::Package::TarReader.new io do |reader|
read_checksums reader
@@ -592,6 +602,9 @@ EOM
end
require 'rubygems/package/digest_io'
+require 'rubygems/package/source'
+require 'rubygems/package/file_source'
+require 'rubygems/package/io_source'
require 'rubygems/package/old'
require 'rubygems/package/tar_header'
require 'rubygems/package/tar_reader'