Module: UnpackStrategy Private

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

This module is part of a private API. This module may only be used in the Homebrew/brew repository. Third parties should avoid using this module if possible, as it may be removed or changed without warning.

Defined Under Namespace

Modules: ClassMethods 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, Zstd

Constant Summary collapse

UnpackStrategyType =

This constant is part of a private API. This constant may only be used in the Homebrew/brew repository. Third parties should avoid using this constant if possible, as it may be removed or changed without warning.

T.type_alias { T.all(T::Class[UnpackStrategy], UnpackStrategy::ClassMethods) }

Constants included from Kernel

Kernel::IGNORE_INTERRUPTS_MUTEX

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Kernel

#disk_usage_readable, #ensure_executable!, #ensure_formula_installed!, #exec_browser, #exec_editor, #ignore_interrupts, #interactive_shell, #number_readable, #odebug, #odeprecated, #odie, #odisabled, #ofail, #oh1, #oh1_title, #ohai, #ohai_title, #onoe, #opoo, #paths, #pretty_duration, #pretty_installed, #pretty_outdated, #pretty_uninstalled, #quiet_system, #redact_secrets, #redirect_stdout, #require?, #safe_system, #tap_and_name_comparison, #truncate_text_to_approximate_size, #which, #which_all, #which_editor, #with_custom_locale, #with_env, #with_homebrew_path

Methods included from SystemCommand::Mixin

#system_command, #system_command!

Instance Attribute Details

#merge_xattrsBoolean (readonly)

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Returns:

  • (Boolean)


123
124
125
# File 'unpack_strategy.rb', line 123

def merge_xattrs
  @merge_xattrs
end

#pathPathname (readonly)

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Returns:



120
121
122
# File 'unpack_strategy.rb', line 120

def path
  @path
end

Class Method Details

.detect(path, prioritize_extension: false, type: nil, ref_type: nil, ref: nil, merge_xattrs: false) ⇒ T.untyped

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Parameters:

  • path (Pathname)
  • prioritize_extension (Boolean) (defaults to: false)
  • type (Symbol, nil) (defaults to: nil)
  • ref_type (Symbol, nil) (defaults to: nil)
  • ref (String, nil) (defaults to: nil)
  • merge_xattrs (Boolean) (defaults to: false)

Returns:

  • (T.untyped)


102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
# File 'unpack_strategy.rb', line 102

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

  if prioritize_extension && path.extname.present?
    strategy ||= from_extension(path.extname)

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

  strategy ||= Uncompressed

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

.from_extension(extension) ⇒ UnpackStrategyType?

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Parameters:

Returns:



85
86
87
88
89
90
91
# File 'unpack_strategy.rb', line 85

def self.from_extension(extension)
  return unless strategies

  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) ⇒ UnpackStrategyType?

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Parameters:

Returns:



94
95
96
# File 'unpack_strategy.rb', line 94

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

.from_type(type) ⇒ UnpackStrategyType?

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Parameters:

Returns:



70
71
72
73
74
75
76
77
78
79
80
81
82
# File 'unpack_strategy.rb', line 70

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

#dependenciesArray<String>

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Returns:



191
192
193
# File 'unpack_strategy.rb', line 191

def dependencies
  []
end

#each_directory(pathname, &_block) ⇒ Pathname?

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Helper method for iterating over directory trees.

Parameters:

Returns:



202
203
204
205
206
# File 'unpack_strategy.rb', line 202

def each_directory(pathname, &_block)
  pathname.find do |path|
    yield path if path.directory?
  end
end

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

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

This method returns an undefined value.

Parameters:

  • to (Pathname, nil) (defaults to: nil)
  • basename (String, Pathname, nil) (defaults to: nil)
  • verbose (Boolean) (defaults to: false)


145
146
147
148
149
150
# File 'unpack_strategy.rb', line 145

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: Pathname(basename), verbose:)
end

#extract_nestedly(to: nil, basename: nil, verbose: false, prioritize_extension: false) ⇒ T.untyped

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Parameters:

  • to (Pathname, nil) (defaults to: nil)
  • basename (String, Pathname, nil) (defaults to: nil)
  • verbose (Boolean) (defaults to: false)
  • prioritize_extension (Boolean) (defaults to: false)

Returns:

  • (T.untyped)


160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
# File 'unpack_strategy.rb', line 160

def extract_nestedly(to: nil, basename: nil, verbose: false, prioritize_extension: false)
  Dir.mktmpdir("homebrew-unpack", HOMEBREW_TEMP) do |tmp_unpack_dir|
    tmp_unpack_dir = Pathname(tmp_unpack_dir)

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

    children = tmp_unpack_dir.children

    if children.size == 1 && !children.fetch(0).directory?
      first_child = children.first
      next if first_child.nil?

      s = UnpackStrategy.detect(first_child, prioritize_extension:)

      s.extract_nestedly(to:, verbose:, prioritize_extension:)

      next
    end

    # Ensure all extracted directories are writable.
    each_directory(tmp_unpack_dir) do |path|
      next if path.writable?

      FileUtils.chmod "u+w", path, verbose:
    end

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

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

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Parameters:

  • path (String, Pathname)
  • ref_type (Symbol, nil) (defaults to: nil)
  • ref (String, nil) (defaults to: nil)
  • merge_xattrs (Boolean) (defaults to: false)


129
130
131
132
133
134
# File 'unpack_strategy.rb', line 129

def initialize(path, ref_type: nil, ref: nil, merge_xattrs: false)
  @path = T.let(Pathname(path).expand_path, Pathname)
  @ref_type = T.let(ref_type, T.nilable(Symbol))
  @ref = T.let(ref, T.nilable(String))
  @merge_xattrs = T.let(merge_xattrs, T::Boolean)
end