Class: Gem::Package::TarHeader
Relationships & Source Files | |
Inherits: | Object |
Defined in: | lib/rubygems/package/tar_header.rb |
Overview
A header for a tar file
Constant Summary
-
EMPTY =
private
Internal use only
# File 'lib/rubygems/package/tar_header.rb', line 175new({ # :nodoc: checksum: 0, gname: "", linkname: "", magic: "", mode: 0, name: "", prefix: "", size: 0, uname: "", version: 0, empty: true, }).freeze
-
EMPTY_HEADER =
Internal use only
# File 'lib/rubygems/package/tar_header.rb', line 98("\0" * 512).b.freeze
-
FIELDS =
Fields in the tar header
[ :checksum, :devmajor, :devminor, :gid, :gname, :linkname, :magic, :mode, :mtime, :name, :prefix, :size, :typeflag, :uid, :uname, :version, ].freeze
-
PACK_FORMAT =
Pack format for a tar header
"a100" + # name "a8" + # mode "a8" + # uid "a8" + # gid "a12" + # size "a12" + # mtime "a7a" + # chksum "a" + # typeflag "a100" + # linkname "a6" + # magic "a2" + # version "a32" + # uname "a32" + # gname "a8" + # devmajor "a8" + # devminor "a155"
-
UNPACK_FORMAT =
Unpack format for a tar header
"A100" + # name "A8" + # mode "A8" + # uid "A8" + # gid "A12" + # size "A12" + # mtime "A8" + # checksum "A" + # typeflag "A100" + # linkname "A6" + # magic "A2" + # version "A32" + # uname "A32" + # gname "A8" + # devmajor "A8" + # devminor "A155"
Class Method Summary
-
.from(stream)
Creates a tar header from IO
stream
-
.new(vals) ⇒ TarHeader
constructor
Creates a new
TarHeader
usingvals
- .oct_or_256based(str)
- .strict_oct(str)
Instance Attribute Summary
-
#empty? ⇒ Boolean
readonly
Is the tar entry empty?
Instance Method Summary
-
#update_checksum
Updates the TarHeader’s checksum.
- #calculate_checksum(header) private
- #header(checksum = @checksum) private
- #oct(num, len) private
- #==(other) Internal use only
- #to_s Internal use only
Constructor Details
.new(vals) ⇒ TarHeader
Creates a new TarHeader
using vals
# File 'lib/rubygems/package/tar_header.rb', line 149
def initialize(vals) unless vals[:name] && vals[:size] && vals[:prefix] && vals[:mode] raise ArgumentError, ":name, :size, :prefix and :mode required" end @checksum = vals[:checksum] || "" @devmajor = vals[:devmajor] || 0 @devminor = vals[:devminor] || 0 @gid = vals[:gid] || 0 @gname = vals[:gname] || "wheel" @linkname = vals[:linkname] @magic = vals[:magic] || "ustar" @mode = vals[:mode] @mtime = vals[:mtime] || 0 @name = vals[:name] @prefix = vals[:prefix] @size = vals[:size] @typeflag = vals[:typeflag] @typeflag = "0" if @typeflag.nil? || @typeflag.empty? @uid = vals[:uid] || 0 @uname = vals[:uname] || "wheel" @version = vals[:version] || "00" @empty = vals[:empty] end
Class Method Details
.from(stream)
Creates a tar header from IO stream
# File 'lib/rubygems/package/tar_header.rb', line 103
def self.from(stream) header = stream.read 512 return EMPTY if header == EMPTY_HEADER fields = header.unpack UNPACK_FORMAT new name: fields.shift, mode: strict_oct(fields.shift), uid: oct_or_256based(fields.shift), gid: oct_or_256based(fields.shift), size: strict_oct(fields.shift), mtime: strict_oct(fields.shift), checksum: strict_oct(fields.shift), typeflag: fields.shift, linkname: fields.shift, magic: fields.shift, version: strict_oct(fields.shift), uname: fields.shift, gname: fields.shift, devmajor: strict_oct(fields.shift), devminor: strict_oct(fields.shift), prefix: fields.shift, empty: false end
.oct_or_256based(str)
[ GitHub ]# File 'lib/rubygems/package/tar_header.rb', line 136
def self.oct_or_256based(str) # \x80 flags a positive 256-based number # \ff flags a negative 256-based number # In case we have a match, parse it as a signed binary value # in big-endian order, except that the high-order bit is ignored. return str.unpack1("@4N") if /\A[\x80\xff]/n.match?(str) strict_oct(str) end
.strict_oct(str)
# File 'lib/rubygems/package/tar_header.rb', line 129
def self.strict_oct(str) str.strip! return str.oct if /\A[0-7]*\z/.match?(str) raise ArgumentError, "#{str.inspect} is not an octal string" end
Instance Attribute Details
#empty? ⇒ Boolean
(readonly)
Is the tar entry empty?
# File 'lib/rubygems/package/tar_header.rb', line 194
def empty? @empty end
Instance Method Details
#==(other)
This method is for internal use only.
[ GitHub ]
# File 'lib/rubygems/package/tar_header.rb', line 198
def ==(other) # :nodoc: self.class === other && @checksum == other.checksum && @devmajor == other.devmajor && @devminor == other.devminor && @gid == other.gid && @gname == other.gname && @linkname == other.linkname && @magic == other.magic && @mode == other.mode && @mtime == other.mtime && @name == other.name && @prefix == other.prefix && @size == other.size && @typeflag == other.typeflag && @uid == other.uid && @uname == other.uname && @version == other.version end
#calculate_checksum(header) (private)
[ GitHub ]#header(checksum = @checksum) (private)
[ GitHub ]# File 'lib/rubygems/package/tar_header.rb', line 237
def header(checksum = @checksum) header = [ name, oct(mode, 7), oct(uid, 7), oct(gid, 7), oct(size, 11), oct(mtime, 11), checksum, " ", typeflag, linkname, magic, oct(version, 2), uname, gname, oct(devmajor, 7), oct(devminor, 7), prefix, ] header = header.pack PACK_FORMAT header.ljust 512, "\0" end
#oct(num, len) (private)
[ GitHub ]# File 'lib/rubygems/package/tar_header.rb', line 263
def oct(num, len) format("%0#{len}o", num) end
#to_s
This method is for internal use only.
[ GitHub ]
# File 'lib/rubygems/package/tar_header.rb', line 218
def to_s # :nodoc: update_checksum header end
#update_checksum
Updates the TarHeader’s checksum
# File 'lib/rubygems/package/tar_header.rb', line 226
def update_checksum header = header " " * 8 @checksum = oct calculate_checksum(header), 6 end