Parent

Class Index [+]

Quicksearch

Gem::Package::TarHeader

A header for a tar file

Constants

FIELDS

Fields in the tar header

PACK_FORMAT

Pack format for a tar header

UNPACK_FORMAT

Unpack format for a tar header

Public Class Methods

from(stream) click to toggle source

Creates a tar header from IO stream

     # File lib/rubygems/package/tar_header.rb, line 99
 99:   def self.from(stream)
100:     header = stream.read 512
101:     empty = (header == "\00"" * 512)
102: 
103:     fields = header.unpack UNPACK_FORMAT
104: 
105:     name     = fields.shift
106:     mode     = fields.shift.oct
107:     uid      = fields.shift.oct
108:     gid      = fields.shift.oct
109:     size     = fields.shift.oct
110:     mtime    = fields.shift.oct
111:     checksum = fields.shift.oct
112:     typeflag = fields.shift
113:     linkname = fields.shift
114:     magic    = fields.shift
115:     version  = fields.shift.oct
116:     uname    = fields.shift
117:     gname    = fields.shift
118:     devmajor = fields.shift.oct
119:     devminor = fields.shift.oct
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
new(vals) click to toggle source

Creates a new TarHeader using vals

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

Public Instance Methods

empty?() click to toggle source

Is the tar entry empty?

     # File lib/rubygems/package/tar_header.rb, line 192
192:   def empty?
193:     @empty
194:   end
update_checksum() click to toggle source

Updates the TarHeader’s checksum

     # File lib/rubygems/package/tar_header.rb, line 224
224:   def update_checksum
225:     header = header " " * 8
226:     @checksum = oct calculate_checksum(header), 6
227:   end

Private Instance Methods

calculate_checksum(header) click to toggle source
     # File lib/rubygems/package/tar_header.rb, line 231
231:   def calculate_checksum(header)
232:     header.unpack("C*").inject { |a, b| a + b }
233:   end
header(checksum = @checksum) click to toggle source
     # File lib/rubygems/package/tar_header.rb, line 235
235:   def header(checksum = @checksum)
236:     header = [
237:       name,
238:       oct(mode, 7),
239:       oct(uid, 7),
240:       oct(gid, 7),
241:       oct(size, 11),
242:       oct(mtime, 11),
243:       checksum,
244:       " ",
245:       typeflag,
246:       linkname,
247:       magic,
248:       oct(version, 2),
249:       uname,
250:       gname,
251:       oct(devmajor, 7),
252:       oct(devminor, 7),
253:       prefix
254:     ]
255: 
256:     header = header.pack PACK_FORMAT
257: 
258:     header << ("\00"" * ((512 - header.size) % 512))
259:   end
oct(num, len) click to toggle source
     # File lib/rubygems/package/tar_header.rb, line 261
261:   def oct(num, len)
262:     "%0#{len}o" % num
263:   end

Disabled; run with --debug to generate this.

[Validate]

Generated with the Darkfish Rdoc Generator 1.1.6.