Class Gem::Package::TarReader
In: lib/rubygems/package/tar_reader.rb
Parent: Object

TarReader reads tar files and allows iteration over their items

Methods

close   each   each_entry   new   new   rewind  

Included Modules

Gem::Package

Classes and Modules

Class Gem::Package::TarReader::Entry
Class Gem::Package::TarReader::UnexpectedEOF

Public Class methods

Creates a new TarReader on io and yields it to the block, if given.

[Source]

    # File lib/rubygems/package/tar_reader.rb, line 22
22:   def self.new(io)
23:     reader = super
24: 
25:     return reader unless block_given?
26: 
27:     begin
28:       yield reader
29:     ensure
30:       reader.close
31:     end
32: 
33:     nil
34:   end

Creates a new tar file reader on io which needs to respond to pos, eof?, read, getc and pos=

[Source]

    # File lib/rubygems/package/tar_reader.rb, line 40
40:   def initialize(io)
41:     @io = io
42:     @init_pos = io.pos
43:   end

Public Instance methods

Close the tar file

[Source]

    # File lib/rubygems/package/tar_reader.rb, line 48
48:   def close
49:   end

Iterates over files in the tarball yielding each entry

[Source]

    # 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
each_entry()

Alias for each

NOTE: Do not call rewind during each

[Source]

     # 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

[Validate]