class Gem::Package::TarReader

def self.new(io)

def self.new(io)
  reader = super
  return reader unless block_given?
  begin
    yield reader
  ensure
    reader.close
  end
  nil
end

def close

def close
end

def each

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

def initialize(io)

def initialize(io)
  @io = io
  @init_pos = io.pos
end

def rewind

def rewind
  if @init_pos == 0
    @io.rewind
  else
    @io.pos = @init_pos
  end
end

def seek(name) # :yields: entry

:yields: entry
def seek(name) # :yields: entry
  found = find do |entry|
    entry.full_name == name
  end
  return unless found
  yield found
ensure
  rewind
end