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 ruby-3.1.2/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
Close the tar file
# File ruby-3.1.2/lib/rubygems/package/tar_reader.rb, line 47 def close end
Iterates over files in the tarball yielding each entry
# File ruby-3.1.2/lib/rubygems/package/tar_reader.rb, line 53 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 ruby-3.1.2/lib/rubygems/package/tar_reader.rb, line 111 def seek(name) # :yields: entry found = find do |entry| entry.full_name == name end return unless found return yield found ensure rewind end