Class | Gem::Package::TarReader |
In: |
lib/rubygems/package/tar_reader.rb
|
Parent: | Object |
TarReader reads tar files and allows iteration over their items
Iterates over files in the tarball yielding each entry
# File lib/rubygems/package/tar_reader.rb, line 54 54: def each 55: loop do 56: return if @io.eof? 57: 58: header = Gem::Package::TarHeader.from @io 59: return if header.empty? 60: 61: entry = Gem::Package::TarReader::Entry.new header, @io 62: size = entry.header.size 63: 64: yield entry 65: 66: skip = (512 - (size % 512)) % 512 67: pending = size - entry.bytes_read 68: 69: begin 70: # avoid reading... 71: @io.seek pending, IO::SEEK_CUR 72: pending = 0 73: rescue Errno::EINVAL, NameError 74: while pending > 0 do 75: bytes_read = @io.read([pending, 4096].min).size 76: raise UnexpectedEOF if @io.eof? 77: pending -= bytes_read 78: end 79: end 80: 81: @io.read skip # discard trailing zeros 82: 83: # make sure nobody can use #read, #getc or #rewind anymore 84: entry.close 85: end 86: end
NOTE: Do not call rewind during each
# File lib/rubygems/package/tar_reader.rb, line 93 93: def rewind 94: if @init_pos == 0 then 95: raise Gem::Package::NonSeekableIO unless @io.respond_to? :rewind 96: @io.rewind 97: else 98: raise Gem::Package::NonSeekableIO unless @io.respond_to? :pos= 99: @io.pos = @init_pos 100: end 101: end