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 lib/rubygems/package/tar_reader.rb, line 21 def self.new(io) reader = super return reader unless block_given? begin yield reader ensure reader.close end nil end
Creates a new tar file reader on io
which needs to respond to
pos, eof?, read, getc and pos=
# File lib/rubygems/package/tar_reader.rb, line 39 def initialize(io) @io = io @init_pos = io.pos end
Close the tar file
# File lib/rubygems/package/tar_reader.rb, line 47 def close end
Iterates over files in the tarball yielding each entry
# File lib/rubygems/package/tar_reader.rb, line 53 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 lib/rubygems/package/tar_reader.rb, line 107 def seek name # :yields: entry found = find do |entry| entry.full_name == name end return unless found return yield found ensure rewind end