class Gem::Package::TarWriter
允许写入 tar 文件
公共类方法
new(io) { |writer| ... } 点击以切换源代码
创建一个新的 TarWriter
,如果提供了代码块,则将其传递给代码块
调用父类方法
# File rubygems/package/tar_writer.rb, line 75 def self.new(io) writer = super return writer unless block_given? begin yield writer ensure writer.close end nil end
new(io) 点击以切换源代码
创建一个新的 TarWriter
,它将写入 io
# File rubygems/package/tar_writer.rb, line 92 def initialize(io) @io = io @closed = false end
公共实例方法
add_file(name, mode) { |io| ... } 点击以切换源代码
添加具有权限 mode
的文件 name
,并产生一个 IO 用于写入文件
# File rubygems/package/tar_writer.rb, line 101 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: Gem.source_date_epoch @io.write header @io.pos = final_pos self end
add_file_digest(name, mode, digest_algorithms) { |io| ... } 点击以切换源代码
将具有权限 mode
的 name
添加到 tar 文件中,产生 io
用于写入文件。digest_algorithm
被写入一个只读的 name
.sum 文件,该文件位于给定的文件内容之后,其中包含摘要名称和十六进制摘要,以制表符分隔。
返回创建的摘要对象。
# File rubygems/package/tar_writer.rb, line 137 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.class.name[/::([^:]+)\z/, 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
add_file_signed(name, mode, signer) { |io| ... } 点击以切换源代码
将具有权限 mode
的 name
添加到 tar 文件中,产生 io
用于写入文件。signer
用于使用其每个 add_file_digest
的 digest_algorithm 添加摘要文件以及 name
.sig 中的加密签名。如果签名者没有密钥,则仅添加校验和文件。
返回摘要。
# File rubygems/package/tar_writer.rb, line 169 def add_file_signed(name, mode, signer) digest_algorithms = [ signer.digest_algorithm, Gem::Security.create_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", 0o444, signature.length do |io| io.write signature end end digests end
add_file_simple(name, mode, size) { |io| ... } 点击以切换源代码
添加具有权限 mode
,长度为 size
字节的文件 name
。产生一个 IO 用于写入文件。
# File rubygems/package/tar_writer.rb, line 207 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: Gem.source_date_epoch).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
add_symlink(name, target, mode) 点击以切换源代码
添加符号链接 name
,具有权限 mode
,链接到 target
。
# File rubygems/package/tar_writer.rb, line 233 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: Gem.source_date_epoch).to_s @io.write header self end
check_closed() 点击以切换源代码
如果 TarWriter
已关闭,则引发 IOError
# File rubygems/package/tar_writer.rb, line 252 def check_closed raise IOError, "closed #{self.class}" if closed? end
close() 点击以切换源代码
关闭 TarWriter
# File rubygems/package/tar_writer.rb, line 259 def close check_closed @io.write "\0" * 1024 flush @closed = true end
closed?() 点击以切换源代码
TarWriter
是否已关闭?
# File rubygems/package/tar_writer.rb, line 271 def closed? @closed end
flush() 点击以切换源代码
刷新 TarWriter 的 IO
# File rubygems/package/tar_writer.rb, line 278 def flush check_closed @io.flush if @io.respond_to? :flush end
mkdir(name, mode) 点击以切换源代码
在 tar 文件中创建具有 mode
的新目录 name
# File rubygems/package/tar_writer.rb, line 287 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: Gem.source_date_epoch @io.write header self end