Class: Gem::Package::TarReader
- Inherits:
-
Object
- Object
- Gem::Package::TarReader
- Includes:
- Enumerable
- Defined in:
- lib/rubygems/package/tar_reader.rb
Overview
TarReader reads tar files and allows iteration over their items
Defined Under Namespace
Classes: Entry, UnexpectedEOF
Class Method Summary collapse
-
.new(io) ⇒ Object
Creates a new TarReader on
io
and yields it to the block, if given.
Instance Method Summary collapse
-
#close ⇒ Object
Close the tar file.
-
#each ⇒ Object
(also: #each_entry)
Iterates over files in the tarball yielding each entry.
-
#initialize(io) ⇒ TarReader
constructor
Creates a new tar file reader on
io
which needs to respond to #pos, #eof?, #read, #getc and #pos=. -
#rewind ⇒ Object
NOTE: Do not call #rewind during #each.
-
#seek(name) ⇒ Object
Seeks through the tar file until it finds the
entry
withname
and yields it.
Constructor Details
#initialize(io) ⇒ TarReader
Creates a new tar file reader on io
which needs to respond to #pos, #eof?, #read, #getc and #pos=
41 42 43 44 |
# File 'lib/rubygems/package/tar_reader.rb', line 41 def initialize(io) @io = io @init_pos = io.pos end |
Class Method Details
.new(io) ⇒ Object
Creates a new TarReader on io
and yields it to the block, if given.
23 24 25 26 27 28 29 30 31 32 33 34 35 |
# File 'lib/rubygems/package/tar_reader.rb', line 23 def self.new(io) reader = super return reader unless block_given? begin yield reader ensure reader.close end nil end |
Instance Method Details
#close ⇒ Object
Close the tar file
49 50 |
# File 'lib/rubygems/package/tar_reader.rb', line 49 def close end |
#each ⇒ Object Also known as: each_entry
Iterates over files in the tarball yielding each entry
55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 |
# File 'lib/rubygems/package/tar_reader.rb', line 55 def each return enum_for __method__ unless block_given? use_seek = @io.respond_to?(:seek) until @io.eof? do header = Gem::Package::TarHeader.from @io return if header.empty? entry = Gem::Package::TarReader::Entry.new header, @io size = entry.header.size yield entry skip = (512 - (size % 512)) % 512 pending = size - entry.bytes_read if use_seek begin # avoid reading if the @io supports seeking @io.seek pending, IO::SEEK_CUR pending = 0 rescue Errno::EINVAL end end # if seeking isn't supported or failed while pending > 0 do bytes_read = @io.read([pending, 4096].min).size raise UnexpectedEOF if @io.eof? pending -= bytes_read end @io.read skip # discard trailing zeros # make sure nobody can use #read, #getc or #rewind anymore entry.close end end |
#rewind ⇒ Object
NOTE: Do not call #rewind during #each
100 101 102 103 104 105 106 |
# File 'lib/rubygems/package/tar_reader.rb', line 100 def rewind if @init_pos == 0 @io.rewind else @io.pos = @init_pos end end |
#seek(name) ⇒ Object
Seeks through the tar file until it finds the entry
with name
and yields it. Rewinds the tar file to the beginning when the block terminates.
113 114 115 116 117 118 119 120 121 122 123 |
# File 'lib/rubygems/package/tar_reader.rb', line 113 def seek(name) # :yields: entry found = find do |entry| entry.full_name == name end return unless found return yield found ensure rewind end |