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