Class Gem::Package::TarHeader
In: lib/rubygems/package/tar_header.rb
Parent: Object

A header for a tar file

Methods

empty?   from   new   strict_oct   update_checksum  

Constants

FIELDS = [ :checksum, :devmajor, :devminor, :gid, :gname, :linkname, :magic, :mode, :mtime, :name, :prefix, :size, :typeflag, :uid, :uname, :version, ]   Fields in the tar header
PACK_FORMAT = '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'   Pack format for a tar header
UNPACK_FORMAT = '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'   Unpack format for a tar header

Public Class methods

Creates a tar header from IO stream

[Source]

     # File lib/rubygems/package/tar_header.rb, line 99
 99:   def self.from(stream)
100:     header = stream.read 512
101:     empty = (header == "\0" * 512)
102: 
103:     fields = header.unpack UNPACK_FORMAT
104: 
105:     name     = fields.shift
106:     mode     = strict_oct(fields.shift)
107:     uid      = strict_oct(fields.shift)
108:     gid      = strict_oct(fields.shift)
109:     size     = strict_oct(fields.shift)
110:     mtime    = strict_oct(fields.shift)
111:     checksum = strict_oct(fields.shift)
112:     typeflag = fields.shift
113:     linkname = fields.shift
114:     magic    = fields.shift
115:     version  = strict_oct(fields.shift)
116:     uname    = fields.shift
117:     gname    = fields.shift
118:     devmajor = strict_oct(fields.shift)
119:     devminor = strict_oct(fields.shift)
120:     prefix   = fields.shift
121: 
122:     new :name     => name,
123:         :mode     => mode,
124:         :uid      => uid,
125:         :gid      => gid,
126:         :size     => size,
127:         :mtime    => mtime,
128:         :checksum => checksum,
129:         :typeflag => typeflag,
130:         :linkname => linkname,
131:         :magic    => magic,
132:         :version  => version,
133:         :uname    => uname,
134:         :gname    => gname,
135:         :devmajor => devmajor,
136:         :devminor => devminor,
137:         :prefix   => prefix,
138: 
139:         :empty    => empty
140: 
141:     # HACK unfactor for Rubinius
142:     #new :name     => fields.shift,
143:     #    :mode     => fields.shift.oct,
144:     #    :uid      => fields.shift.oct,
145:     #    :gid      => fields.shift.oct,
146:     #    :size     => fields.shift.oct,
147:     #    :mtime    => fields.shift.oct,
148:     #    :checksum => fields.shift.oct,
149:     #    :typeflag => fields.shift,
150:     #    :linkname => fields.shift,
151:     #    :magic    => fields.shift,
152:     #    :version  => fields.shift.oct,
153:     #    :uname    => fields.shift,
154:     #    :gname    => fields.shift,
155:     #    :devmajor => fields.shift.oct,
156:     #    :devminor => fields.shift.oct,
157:     #    :prefix   => fields.shift,
158: 
159:     #    :empty => empty
160:   end

Creates a new TarHeader using vals

[Source]

     # File lib/rubygems/package/tar_header.rb, line 170
170:   def initialize(vals)
171:     unless vals[:name] && vals[:size] && vals[:prefix] && vals[:mode] then
172:       raise ArgumentError, ":name, :size, :prefix and :mode required"
173:     end
174: 
175:     vals[:uid] ||= 0
176:     vals[:gid] ||= 0
177:     vals[:mtime] ||= 0
178:     vals[:checksum] ||= ""
179:     vals[:typeflag] ||= "0"
180:     vals[:magic] ||= "ustar"
181:     vals[:version] ||= "00"
182:     vals[:uname] ||= "wheel"
183:     vals[:gname] ||= "wheel"
184:     vals[:devmajor] ||= 0
185:     vals[:devminor] ||= 0
186: 
187:     FIELDS.each do |name|
188:       instance_variable_set "@#{name}", vals[name]
189:     end
190: 
191:     @empty = vals[:empty]
192:   end

[Source]

     # File lib/rubygems/package/tar_header.rb, line 162
162:   def self.strict_oct(str)
163:     return str.oct if str =~ /\A[0-7]*\z/
164:     raise ArgumentError, "#{str.inspect} is not an octal string"
165:   end

Public Instance methods

Is the tar entry empty?

[Source]

     # File lib/rubygems/package/tar_header.rb, line 197
197:   def empty?
198:     @empty
199:   end

Updates the TarHeader‘s checksum

[Source]

     # File lib/rubygems/package/tar_header.rb, line 229
229:   def update_checksum
230:     header = header " " * 8
231:     @checksum = oct calculate_checksum(header), 6
232:   end

[Validate]