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

Methods

close   each   each_entry   new   new   rewind  

Included Modules

Gem::Package

Classes and Modules

Class Gem::Package::TarReader::UnexpectedEOF

Public Class methods

[Source]

    # 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

[Source]

    # File lib/rubygems/package/tar_reader.rb, line 28
28:   def initialize(io)
29:     @io = io
30:     @init_pos = io.pos
31:   end

Public Instance methods

[Source]

    # File lib/rubygems/package/tar_reader.rb, line 33
33:   def close
34:   end

[Source]

    # 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: 
50:       #if @io.respond_to? :seek then
51:       #  # avoid reading...
52:       #  @io.seek(size - entry.bytes_read, IO::SEEK_CUR)
53:       #else
54:         pending = size - entry.bytes_read
55: 
56:         while pending > 0 do
57:           bread = @io.read([pending, 4096].min).size
58:           raise UnexpectedEOF if @io.eof?
59:           pending -= bread
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
each_entry()

Alias for each

NOTE: Do not call rewind during each

[Source]

    # 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

[Validate]