Class | Gem::Package::TarReader |
In: |
lib/rubygems/package/tar_reader.rb
|
Parent: | Object |
# File lib/rubygems/package/tar_reader.rb, line 14 14: def self.new(io) 15: reader = super 16: 17: return reader unless block_given? 18: 19: begin 20: yield reader 21: ensure 22: reader.close 23: end 24: 25: nil 26: end
# File lib/rubygems/package/tar_reader.rb, line 28 28: def initialize(io) 29: @io = io 30: @init_pos = io.pos 31: end
# File lib/rubygems/package/tar_reader.rb, line 36 36: def each 37: loop do 38: return if @io.eof? 39: 40: header = Gem::Package::TarHeader.from @io 41: return if header.empty? 42: 43: entry = Gem::Package::TarReader::Entry.new header, @io 44: size = entry.header.size 45: 46: yield entry 47: 48: skip = (512 - (size % 512)) % 512 49: pending = size - entry.bytes_read 50: 51: begin 52: # avoid reading... 53: @io.seek pending, IO::SEEK_CUR 54: pending = 0 55: rescue Errno::EINVAL, NameError 56: while pending > 0 do 57: bytes_read = @io.read([pending, 4096].min).size 58: raise UnexpectedEOF if @io.eof? 59: pending -= bytes_read 60: end 61: end 62: 63: @io.read skip # discard trailing zeros 64: 65: # make sure nobody can use #read, #getc or #rewind anymore 66: entry.close 67: end 68: end
NOTE: Do not call rewind during each
# File lib/rubygems/package/tar_reader.rb, line 75 75: def rewind 76: if @init_pos == 0 then 77: raise Gem::Package::NonSeekableIO unless @io.respond_to? :rewind 78: @io.rewind 79: else 80: raise Gem::Package::NonSeekableIO unless @io.respond_to? :pos= 81: @io.pos = @init_pos 82: end 83: end