Support for the Ruby 2.4 series has ended. See here for reference.
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