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? 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 begin # avoid reading... @io.seek pending, IO::SEEK_CUR pending = 0 rescue Errno::EINVAL, NameError while pending > 0 do bytes_read = @io.read([pending, 4096].min).size raise UnexpectedEOF if @io.eof? pending -= bytes_read end 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 108 def seek name # :yields: entry found = find do |entry| entry.full_name == name end return unless found return yield found ensure rewind end