Allows writing of tar files
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
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
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 "\00"" * 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 "\00"" * 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
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
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 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("\00"" * min_padding)
remainder = (512 - (size % 512)) % 512
@io.write("\00"" * remainder)
self
end
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
Closes the TarWriter
# File rubygems/package/tar_writer.rb, line 223
def close
check_closed
@io.write "\00"" * 1024
flush
@closed = true
end
Is the TarWriter closed?
# File rubygems/package/tar_writer.rb, line 235
def closed?
@closed
end
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
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 see Improve the docs, or visit Documenting-ruby.org.