diff options
Diffstat (limited to 'Library/Homebrew/cask/lib/hbc/utils.rb')
| -rw-r--r-- | Library/Homebrew/cask/lib/hbc/utils.rb | 256 |
1 files changed, 128 insertions, 128 deletions
diff --git a/Library/Homebrew/cask/lib/hbc/utils.rb b/Library/Homebrew/cask/lib/hbc/utils.rb index 1b80f6ae2..9159544a6 100644 --- a/Library/Homebrew/cask/lib/hbc/utils.rb +++ b/Library/Homebrew/cask/lib/hbc/utils.rb @@ -1,5 +1,3 @@ -module Hbc::Utils; end - require "yaml" require "open3" require "stringio" @@ -43,155 +41,157 @@ def odebug(title, *sput) puts sput unless sput.empty? end -module Hbc::Utils - def self.which(cmd, path = ENV["PATH"]) - unless File.basename(cmd) == cmd.to_s - # cmd contains a directory element +module Hbc + module Utils + def self.which(cmd, path = ENV["PATH"]) + unless File.basename(cmd) == cmd.to_s + # cmd contains a directory element + cmd_pn = Pathname(cmd) + return nil unless cmd_pn.absolute? + return resolve_executable(cmd_pn) + end + path.split(File::PATH_SEPARATOR).each do |elt| + fq_cmd = Pathname(elt).expand_path.join(cmd) + resolved = resolve_executable fq_cmd + return resolved if resolved + end + nil + end + + def self.resolve_executable(cmd) cmd_pn = Pathname(cmd) - return nil unless cmd_pn.absolute? - return resolve_executable(cmd_pn) + return nil unless cmd_pn.exist? + return nil unless cmd_pn.executable? + begin + cmd_pn = Pathname(cmd_pn.realpath) + rescue RuntimeError + return nil + end + return nil unless cmd_pn.file? + cmd_pn end - path.split(File::PATH_SEPARATOR).each do |elt| - fq_cmd = Pathname(elt).expand_path.join(cmd) - resolved = resolve_executable fq_cmd - return resolved if resolved + + def self.gain_permissions_remove(path, command: SystemCommand) + if path.respond_to?(:rmtree) && path.exist? + gain_permissions(path, ["-R"], command, &:rmtree) + elsif File.symlink?(path) + gain_permissions(path, ["-h"], command, &FileUtils.method(:rm_f)) + end end - nil - end - def self.resolve_executable(cmd) - cmd_pn = Pathname(cmd) - return nil unless cmd_pn.exist? - return nil unless cmd_pn.executable? - begin - cmd_pn = Pathname(cmd_pn.realpath) - rescue RuntimeError - return nil + def self.gain_permissions(path, command_args, command) + tried_permissions = false + tried_ownership = false + begin + yield path + rescue StandardError + # in case of permissions problems + unless tried_permissions + # TODO: Better handling for the case where path is a symlink. + # The -h and -R flags cannot be combined, and behavior is + # dependent on whether the file argument has a trailing + # slash. This should do the right thing, but is fragile. + command.run("/usr/bin/chflags", + must_succeed: false, + args: command_args + ["--", "000", path]) + command.run("/bin/chmod", + must_succeed: false, + args: command_args + ["--", "u+rwx", path]) + command.run("/bin/chmod", + must_succeed: false, + args: command_args + ["-N", path]) + tried_permissions = true + retry # rmtree + end + unless tried_ownership + # in case of ownership problems + # TODO: Further examine files to see if ownership is the problem + # before using sudo+chown + ohai "Using sudo to gain ownership of path '#{path}'" + command.run("/usr/sbin/chown", + args: command_args + ["--", current_user, path], + sudo: true) + tried_ownership = true + # retry chflags/chmod after chown + tried_permissions = false + retry # rmtree + end + end end - return nil unless cmd_pn.file? - cmd_pn - end - def self.gain_permissions_remove(path, command: Hbc::SystemCommand) - if path.respond_to?(:rmtree) && path.exist? - gain_permissions(path, ["-R"], command, &:rmtree) - elsif File.symlink?(path) - gain_permissions(path, ["-h"], command, &FileUtils.method(:rm_f)) + def self.current_user + Etc.getpwuid(Process.euid).name end - end - def self.gain_permissions(path, command_args, command) - tried_permissions = false - tried_ownership = false - begin - yield path - rescue StandardError - # in case of permissions problems - unless tried_permissions - # TODO: Better handling for the case where path is a symlink. - # The -h and -R flags cannot be combined, and behavior is - # dependent on whether the file argument has a trailing - # slash. This should do the right thing, but is fragile. - command.run("/usr/bin/chflags", - must_succeed: false, - args: command_args + ["--", "000", path]) - command.run("/bin/chmod", - must_succeed: false, - args: command_args + ["--", "u+rwx", path]) - command.run("/bin/chmod", - must_succeed: false, - args: command_args + ["-N", path]) - tried_permissions = true - retry # rmtree + # paths that "look" descendant (textually) will still + # return false unless both the given paths exist + def self.file_is_descendant(file, dir) + file = Pathname.new(file) + dir = Pathname.new(dir) + return false unless file.exist? && dir.exist? + unless dir.directory? + onoe "Argument must be a directory: '#{dir}'" + return false end - unless tried_ownership - # in case of ownership problems - # TODO: Further examine files to see if ownership is the problem - # before using sudo+chown - ohai "Using sudo to gain ownership of path '#{path}'" - command.run("/usr/sbin/chown", - args: command_args + ["--", current_user, path], - sudo: true) - tried_ownership = true - # retry chflags/chmod after chown - tried_permissions = false - retry # rmtree + unless file.absolute? && dir.absolute? + onoe "Both arguments must be absolute: '#{file}', '#{dir}'" + return false end + while file.parent != file + return true if File.identical?(file, dir) + file = file.parent + end + false end - end - - def self.current_user - Etc.getpwuid(Process.euid).name - end - # paths that "look" descendant (textually) will still - # return false unless both the given paths exist - def self.file_is_descendant(file, dir) - file = Pathname.new(file) - dir = Pathname.new(dir) - return false unless file.exist? && dir.exist? - unless dir.directory? - onoe "Argument must be a directory: '#{dir}'" - return false - end - unless file.absolute? && dir.absolute? - onoe "Both arguments must be absolute: '#{file}', '#{dir}'" - return false + def self.path_occupied?(path) + File.exist?(path) || File.symlink?(path) end - while file.parent != file - return true if File.identical?(file, dir) - file = file.parent - end - false - end - def self.path_occupied?(path) - File.exist?(path) || File.symlink?(path) - end - - def self.error_message_with_suggestions - <<-EOS.undent - Most likely, this means you have an outdated version of Homebrew-Cask. Please run: + def self.error_message_with_suggestions + <<-EOS.undent + Most likely, this means you have an outdated version of Homebrew-Cask. Please run: - #{Tty.green}#{UPDATE_CMD} + #{Tty.green}#{UPDATE_CMD} - #{Tty.reset}If this doesn’t fix the problem, please report this bug: + #{Tty.reset}If this doesn’t fix the problem, please report this bug: - #{Tty.em}#{ISSUES_URL}#{Tty.reset} + #{Tty.em}#{ISSUES_URL}#{Tty.reset} - EOS - end + EOS + end - def self.method_missing_message(method, token, section = nil) - poo = [] - poo << "Unexpected method '#{method}' called" - poo << "during #{section}" if section - poo << "on Cask #{token}." + def self.method_missing_message(method, token, section = nil) + poo = [] + poo << "Unexpected method '#{method}' called" + poo << "during #{section}" if section + poo << "on Cask #{token}." - opoo(poo.join(" ") + "\n" + error_message_with_suggestions) - end + opoo(poo.join(" ") + "\n" + error_message_with_suggestions) + end - def self.nowstamp_metadata_path(container_path) - @timenow ||= Time.now.gmtime - if container_path.respond_to?(:join) - precision = 3 - timestamp = @timenow.strftime("%Y%m%d%H%M%S") - fraction = format("%.#{precision}f", @timenow.to_f - @timenow.to_i)[1..-1] - timestamp.concat(fraction) - container_path.join(timestamp) + def self.nowstamp_metadata_path(container_path) + @timenow ||= Time.now.gmtime + if container_path.respond_to?(:join) + precision = 3 + timestamp = @timenow.strftime("%Y%m%d%H%M%S") + fraction = format("%.#{precision}f", @timenow.to_f - @timenow.to_i)[1..-1] + timestamp.concat(fraction) + container_path.join(timestamp) + end end - end - def self.size_in_bytes(files) - Array(files).reduce(0) { |a, e| a + (File.size?(e) || 0) } - end + def self.size_in_bytes(files) + Array(files).reduce(0) { |a, e| a + (File.size?(e) || 0) } + end - def self.capture_stderr - previous_stderr = $stderr - $stderr = StringIO.new - yield - $stderr.string - ensure - $stderr = previous_stderr + def self.capture_stderr + previous_stderr = $stderr + $stderr = StringIO.new + yield + $stderr.string + ensure + $stderr = previous_stderr + end end end |
