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::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 21
21:   def self.new(io)
22:     reader = super
23: 
24:     return reader unless block_given?
25: 
26:     begin
27:       yield reader
28:     ensure
29:       reader.close
30:     end
31: 
32:     nil
33:   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 39
39:   def initialize(io)
40:     @io = io
41:     @init_pos = io.pos
42:   end

Public Instance methods

Close the tar file

[Source]

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

Iterates over files in the tarball yielding each entry

[Source]

    # File lib/rubygems/package/tar_reader.rb, line 53
53:   def each
54:     loop do
55:       return if @io.eof?
56: 
57:       header = Gem::Package::TarHeader.from @io
58:       return if header.empty?
59: 
60:       entry = Gem::Package::TarReader::Entry.new header, @io
61:       size = entry.header.size
62: 
63:       yield entry
64: 
65:       skip = (512 - (size % 512)) % 512
66:       pending = size - entry.bytes_read
67: 
68:       begin
69:         # avoid reading...
70:         @io.seek pending, IO::SEEK_CUR
71:         pending = 0
72:       rescue Errno::EINVAL, NameError
73:         while pending > 0 do
74:           bytes_read = @io.read([pending, 4096].min).size
75:           raise UnexpectedEOF if @io.eof?
76:           pending -= bytes_read
77:         end
78:       end
79: 
80:       @io.read skip # discard trailing zeros
81: 
82:       # make sure nobody can use #read, #getc or #rewind anymore
83:       entry.close
84:     end
85:   end
each_entry()

Alias for each

NOTE: Do not call rewind during each

[Source]

     # File lib/rubygems/package/tar_reader.rb, line 92
 92:   def rewind
 93:     if @init_pos == 0 then
 94:       raise Gem::Package::NonSeekableIO unless @io.respond_to? :rewind
 95:       @io.rewind
 96:     else
 97:       raise Gem::Package::NonSeekableIO unless @io.respond_to? :pos=
 98:       @io.pos = @init_pos
 99:     end
100:   end

[Validate]