class GZippedTar::Tar::Header

A header for a tar file

Constants

BLANK
ChecksumField
FIELDS

rubocop:disable Layout/ExtraSpacing

Field
HEADER_LENGTH
PACK_FORMAT

rubocop:enable Layout/ExtraSpacing

UNPACK_FORMAT

Attributes

values[R]

Public Class Methods

from(stream) click to toggle source

Creates a tar header from IO stream

# File lib/gzipped_tar/tar/header.rb, line 72
def self.from(stream)
  header = stream.read HEADER_LENGTH
  return new(BLANK) if header.nil?

  empty = (header == "\0" * HEADER_LENGTH)

  new values_from_array(header.unpack(UNPACK_FORMAT)).merge(:empty => empty)
end
new(values) click to toggle source
# File lib/gzipped_tar/tar/header.rb, line 91
def initialize(values)
  validate values

  @empty  = values[:empty]
  @values = FIELDS.inject({}) do |hash, field|
    hash[field.name] = field.translate values[field.name]
    hash
  end

  @values[:typeflag] = "0" if @values[:typeflag].empty?
end
values_from_array(values) click to toggle source
# File lib/gzipped_tar/tar/header.rb, line 81
def self.values_from_array(values)
  hash = {}

  FIELDS.each_with_index do |field, index|
    hash[field.name] = field.translate values[index]
  end

  hash
end

Public Instance Methods

empty?() click to toggle source
# File lib/gzipped_tar/tar/header.rb, line 108
def empty?
  @empty
end
name() click to toggle source
# File lib/gzipped_tar/tar/header.rb, line 112
def name
  @values[:name]
end
prefix() click to toggle source
# File lib/gzipped_tar/tar/header.rb, line 116
def prefix
  @values[:prefix]
end
size() click to toggle source
# File lib/gzipped_tar/tar/header.rb, line 120
def size
  values[:size]
end

Private Instance Methods

build_header() click to toggle source
# File lib/gzipped_tar/tar/header.rb, line 139
def build_header
  header = header_values.pack PACK_FORMAT

  header + ("\0" * ((HEADER_LENGTH - header.size) % HEADER_LENGTH))
end
calculate_checksum(header) click to toggle source
# File lib/gzipped_tar/tar/header.rb, line 135
def calculate_checksum(header)
  header.unpack("C*").inject { |a, b| a + b }
end
header_values() click to toggle source
# File lib/gzipped_tar/tar/header.rb, line 145
def header_values
  FIELDS.collect { |field| field.to_s values[field.name] }.flatten
end
update_checksum() click to toggle source
# File lib/gzipped_tar/tar/header.rb, line 149
def update_checksum
  values[:checksum] = nil
  values[:checksum] = calculate_checksum(build_header)
end
validate(values) click to toggle source
# File lib/gzipped_tar/tar/header.rb, line 154
def validate(values)
  FIELDS.select(&:required?).each do |field|
    next if values[field.name]

    raise ArgumentError, ":name, :size, :prefix and :mode required"
  end
end