Module: UnpackStrategy

Included in:
Air, Bzip2, Cab, Directory, Dmg, Fossil, GenericUnar, Gzip, Lha, Lzip, Lzma, P7Zip, Pax, Rar, Tar, Uncompressed, Xar, Xz, Zip
Defined in:
brew/Library/Homebrew/unpack_strategy.rb,
brew/Library/Homebrew/unpack_strategy/xz.rb,
brew/Library/Homebrew/unpack_strategy/air.rb,
brew/Library/Homebrew/unpack_strategy/cab.rb,
brew/Library/Homebrew/unpack_strategy/cvs.rb,
brew/Library/Homebrew/unpack_strategy/dmg.rb,
brew/Library/Homebrew/unpack_strategy/git.rb,
brew/Library/Homebrew/unpack_strategy/jar.rb,
brew/Library/Homebrew/unpack_strategy/lha.rb,
brew/Library/Homebrew/unpack_strategy/otf.rb,
brew/Library/Homebrew/unpack_strategy/pax.rb,
brew/Library/Homebrew/unpack_strategy/pkg.rb,
brew/Library/Homebrew/unpack_strategy/rar.rb,
brew/Library/Homebrew/unpack_strategy/sit.rb,
brew/Library/Homebrew/unpack_strategy/tar.rb,
brew/Library/Homebrew/unpack_strategy/ttf.rb,
brew/Library/Homebrew/unpack_strategy/xar.rb,
brew/Library/Homebrew/unpack_strategy/zip.rb,
brew/Library/Homebrew/unpack_strategy/gzip.rb,
brew/Library/Homebrew/unpack_strategy/lzip.rb,
brew/Library/Homebrew/unpack_strategy/lzma.rb,
brew/Library/Homebrew/unpack_strategy/bzip2.rb,
brew/Library/Homebrew/unpack_strategy/p7zip.rb,
brew/Library/Homebrew/unpack_strategy/bazaar.rb,
brew/Library/Homebrew/unpack_strategy/fossil.rb,
brew/Library/Homebrew/unpack_strategy/compress.rb,
brew/Library/Homebrew/unpack_strategy/lua_rock.rb,
brew/Library/Homebrew/unpack_strategy/directory.rb,
brew/Library/Homebrew/unpack_strategy/mercurial.rb,
brew/Library/Homebrew/unpack_strategy/executable.rb,
brew/Library/Homebrew/unpack_strategy/subversion.rb,
brew/Library/Homebrew/unpack_strategy/generic_unar.rb,
brew/Library/Homebrew/unpack_strategy/uncompressed.rb,
brew/Library/Homebrew/extend/os/mac/unpack_strategy/zip.rb,
brew/Library/Homebrew/unpack_strategy/microsoft_office_xml.rb,
brew/Library/Homebrew/unpack_strategy/self_extracting_executable.rb

Defined Under Namespace

Classes: Air, Bazaar, Bzip2, Cab, Compress, Cvs, Directory, Dmg, Executable, Fossil, GenericUnar, Git, Gzip, Jar, Lha, LuaRock, Lzip, Lzma, Mercurial, MicrosoftOfficeXml, Otf, P7Zip, Pax, Pkg, Rar, SelfExtractingExecutable, Sit, Subversion, Tar, Ttf, Uncompressed, Xar, Xz, Zip

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#merge_xattrsObject (readonly)

Returns the value of attribute merge_xattrs



110
111
112
# File 'brew/Library/Homebrew/unpack_strategy.rb', line 110

def merge_xattrs
  @merge_xattrs
end

#pathObject (readonly)

Returns the value of attribute path



110
111
112
# File 'brew/Library/Homebrew/unpack_strategy.rb', line 110

def path
  @path
end

Class Method Details

.detect(path, prioritise_extension: false, type: nil, ref_type: nil, ref: nil, merge_xattrs: nil) ⇒ Object



93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
# File 'brew/Library/Homebrew/unpack_strategy.rb', line 93

def self.detect(path, prioritise_extension: false, type: nil, ref_type: nil, ref: nil, merge_xattrs: nil)
  strategy = from_type(type) if type

  if prioritise_extension && path.extname.present?
    strategy ||= from_extension(path.extname)
    strategy ||= strategies.select { |s| s < Directory || s == Fossil }
                           .find { |s| s.can_extract?(path) }
  else
    strategy ||= from_magic(path)
    strategy ||= from_extension(path.extname)
  end

  strategy ||= Uncompressed

  strategy.new(path, ref_type: ref_type, ref: ref, merge_xattrs: merge_xattrs)
end

.from_extension(extension) ⇒ Object



83
84
85
86
87
# File 'brew/Library/Homebrew/unpack_strategy.rb', line 83

def self.from_extension(extension)
  strategies.sort_by { |s| s.extensions.map(&:length).max || 0 }
            .reverse
            .find { |s| s.extensions.any? { |ext| extension.end_with?(ext) } }
end

.from_magic(path) ⇒ Object



89
90
91
# File 'brew/Library/Homebrew/unpack_strategy.rb', line 89

def self.from_magic(path)
  strategies.find { |s| s.can_extract?(path) }
end

.from_type(type) ⇒ Object



69
70
71
72
73
74
75
76
77
78
79
80
81
# File 'brew/Library/Homebrew/unpack_strategy.rb', line 69

def self.from_type(type)
  type = {
    naked:     :uncompressed,
    nounzip:   :uncompressed,
    seven_zip: :p7zip,
  }.fetch(type, type)

  begin
    const_get(type.to_s.split("_").map(&:capitalize).join.gsub(/\d+[a-z]/, &:upcase))
  rescue NameError
    nil
  end
end

Instance Method Details

#dependenciesObject



149
150
151
# File 'brew/Library/Homebrew/unpack_strategy.rb', line 149

def dependencies
  []
end

#extract(to: nil, basename: nil, verbose: false) ⇒ Object



119
120
121
122
123
124
# File 'brew/Library/Homebrew/unpack_strategy.rb', line 119

def extract(to: nil, basename: nil, verbose: false)
  basename ||= path.basename
  unpack_dir = Pathname(to || Dir.pwd).expand_path
  unpack_dir.mkpath
  extract_to_dir(unpack_dir, basename: basename, verbose: verbose)
end

#extract_nestedly(to: nil, basename: nil, verbose: false, prioritise_extension: false) ⇒ Object



126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
# File 'brew/Library/Homebrew/unpack_strategy.rb', line 126

def extract_nestedly(to: nil, basename: nil, verbose: false, prioritise_extension: false)
  Dir.mktmpdir do |tmp_unpack_dir|
    tmp_unpack_dir = Pathname(tmp_unpack_dir)

    extract(to: tmp_unpack_dir, basename: basename, verbose: verbose)

    children = tmp_unpack_dir.children

    if children.count == 1 && !children.first.directory?
      FileUtils.chmod "+rw", children.first, verbose: verbose

      s = UnpackStrategy.detect(children.first, prioritise_extension: prioritise_extension)

      s.extract_nestedly(to: to, verbose: verbose, prioritise_extension: prioritise_extension)
      next
    end

    Directory.new(tmp_unpack_dir).extract(to: to, verbose: verbose)

    FileUtils.chmod_R "+w", tmp_unpack_dir, force: true, verbose: verbose
  end
end

#initialize(path, ref_type: nil, ref: nil, merge_xattrs: nil) ⇒ Object



112
113
114
115
116
117
# File 'brew/Library/Homebrew/unpack_strategy.rb', line 112

def initialize(path, ref_type: nil, ref: nil, merge_xattrs: nil)
  @path = Pathname(path).expand_path
  @ref_type = ref_type
  @ref = ref
  @merge_xattrs = merge_xattrs
end