Class: Gem::Package::TarReader

Inherits:
Object
  • Object
show all
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

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(io) ⇒ TarReader

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



37
38
39
40
# File 'lib/rubygems/package/tar_reader.rb', line 37

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.



19
20
21
22
23
24
25
26
27
28
29
30
31
# File 'lib/rubygems/package/tar_reader.rb', line 19

def self.new(io)
  reader = super

  return reader unless block_given?

  begin
    yield reader
  ensure
    reader.close
  end

  nil
end

Instance Method Details

#closeObject

Close the tar file



45
46
# File 'lib/rubygems/package/tar_reader.rb', line 45

def close
end

#eachObject Also known as: each_entry

Iterates over files in the tarball yielding each entry



51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
# File 'lib/rubygems/package/tar_reader.rb', line 51

def each
  return enum_for __method__ unless block_given?

  until @io.eof? do
    begin
      header = Gem::Package::TarHeader.from @io
    rescue ArgumentError => e
      # Specialize only exceptions from Gem::Package::TarHeader.strict_oct
      raise e unless e.message.match?(/ is not an octal string$/)
      raise Gem::Package::TarInvalidError, e.message
    end

    return if header.empty?
    entry = Gem::Package::TarReader::Entry.new header, @io
    yield entry
    entry.close
  end
end

#rewindObject

NOTE: Do not call #rewind during #each



75
76
77
78
79
80
81
# File 'lib/rubygems/package/tar_reader.rb', line 75

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.



88
89
90
91
92
93
94
95
96
97
98
# File 'lib/rubygems/package/tar_reader.rb', line 88

def seek(name) # :yields: entry
  found = find do |entry|
    entry.full_name == name
  end

  return unless found

  yield found
ensure
  rewind
end