Class
TarReader
reads tar files and allows iteration over their items
Class Methods
lib/rubygems/package/tar_reader.rb
View on GitHub
# File tmp/rubies/ruby-2.6.10/lib/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
Creates a new TarReader
on io
and yields it to the block, if given.
Instance Methods
#
lib/rubygems/package/tar_reader.rb
View on GitHub
# File tmp/rubies/ruby-2.6.10/lib/rubygems/package/tar_reader.rb, line 48
def close
end
Close the tar file
lib/rubygems/package/tar_reader.rb
View on GitHub
# File tmp/rubies/ruby-2.6.10/lib/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
Iterates over files in the tarball yielding each entry
#
lib/rubygems/package/tar_reader.rb
View on GitHub
# File tmp/rubies/ruby-2.6.10/lib/rubygems/package/tar_reader.rb, line 93
def rewind
if @init_pos == 0
@io.rewind
else
@io.pos = @init_pos
end
end
lib/rubygems/package/tar_reader.rb
View on GitHub
# File tmp/rubies/ruby-2.6.10/lib/rubygems/package/tar_reader.rb, line 106
def seek(name) # :yields: entry
found = find do |entry|
entry.full_name == name
end
return unless found
return yield found
ensure
rewind
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.