In Files

  • rubygems/package/tar_writer.rb

Class/Module Index [+]

Quicksearch

Gem::Package::TarWriter

Allows writing of tar files

Public Class Methods

new(io) click to toggle source

Creates a new TarWriter, yielding it if a block is given

 
               # File rubygems/package/tar_writer.rb, line 76
def self.new(io)
  writer = super

  return writer unless block_given?

  begin
    yield writer
  ensure
    writer.close
  end

  nil
end
            
new(io) click to toggle source

Creates a new TarWriter that will write to io

 
               # File rubygems/package/tar_writer.rb, line 93
def initialize(io)
  @io = io
  @closed = false
end
            

Public Instance Methods

add_file(name, mode) click to toggle source

Adds file name with permissions mode, and yields an IO for writing the file to

 
               # File rubygems/package/tar_writer.rb, line 102
def add_file(name, mode) # :yields: io
  check_closed

  raise Gem::Package::NonSeekableIO unless @io.respond_to? :pos=

  name, prefix = split_name name

  init_pos = @io.pos
  @io.write "\0" * 512 # placeholder for the header

  yield RestrictedStream.new(@io) if block_given?

  size = @io.pos - init_pos - 512

  remainder = (512 - (size % 512)) % 512
  @io.write "\0" * remainder

  final_pos = @io.pos
  @io.pos = init_pos

  header = Gem::Package::TarHeader.new :name => name, :mode => mode,
                                       :size => size, :prefix => prefix

  @io.write header
  @io.pos = final_pos

  self
end
            
add_file_digest(name, mode, digest_algorithms) click to toggle source

Adds name with permissions mode to the tar, yielding io for writing the file. The digest_algorithm is written to a read-only name.sum file following the given file contents containing the digest name and hexdigest separated by a tab.

The created digest object is returned.

 
               # File rubygems/package/tar_writer.rb, line 139
def add_file_digest name, mode, digest_algorithms # :yields: io
  digests = digest_algorithms.map do |digest_algorithm|
    digest = digest_algorithm.new
    [digest.name, digest]
  end

  digests = Hash[*digests.flatten]

  add_file name, mode do |io|
    Gem::Package::DigestIO.wrap io, digests do |digest_io|
      yield digest_io
    end
  end

  digests
end
            
add_file_signed(name, mode, signer) click to toggle source

Adds name with permissions mode to the tar, yielding io for writing the file. The signer is used to add a digest file using its digest_algorithm per #add_file_digest and a cryptographic signature in name.sig. If the signer has no key only the checksum file is added.

Returns the digest.

 
               # File rubygems/package/tar_writer.rb, line 164
def add_file_signed name, mode, signer
  digest_algorithms = [
    signer.digest_algorithm,
    OpenSSL::Digest::SHA512,
  ].uniq

  digests = add_file_digest name, mode, digest_algorithms do |io|
    yield io
  end

  signature_digest = digests.values.find do |digest|
    digest.name == signer.digest_name
  end

  signature = signer.sign signature_digest.digest

  add_file_simple "#{name}.sig", 0444, signature.length do |io|
    io.write signature
  end if signature

  digests
end
            
add_file_simple(name, mode, size) click to toggle source

Add file name with permissions mode size bytes long. Yields an IO to write the file to.

 
               # File rubygems/package/tar_writer.rb, line 191
def add_file_simple(name, mode, size) # :yields: io
  check_closed

  name, prefix = split_name name

  header = Gem::Package::TarHeader.new(:name => name, :mode => mode,
                                       :size => size, :prefix => prefix).to_s

  @io.write header
  os = BoundedStream.new @io, size

  yield os if block_given?

  min_padding = size - os.written
  @io.write("\0" * min_padding)

  remainder = (512 - (size % 512)) % 512
  @io.write("\0" * remainder)

  self
end
            
check_closed() click to toggle source

Raises IOError if the TarWriter is closed

 
               # File rubygems/package/tar_writer.rb, line 216
def check_closed
  raise IOError, "closed #{self.class}" if closed?
end
            
close() click to toggle source

Closes the TarWriter

 
               # File rubygems/package/tar_writer.rb, line 223
def close
  check_closed

  @io.write "\0" * 1024
  flush

  @closed = true
end
            
closed?() click to toggle source

Is the TarWriter closed?

 
               # File rubygems/package/tar_writer.rb, line 235
def closed?
  @closed
end
            
flush() click to toggle source

Flushes the TarWriter’s IO

 
               # File rubygems/package/tar_writer.rb, line 242
def flush
  check_closed

  @io.flush if @io.respond_to? :flush
end
            
mkdir(name, mode) click to toggle source

Creates a new directory in the tar file name with mode

 
               # File rubygems/package/tar_writer.rb, line 251
def mkdir(name, mode)
  check_closed

  name, prefix = split_name(name)

  header = Gem::Package::TarHeader.new :name => name, :mode => mode,
                                       :typeflag => "5", :size => 0,
                                       :prefix => prefix

  @io.write header

  self
end
            

Commenting is here to help enhance the documentation. For example, code samples, or clarification of the documentation.

If you have questions about Ruby or the documentation, please post to one of the Ruby mailing lists. You will get better, faster, help that way.

If you wish to post a correction of the docs, please do so, but also file bug report so that it can be corrected for the next release. Thank you.

If you want to help improve the Ruby documentation, please visit Documenting-ruby.org.

blog comments powered by Disqus