Class: Pathname
- 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
-
#append_lines(content, **open_args) ⇒ void
Only appends to a file that is already created.
-
#atomic_write(content) ⇒ void
-
#binary_executable? ⇒ Boolean
-
#cd(&_block) ⇒ T.type_parameter(:U)
-
#ds_store? ⇒ Boolean
-
#dylib? ⇒ Boolean
-
#env_script_all_files(dst, env) ⇒ Object
Writes a wrapper env script and moves all files to the dst.
-
#extname ⇒ String
Extended to support common double extensions.
-
#file_type ⇒ String
-
#install(*sources) ⇒ void
Moves a file from the original location to the Pathname’s.
-
#install_metafiles(from = Pathname.pwd) ⇒ Object
-
#install_symlink(*sources) ⇒ void
Creates symlinks to sources in this folder.
-
#mach_o_bundle? ⇒ Boolean
-
#magic_number ⇒ String
-
#rpaths ⇒ Array<String>
-
#sha256 ⇒ String
-
#stem ⇒ String
For filetypes we support, returns basename without extension.
-
#subdirs ⇒ Array<Pathname>
-
#verify_checksum(expected) ⇒ void
-
#write_env_script(target, args, env = nil) ⇒ Object
Writes an exec script that sets environment variables.
-
#write_exec_script(*targets) ⇒ Object
Writes an exec script in this folder for each target pathname.
-
#write_jar_script(target_jar, script_name, java_opts = "", java_version: nil) ⇒ Integer
Writes an exec script that invokes a Java jar.
-
#zipinfo ⇒ Array<String>
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.
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
This always overwrites.
This method returns an undefined value.
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
450 451 452 |
# File 'extend/pathname.rb', line 450 def binary_executable? false end |
#cd(&_block) ⇒ 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
445 446 447 |
# File 'extend/pathname.rb', line 445 def ds_store? basename.to_s == ".DS_Store" end |
#dylib? ⇒ 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 |
#extname ⇒ String
Extended to support common double extensions.
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_type ⇒ String
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 (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 |
#install_symlink(*sources) ⇒ void
This method returns an undefined value.
Creates symlinks to sources in this folder.
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
455 456 457 |
# File 'extend/pathname.rb', line 455 def mach_o_bundle? false end |
#magic_number ⇒ String
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 |
#sha256 ⇒ String
281 282 283 284 |
# File 'extend/pathname.rb', line 281 def sha256 require "digest/sha2" Digest::SHA256.file(self).hexdigest end |
#stem ⇒ String
For filetypes we support, returns basename without extension.
244 245 246 |
# File 'extend/pathname.rb', line 244 def stem File.basename(self, extname) end |
#subdirs ⇒ Array<Pathname>
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.
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.
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 |