Allows writing of tar files
Creates a new TarWriter, yielding it if a block is given
# File rubygems/package/tar_writer.rb, line 78 def self.new(io) writer = super return writer unless block_given? begin yield writer ensure writer.close end nil end
Creates a new TarWriter that will write to
io
# File rubygems/package/tar_writer.rb, line 95 def initialize(io) @io = io @closed = false end
Adds file name
with permissions mode
, and yields
an IO for writing the file to
# File rubygems/package/tar_writer.rb, line 104 def add_file(name, mode) # :yields: io check_closed name, prefix = split_name name init_pos = @io.pos @io.write Gem::Package::TarHeader::EMPTY_HEADER # 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, :mtime => ENV["SOURCE_DATE_EPOCH"] ? Time.at(ENV["SOURCE_DATE_EPOCH"].to_i).utc : Time.now @io.write header @io.pos = final_pos self end
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 140 def add_file_digest(name, mode, digest_algorithms) # :yields: io digests = digest_algorithms.map do |digest_algorithm| digest = digest_algorithm.new digest_name = if digest.respond_to? :name digest.name else /::([^:]+)$/ =~ digest_algorithm.name $1 end [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
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 173 def add_file_signed(name, mode, signer) digest_algorithms = [ signer.digest_algorithm, Digest::SHA512, ].compact.uniq digests = add_file_digest name, mode, digest_algorithms do |io| yield io end signature_digest = digests.values.compact.find do |digest| digest_name = if digest.respond_to? :name digest.name else digest.class.name[/::([^:]+)\z/, 1] end digest_name == signer.digest_name end raise "no #{signer.digest_name} in #{digests.values.compact}" unless signature_digest if signer.key signature = signer.sign signature_digest.digest add_file_simple "#{name}.sig", 0444, signature.length do |io| io.write signature end end digests end
Add file name
with permissions mode
size
bytes long. Yields an IO to write the file to.
# File rubygems/package/tar_writer.rb, line 211 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, :mtime => ENV["SOURCE_DATE_EPOCH"] ? Time.at(ENV["SOURCE_DATE_EPOCH"].to_i).utc : Time.now).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
Adds symlink name
with permissions mode
, linking
to target
.
# File rubygems/package/tar_writer.rb, line 237 def add_symlink(name, target, mode) check_closed name, prefix = split_name name header = Gem::Package::TarHeader.new(:name => name, :mode => mode, :size => 0, :typeflag => "2", :linkname => target, :prefix => prefix, :mtime => ENV["SOURCE_DATE_EPOCH"] ? Time.at(ENV["SOURCE_DATE_EPOCH"].to_i).utc : Time.now).to_s @io.write header self end
Raises IOError if the TarWriter is closed
# File rubygems/package/tar_writer.rb, line 256 def check_closed raise IOError, "closed #{self.class}" if closed? end
Closes the TarWriter
# File rubygems/package/tar_writer.rb, line 263 def close check_closed @io.write "\0" * 1024 flush @closed = true end
Is the TarWriter closed?
# File rubygems/package/tar_writer.rb, line 275 def closed? @closed end
Flushes the TarWriter's IO
# File rubygems/package/tar_writer.rb, line 282 def flush check_closed @io.flush if @io.respond_to? :flush end
Creates a new directory in the tar file name
with
mode
# File rubygems/package/tar_writer.rb, line 291 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, :mtime => ENV["SOURCE_DATE_EPOCH"] ? Time.at(ENV["SOURCE_DATE_EPOCH"].to_i).utc : Time.now @io.write header self end