Class: Pathname
- Includes:
- DiskUsageExtension, ELFShim, MachOShim
- Defined in:
- extend/pathname.rb,
extend/os/mac/extend/pathname.rb,
extend/os/linux/extend/pathname.rb
Overview
Homebrew extends Ruby’s Pathname
to make our code more readable.
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 MachOShim
#arch, #archs, #change_dylib_id, #change_install_name, #change_rpath, #delete_rpath, #dynamically_linked_libraries, #i386?, #mach_o_executable?, #ppc64?, #ppc7400?, #universal?, #x86_64?
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.
166 167 168 169 170 |
# File 'extend/pathname.rb', line 166 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.
174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 |
# File 'extend/pathname.rb', line 174 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
447 448 449 |
# File 'extend/pathname.rb', line 447 def binary_executable? false end |
#cd(&_block) ⇒ T.type_parameter(:U)
298 299 300 |
# File 'extend/pathname.rb', line 298 def cd(&_block) Dir.chdir(self) { yield self } end |
#ds_store? ⇒ Boolean
442 443 444 |
# File 'extend/pathname.rb', line 442 def ds_store? basename.to_s == ".DS_Store" end |
#dylib? ⇒ Boolean
457 458 459 |
# File 'extend/pathname.rb', line 457 def dylib? false end |
#env_script_all_files(dst, env) ⇒ Object
Writes a wrapper env script and moves all files to the dst.
395 396 397 398 399 400 401 402 403 404 |
# File 'extend/pathname.rb', line 395 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.
224 225 226 227 228 229 230 231 232 233 234 235 236 237 |
# File 'extend/pathname.rb', line 224 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
479 480 481 482 |
# File 'extend/pathname.rb', line 479 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.
88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 |
# File 'extend/pathname.rb', line 88 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
424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 |
# File 'extend/pathname.rb', line 424 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.
142 143 144 145 146 147 148 149 150 151 152 153 |
# File 'extend/pathname.rb', line 142 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
452 453 454 |
# File 'extend/pathname.rb', line 452 def mach_o_bundle? false end |
#magic_number ⇒ String
467 468 469 470 471 472 473 474 475 476 |
# File 'extend/pathname.rb', line 467 def magic_number @magic_number ||= if directory? "" else # Length of the longest regex (currently Tar). max_magic_number_length = 262 # FIXME: The `T.let` is a workaround until we have https://github.com/sorbet/sorbet/pull/6865 T.let(binread(max_magic_number_length), T.nilable(String)) || "" end end |
#sha256 ⇒ String
278 279 280 281 |
# File 'extend/pathname.rb', line 278 def sha256 require "digest/sha2" Digest::SHA256.file(self).hexdigest end |
#stem ⇒ String
For filetypes we support, returns basename without extension.
241 242 243 |
# File 'extend/pathname.rb', line 241 def stem File.basename(self, extname) end |
#subdirs ⇒ Array<Pathname>
303 304 305 |
# File 'extend/pathname.rb', line 303 def subdirs children.select(&:directory?) end |
#verify_checksum(expected) ⇒ void
This method returns an undefined value.
284 285 286 287 288 289 |
# File 'extend/pathname.rb', line 284 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.
380 381 382 383 384 385 386 387 388 389 390 391 392 |
# File 'extend/pathname.rb', line 380 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.
363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 |
# File 'extend/pathname.rb', line 363 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.
415 416 417 418 419 420 421 422 |
# File 'extend/pathname.rb', line 415 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 |
#zipinfo ⇒ Array<String>
485 486 487 488 489 490 |
# File 'extend/pathname.rb', line 485 def zipinfo @zipinfo ||= system_command("zipinfo", args: ["-1", self], print_stderr: false) .stdout .encode(Encoding::UTF_8, invalid: :replace) .split("\n") end |