Class: Dev::Tar

Inherits:
Object show all
Defined in:
lib/firespring_dev_commands/tar.rb,
lib/firespring_dev_commands/tar/type_flag.rb,
lib/firespring_dev_commands/tar/pax_header.rb

Overview

Class for natively un-tar’ing a file in ruby

Defined Under Namespace

Modules: PaxHeader, TypeFlag

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(data = nil) ⇒ Tar

Returns a new instance of Tar.



8
9
10
# File 'lib/firespring_dev_commands/tar.rb', line 8

def initialize(data = nil)
  @data = data
end

Instance Attribute Details

#dataObject

Returns the value of attribute data.



6
7
8
# File 'lib/firespring_dev_commands/tar.rb', line 6

def data
  @data
end

Instance Method Details

#unpack(source_path, dest_path) ⇒ Object

Unpack all data in the given tar into the dest_path



13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/firespring_dev_commands/tar.rb', line 13

def unpack(source_path, dest_path)
  data.rewind
  extended_headers = nil
  ::Gem::Package::TarReader.new(data).each do |entry|
    # Using https://github.com/kr/tarutil/blob/master/untar.go as a template
    # Also check out https://go.googlesource.com/go/+/master/src/archive/tar/reader.go?autodive=0%2F%2F%2F
    case entry.header.typeflag
    when TypeFlag::TYPE_DIR
      merge_pax(entry, extended_headers)
      dest_name = calc_dest_name(source_path, dest_path, entry)
      create_directory(entry, dest_name)

    when TypeFlag::TYPE_REG, TypeFlag::TYPE_REG_A
      merge_pax(entry, extended_headers)
      dest_name = calc_dest_name(source_path, dest_path, entry)
      create_file(entry, dest_name)

    when TypeFlag::TYPE_LINK
      raise 'Unimplemented file type: Link'

    when TypeFlag::TYPE_SYMLINK
      merge_pax(entry, extended_headers)
      dest_name = calc_dest_name(source_path, dest_path, entry)
      create_symlink(entry, dest_name)

    when TypeFlag::TYPE_X_HEADER
      extended_headers = parse_pax(entry.read)
      next

    when TypeFlag::TYPE_CONT, TypeFlag::TYPE_X_GLOBAL_HEADER
      raise 'Unimplemented file type Cont/XGlobalHeader'

    when TypeFlag::TYPE_CHAR, TypeFlag::TYPE_BLOCK, TypeFlag::TYPE_FIFO
      raise 'Unimplemented file type: Char/Block/Fifo'

    else
      raise 'Unrecognized file type'

    end

    # If we got here we should be done with any extended headers
    extended_headers = nil
  end
end