TarReader reads tar files and allows iteration over their items
Creates a new TarReader on io and
yields it to the block, if given.
# File rubygems/package/tar_reader.rb, line 22
def self.new(io)
reader = super
return reader unless block_given?
begin
yield reader
ensure
reader.close
end
nil
end
Close the tar file
# File rubygems/package/tar_reader.rb, line 48
def close
end
Iterates over files in the tarball yielding each entry
# File rubygems/package/tar_reader.rb, line 54
def each
return enum_for __method__ unless block_given?
use_seek = @io.respond_to?(:seek)
until @io.eof? do
header = Gem::Package::TarHeader.from @io
return if header.empty?
entry = Gem::Package::TarReader::Entry.new header, @io
size = entry.header.size
yield entry
skip = (512 - (size % 512)) % 512
pending = size - entry.bytes_read
if use_seek
begin
# avoid reading if the @io supports seeking
@io.seek pending, IO::SEEK_CUR
pending = 0
rescue Errno::EINVAL
end
end
# if seeking isn't supported or failed
while pending > 0 do
bytes_read = @io.read([pending, 4096].min).size
raise UnexpectedEOF if @io.eof?
pending -= bytes_read
end
@io.read skip # discard trailing zeros
# make sure nobody can use #read, #getc or #rewind anymore
entry.close
end
end
Seeks through the tar file until it finds the entry with
name and yields it. Rewinds the tar file to the beginning
when the block terminates.
# File rubygems/package/tar_reader.rb, line 112
def seek(name) # :yields: entry
found = find do |entry|
entry.full_name == name
end
return unless found
return yield found
ensure
rewind
end