Class: Pathname Private

Inherits:
Object show all
Includes:
DiskUsageExtension, EagerInitializeExtension, SystemCommand::Mixin, Utils::Output::Mixin
Defined in:
extend/pathname.rb,
extend/blank/pathname.rb

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

Direct Known Subclasses

UnpackStrategy::Path

Constant Summary

Constants included from EagerInitializeExtension

EagerInitializeExtension::NilableInteger

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Utils::Output::Mixin

#issue_reporting_message, #odebug, #odeprecated, #odie, #odisabled, #ofail, #oh1, #oh1_title, #ohai, #ohai_title, #onoe, #opoo, #opoo_outside_github_actions, #opoo_without_github_actions_annotation, #pretty_cannot_install, #pretty_deprecated, #pretty_disabled, #pretty_duration, #pretty_install_status, #pretty_installed, #pretty_uninstalled, #pretty_unmarked, #pretty_upgradable, #pretty_warning

Methods included from DiskUsageExtension

#abv, #disk_usage, #file_count

Methods included from SystemCommand::Mixin

#system_command, #system_command!

Methods included from EagerInitializeExtension

#initialize

Class Method Details

.activate_extensions!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.



37
38
39
# File 'extend/pathname.rb', line 37

def self.activate_extensions!
  Pathname.prepend(WriteMkpathExtension)
end

Instance Method Details

#append_lines(content, **open_args) ⇒ void

This method returns an undefined value.

Only appends to a file that is already created.

Parameters:

  • content (String)
  • open_args (T.untyped)


101
102
103
104
105
# File 'extend/pathname.rb', line 101

def append_lines(content, **open_args)
  raise "Cannot append file that doesn't exist: #{self}" unless exist?

  File.open(self, "a", **open_args) { |f| f.puts(content) }
end

#arch_compatible?(_wanted_arch) ⇒ Boolean

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:

  • (Boolean)


404
405
406
# File 'extend/pathname.rb', line 404

def arch_compatible?(_wanted_arch)
  true
end

#atomic_write(content) ⇒ void

Note:

This always overwrites.

This method returns an undefined value.

Write to a file atomically.

Parameters:



113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
# File 'extend/pathname.rb', line 113

def atomic_write(content)
  require "extend/file/atomic"

  old_stat = stat if exist?
  File.atomic_write(self) do |file|
    file.write(content)
  end

  return unless old_stat

  # Try to restore original file's permissions separately
  # atomic_write does it itself, but it actually erases
  # them if chown fails
  begin
    # Set correct permissions on new file
    chown(old_stat.uid, nil)
    chown(nil, old_stat.gid)
  rescue Errno::EPERM, Errno::EACCES
    # Changing file ownership failed, moving on.
    nil
  end

  begin
    # This operation will affect filesystem ACL's
    chmod(old_stat.mode)
  rescue Errno::EPERM, Errno::EACCES
    # Changing file permissions failed, moving on.
    nil
  end
end

#binary_executable?Boolean

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)


389
390
391
# File 'extend/pathname.rb', line 389

def binary_executable?
  false
end

#blank?Boolean

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.

A Pathname is blank if its path is empty. Unlike Pathname#empty?, this never touches the filesystem, so an existing-but-empty file or directory is still present.

Pathname.new("").blank?     # => true
Pathname.new(" ").blank?    # => false
Pathname.new("test").blank? # => false

Returns:

  • (Boolean)

See Also:



18
19
20
# File 'extend/blank/pathname.rb', line 18

def blank?
  to_s.empty?
end

#cd(&_block) ⇒ T.type_parameter(:U)

Change to this directory, optionally executing the given block.

Parameters:

  • _block (T.proc.params(path: Pathname).returns(T.type_parameter(:U)))

Returns:

  • (T.type_parameter(:U))


225
226
227
# File 'extend/pathname.rb', line 225

def cd(&_block)
  Dir.chdir(self) { yield self }
end

#cp_path_sub(pattern, replacement, &block) ⇒ 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:



148
149
150
151
# File 'extend/pathname.rb', line 148

def cp_path_sub(pattern, replacement, &block)
  Utils::Output.odeprecated "Pathname#cp_path_sub", "Utils::Path.cp_path_sub"
  Utils::Path.cp_path_sub(self, pattern, replacement, &block)
end

#dylib?Boolean

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)


399
400
401
# File 'extend/pathname.rb', line 399

def dylib?
  false
end

#ensure_writable(&block) ⇒ 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:

  • block (T.proc.void)


256
257
258
259
# File 'extend/pathname.rb', line 256

def ensure_writable(&block)
  Utils::Output.odeprecated "Pathname#ensure_writable", "Utils::Path.ensure_writable"
  Utils::Path.ensure_writable(self, &block)
end

#env_script_all_files(dst, env) ⇒ void

This method returns an undefined value.

Writes a wrapper env script and moves all files to the dst.

Parameters:



335
336
337
338
339
340
341
342
343
344
345
346
# File 'extend/pathname.rb', line 335

def env_script_all_files(dst, env)
  dst.mkpath
  Pathname.glob("#{self}/*") do |file|
    next if file.directory?

    new_file = dst.join(file.basename)
    raise Errno::EEXIST, new_file.to_s if new_file.exist?

    dst.install(file)
    file.write_env_script(new_file, env)
  end
end

#extnameString

Extended to support common double extensions.

Returns:



157
158
159
160
161
162
163
164
165
166
167
168
169
170
# File 'extend/pathname.rb', line 157

def extname
  basename = File.basename(self)

  bottle_ext, = HOMEBREW_BOTTLES_EXTNAME_REGEX.match(basename).to_a
  return bottle_ext if bottle_ext

  archive_ext = basename[/(\.(?:tar|cpio|pax)\.(?:gz|bz2|lz|xz|zst|Z))\Z/, 1]
  return archive_ext if archive_ext

  # Don't treat version numbers as extname.
  return "" if basename.match?(/\b\d+\.\d+[^.]*\Z/) && !basename.end_with?(".7z")

  File.extname(basename)
end

#install(*sources) ⇒ void

This method returns an undefined value.

Moves a file from the original location to the Pathname's.



50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
# File 'extend/pathname.rb', line 50

def install(*sources)
  sources.each do |src|
    case src
    when Resource
      src.stage(self)
    when Resource::Partial
      src.resource.stage { install(*src.files) }
    when Array
      if src.empty?
        opoo "Tried to install empty array to #{self}"
        break
      end
      src.each { |s| install_p(s, File.basename(s)) }
    when Hash
      if src.empty?
        opoo "Tried to install empty hash to #{self}"
        break
      end
      src.each { |s, new_basename| install_p(s, new_basename) }
    else
      install_p(src, File.basename(src))
    end
  end
end

#install_infovoid

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.



262
263
264
265
# File 'extend/pathname.rb', line 262

def install_info
  Utils::Output.odeprecated "Pathname#install_info", "Utils::Path.install_info"
  Utils::Path.install_info(self)
end

#install_metafiles(from = Pathname.pwd) ⇒ 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:



369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
# File 'extend/pathname.rb', line 369

def install_metafiles(from = Pathname.pwd)
  require "metafiles"

  Pathname(from).children.each do |p|
    next if p.directory?
    next if File.empty?(p)
    next unless Metafiles.copy?(p.basename.to_s)

    # Some software symlinks these files (see help2man.rb)
    filename = Utils::Path.resolved_path(p)
    # Some software links metafiles together, so by the time we iterate to one of them
    # we may have already moved it. libxml2's COPYING and Copyright are affected by this.
    next unless filename.exist?

    filename.chmod 0644
    install(filename)
  end
end

This method returns an undefined value.

Creates symlinks to sources in this folder.

Parameters:



84
85
86
87
88
89
90
91
92
93
94
95
# File 'extend/pathname.rb', line 84

def install_symlink(*sources)
  sources.each do |src|
    case src
    when Array
      src.each { |s| install_symlink_p(s, File.basename(s)) }
    when Hash
      src.each { |s, new_basename| install_symlink_p(s, new_basename) }
    else
      install_symlink_p(src, File.basename(src))
    end
  end
end

#mach_o_bundle?Boolean

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)


394
395
396
# File 'extend/pathname.rb', line 394

def mach_o_bundle?
  false
end

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:



250
251
252
253
# File 'extend/pathname.rb', line 250

def make_relative_symlink(src)
  dirname.mkpath
  File.symlink(src.relative_path_from(dirname), self)
end

#present?Boolean

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)


23
# File 'extend/blank/pathname.rb', line 23

def present? = !blank? # :nodoc:

#resolved_pathPathname

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:



238
239
240
241
# File 'extend/pathname.rb', line 238

def resolved_path
  Utils::Output.odeprecated "Pathname#resolved_path", "Utils::Path.resolved_path"
  Utils::Path.resolved_path(self)
end

#resolved_path_exists?Boolean

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)


244
245
246
247
# File 'extend/pathname.rb', line 244

def resolved_path_exists?
  Utils::Output.odeprecated "Pathname#resolved_path_exists?", "Utils::Path.resolved_path_exists?"
  Utils::Path.resolved_path_exists?(self)
end

#rmdir_if_possibleBoolean

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)


181
182
183
184
# File 'extend/pathname.rb', line 181

def rmdir_if_possible
  Utils::Output.odeprecated "Pathname#rmdir_if_possible", "Utils::Path.rmdir_if_possible"
  Utils::Path.rmdir_if_possible(self)
end

#rpathsArray<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:



409
410
411
# File 'extend/pathname.rb', line 409

def rpaths
  []
end

#sha256String

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:



199
200
201
202
203
204
205
# File 'extend/pathname.rb', line 199

def sha256
  require "digest/sha2"
  # In integration tests only, raise when an unchanged file is rehashed
  # without the digest cache being involved.
  ::Downloadable::VerificationCache.check_repeated_hashing(self) if defined?(::Downloadable::VerificationCache)
  Digest::SHA256.file(self).hexdigest
end

#stemString

For filetypes we support, returns basename without extension.

Returns:



176
177
178
# File 'extend/pathname.rb', line 176

def stem
  File.basename(self, extname)
end

#subdirsArray<Pathname>

Get all sub-directories of this directory.

Returns:



233
234
235
# File 'extend/pathname.rb', line 233

def subdirs
  children.select(&:directory?)
end

#text_executable?Boolean

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)


193
194
195
196
# File 'extend/pathname.rb', line 193

def text_executable?
  Utils::Output.odeprecated "Pathname#text_executable?", "Utils::Path.text_executable?"
  Utils::Path.text_executable?(self)
end

#uninstall_infovoid

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.



268
269
270
271
# File 'extend/pathname.rb', line 268

def uninstall_info
  Utils::Output.odeprecated "Pathname#uninstall_info", "Utils::Path.uninstall_info"
  Utils::Path.uninstall_info(self)
end

#verify_checksum(expected) ⇒ 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:

Raises:



208
209
210
211
212
213
# File 'extend/pathname.rb', line 208

def verify_checksum(expected)
  raise ChecksumMissingError if expected.blank?

  actual = Checksum.new(sha256.downcase)
  raise ChecksumMismatchError.new(self, expected, actual) if expected != actual
end

#versionVersion

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:



187
188
189
190
# File 'extend/pathname.rb', line 187

def version
  require "version"
  Version.parse(basename)
end

#write_env_script(target, args_or_env, env = nil) ⇒ void

This method returns an undefined value.

Writes an exec script that sets environment variables.

Parameters:



307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
# File 'extend/pathname.rb', line 307

def write_env_script(target, args_or_env, env = nil)
  args = if env.nil?
    raise ArgumentError, "#{args_or_env.inspect} is not a Hash" unless args_or_env.is_a?(Hash)

    env = args_or_env
    nil
  elsif args_or_env.is_a?(Array)
    args_or_env.join(" ")
  else
    args_or_env
  end

  env_export = +""
  env.each { |key, value| env_export << "#{key}=\"#{value}\" " }

  dirname.mkpath

  write <<~SH
    #!/bin/bash
    #{env_export}exec "#{target}" #{args} "$@"
  SH
  chmod 0555
end

#write_exec_script(*targets) ⇒ void

This method returns an undefined value.

Writes an exec script in this folder for each target pathname.

Parameters:



277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
# File 'extend/pathname.rb', line 277

def write_exec_script(*targets)
  targets.flatten!
  if targets.empty?
    opoo "Tried to write exec scripts to #{self} for an empty list of targets"
    return
  end
  mkpath
  targets.each do |target|
    target = Pathname.new(target) # allow pathnames or strings
    join(target.basename).write <<~SH
      #!/bin/bash
      exec "#{target}" "$@"
    SH
  end
end

#write_jar_script(target_jar, script_name, java_opts = "", java_version: nil) ⇒ Integer

Writes an exec script that invokes a Java jar.

Parameters:

Returns:



359
360
361
362
363
364
365
366
# File 'extend/pathname.rb', line 359

def write_jar_script(target_jar, script_name, java_opts = "", java_version: nil)
  mkpath
  (self/script_name).write <<~EOS
    #!/bin/bash
    export JAVA_HOME="#{Language::Java.overridable_java_home_env(java_version)[:JAVA_HOME]}"
    exec "${JAVA_HOME}/bin/java" #{java_opts} -jar "#{target_jar}" "$@"
  EOS
end