Support for the Ruby 2.4 series has ended. See here for reference.

In Files

  • rubygems/package/tar_reader.rb
  • rubygems/package/tar_reader/entry.rb
  • rubygems/package/tar_test_case.rb

Class/Module Index [+]

Quicksearch

Gem::Package::TarReader

TarReader reads tar files and allows iteration over their items

Public Class Methods

new(io) click to toggle source

Creates a new TarReader on io and yields it to the block, if given.

 
               # File rubygems/package/tar_reader.rb, line 22
def self.new(io)
  reader = super

  return reader unless block_given?

  begin
    yield reader
  ensure
    reader.close
  end

  nil
end
            
new(io) click to toggle source

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

 
               # File rubygems/package/tar_reader.rb, line 40
def initialize(io)
  @io = io
  @init_pos = io.pos
end
            

Public Instance Methods

close() click to toggle source

Close the tar file

 
               # File rubygems/package/tar_reader.rb, line 48
def close
end
            
each() click to toggle source

Iterates over files in the tarball yielding each entry

 
               # File rubygems/package/tar_reader.rb, line 54
def each
  return enum_for __method__ unless block_given?

  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

    begin
      # avoid reading...
      @io.seek pending, IO::SEEK_CUR
      pending = 0
    rescue Errno::EINVAL, NameError
      while pending > 0 do
        bytes_read = @io.read([pending, 4096].min).size
        raise UnexpectedEOF if @io.eof?
        pending -= bytes_read
      end
    end

    @io.read skip # discard trailing zeros

    # make sure nobody can use #read, #getc or #rewind anymore
    entry.close
  end
end
            
Also aliased as: each_entry
each_entry() click to toggle source
Alias for: each
rewind() click to toggle source

NOTE: Do not call rewind during each

 
               # File rubygems/package/tar_reader.rb, line 93
def rewind
  if @init_pos == 0 then
    raise Gem::Package::NonSeekableIO unless @io.respond_to? :rewind
    @io.rewind
  else
    raise Gem::Package::NonSeekableIO unless @io.respond_to? :pos=
    @io.pos = @init_pos
  end
end
            
seek(name) click to toggle source

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.

 
               # File rubygems/package/tar_reader.rb, line 108
def seek name # :yields: entry
  found = find do |entry|
    entry.full_name == name
  end

  return unless found

  return yield found
ensure
  rewind
end