Class: Pathname

Inherits:
Object show all
Includes:
DiskUsageExtension, ELFShim, MachOShim, SystemCommand::Mixin
Defined in:
extend/pathname.rb,
extend/os/mac/extend/pathname.rb,
extend/os/linux/extend/pathname.rb,
extend/os/mac/extend/pathname.rbi,
extend/os/linux/extend/pathname.rbi

Instance Method Summary collapse

Methods included from DiskUsageExtension

#abv, #disk_usage, #file_count

Methods included from SystemCommand::Mixin

#system_command, #system_command!

Methods included from MachOShim

#arch, #archs, #change_dylib_id, #change_install_name, #change_rpath, #delete_rpath, #dylib_id, #dynamically_linked_libraries, #i386?, #mach_o_executable?, #ppc64?, #ppc7400?, #resolve_rpath, #resolve_variable_name, #universal?, #x86_64?

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 ELFShim

#arch, #dylib_id, #dynamic_elf?, #dynamically_linked_libraries, #elf?, #elf_type, #interpreter, #patch!, #patchelf_patcher, #read_uint16, #read_uint8, #rpath, #rpath_using_patchelf_rb, #save_using_patchelf_rb

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)


169
170
171
172
173
# File 'extend/pathname.rb', line 169

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

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

#atomic_write(content) ⇒ void

Note:

This always overwrites.

This method returns an undefined value.

Parameters:



177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
# File 'extend/pathname.rb', line 177

def atomic_write(content)
  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

Returns:

  • (Boolean)


450
451
452
# File 'extend/pathname.rb', line 450

def binary_executable?
  false
end

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

Parameters:

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

Returns:

  • (T.type_parameter(:U))


301
302
303
# File 'extend/pathname.rb', line 301

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

#ds_store?Boolean

Returns:

  • (Boolean)


445
446
447
# File 'extend/pathname.rb', line 445

def ds_store?
  basename.to_s == ".DS_Store"
end

#dylib?Boolean

Returns:

  • (Boolean)


460
461
462
# File 'extend/pathname.rb', line 460

def dylib?
  false
end

#env_script_all_files(dst, env) ⇒ Object

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



398
399
400
401
402
403
404
405
406
407
# File 'extend/pathname.rb', line 398

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

    dst.install(file)
    new_file = dst.join(file.basename)
    file.write_env_script(new_file, env)
  end
end

#extnameString

Extended to support common double extensions.

Returns:



227
228
229
230
231
232
233
234
235
236
237
238
239
240
# File 'extend/pathname.rb', line 227

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

#file_typeString

Returns:



481
482
483
484
# File 'extend/pathname.rb', line 481

def file_type
  @file_type ||= system_command("file", args: ["-b", self], print_stderr: false)
                 .stdout.chomp
end

#install(*sources) ⇒ void

This method returns an undefined value.

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



91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
# File 'extend/pathname.rb', line 91

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_metafiles(from = Pathname.pwd) ⇒ Object



427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
# File 'extend/pathname.rb', line 427

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



145
146
147
148
149
150
151
152
153
154
155
156
# File 'extend/pathname.rb', line 145

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

Returns:

  • (Boolean)


455
456
457
# File 'extend/pathname.rb', line 455

def mach_o_bundle?
  false
end

#magic_numberString

Returns:



470
471
472
473
474
475
476
477
478
# File 'extend/pathname.rb', line 470

def magic_number
  @magic_number ||= if directory?
    ""
  else
    # Length of the longest regex (currently Tar).
    max_magic_number_length = 262
    binread(max_magic_number_length) || ""
  end
end

#rpathsArray<String>

Returns:



465
466
467
# File 'extend/pathname.rb', line 465

def rpaths
  []
end

#sha256String

Returns:



281
282
283
284
# File 'extend/pathname.rb', line 281

def sha256
  require "digest/sha2"
  Digest::SHA256.file(self).hexdigest
end

#stemString

For filetypes we support, returns basename without extension.

Returns:



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

def stem
  File.basename(self, extname)
end

#subdirsArray<Pathname>

Returns:



306
307
308
# File 'extend/pathname.rb', line 306

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

#verify_checksum(expected) ⇒ void

This method returns an undefined value.

Parameters:

Raises:



287
288
289
290
291
292
# File 'extend/pathname.rb', line 287

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

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

#write_env_script(target, args, env = nil) ⇒ Object

Writes an exec script that sets environment variables.



383
384
385
386
387
388
389
390
391
392
393
394
395
# File 'extend/pathname.rb', line 383

def write_env_script(target, args, env = nil)
  unless env
    env = args
    args = nil
  end
  env_export = +""
  env.each { |key, value| env_export << "#{key}=\"#{value}\" " }
  dirname.mkpath
  write <<~SH
    #!/bin/bash
    #{env_export}exec "#{target}" #{args} "$@"
  SH
end

#write_exec_script(*targets) ⇒ Object

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



366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
# File 'extend/pathname.rb', line 366

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:

  • (Integer)


418
419
420
421
422
423
424
425
# File 'extend/pathname.rb', line 418

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

#zipinfoArray<String>

Returns:



487
488
489
490
491
492
# File 'extend/pathname.rb', line 487

def zipinfo
  @zipinfo ||= system_command("zipinfo", args: ["-1", self], print_stderr: false)
               .stdout
               .encode(Encoding::UTF_8, invalid: :replace)
               .split("\n")
end