diff options
Diffstat (limited to 'lib/rubygems/package.rb')
-rw-r--r-- | lib/rubygems/package.rb | 41 |
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' |