From a07ab8bb92da082078203301a22eef68eaf3d0ac Mon Sep 17 00:00:00 2001 From: Mike McQuaid Date: Fri, 15 Jul 2016 19:33:30 +0100 Subject: brew.{rb,sh}: move to Library/Homebrew. (#506) --- Library/Homebrew/brew.rb | 146 +++++++++++++++ Library/Homebrew/brew.sh | 249 +++++++++++++++++++++++++ Library/Homebrew/cmd/update.sh | 2 +- Library/Homebrew/test/.simplecov | 2 +- Library/Homebrew/test/test_integration_cmds.rb | 2 +- Library/brew.rb | 146 --------------- Library/brew.sh | 249 ------------------------- 7 files changed, 398 insertions(+), 398 deletions(-) create mode 100644 Library/Homebrew/brew.rb create mode 100644 Library/Homebrew/brew.sh delete mode 100644 Library/brew.rb delete mode 100644 Library/brew.sh (limited to 'Library') diff --git a/Library/Homebrew/brew.rb b/Library/Homebrew/brew.rb new file mode 100644 index 000000000..9d29f4396 --- /dev/null +++ b/Library/Homebrew/brew.rb @@ -0,0 +1,146 @@ +std_trap = trap("INT") { exit! 130 } # no backtrace thanks + +require "pathname" +HOMEBREW_LIBRARY_PATH = Pathname.new(__FILE__).realpath.parent +$:.unshift(HOMEBREW_LIBRARY_PATH.to_s) +require "global" + +if ARGV == %w[--version] || ARGV == %w[-v] + puts "Homebrew #{Homebrew.homebrew_version_string}" + puts "Homebrew/homebrew-core #{Homebrew.core_tap_version_string}" + exit 0 +end + +if OS.mac? && MacOS.version < "10.6" + abort <<-EOABORT.undent + Homebrew requires Snow Leopard or higher. For Tiger and Leopard support, see: + https://github.com/mistydemeo/tigerbrew + EOABORT +end + +def require?(path) + require path +rescue LoadError => e + # HACK: ( because we should raise on syntax errors but + # not if the file doesn't exist. TODO make robust! + raise unless e.to_s.include? path +end + +begin + trap("INT", std_trap) # restore default CTRL-C handler + + empty_argv = ARGV.empty? + help_flag_list = %w[-h --help --usage -?] + help_flag = false + internal_cmd = true + cmd = nil + + ARGV.dup.each_with_index do |arg, i| + if help_flag && cmd + break + elsif help_flag_list.include?(arg) + # Option-style help: Both `--help ` and ` --help` are fine. + help_flag = true + elsif arg == "help" && !cmd + # Command-style help: `help ` is fine, but ` help` is not. + help_flag = true + elsif !cmd + cmd = ARGV.delete_at(i) + end + end + + # Add contributed commands to PATH before checking. + Dir["#{HOMEBREW_LIBRARY}/Taps/*/*/cmd"].each do |tap_cmd_dir| + ENV["PATH"] += "#{File::PATH_SEPARATOR}#{tap_cmd_dir}" + end + + # Add SCM wrappers. + ENV["PATH"] += "#{File::PATH_SEPARATOR}#{HOMEBREW_SHIMS_PATH}/scm" + + if cmd + internal_cmd = require? HOMEBREW_LIBRARY_PATH.join("cmd", cmd) + + if !internal_cmd && ARGV.homebrew_developer? + internal_cmd = require? HOMEBREW_LIBRARY_PATH.join("dev-cmd", cmd) + end + end + + # Usage instructions should be displayed if and only if one of: + # - a help flag is passed AND an internal command is matched + # - a help flag is passed AND there is no command specified + # - no arguments are passed + # + # It should never affect external commands so they can handle usage + # arguments themselves. + if empty_argv || help_flag + require "cmd/help" + Homebrew.help cmd, :empty_argv => empty_argv + # `Homebrew.help` never returns, except for external/unknown commands. + end + + # Uninstall old brew-cask if it's still around; we just use the tap now. + if cmd == "cask" && (HOMEBREW_CELLAR/"brew-cask").exist? + system(HOMEBREW_BREW_FILE, "uninstall", "--force", "brew-cask") + end + + if internal_cmd + Homebrew.send cmd.to_s.tr("-", "_").downcase + elsif which "brew-#{cmd}" + %w[CACHE LIBRARY_PATH].each do |e| + ENV["HOMEBREW_#{e}"] = Object.const_get("HOMEBREW_#{e}").to_s + end + exec "brew-#{cmd}", *ARGV + elsif (path = which("brew-#{cmd}.rb")) && require?(path) + exit Homebrew.failed? ? 1 : 0 + else + require "tap" + possible_tap = OFFICIAL_CMD_TAPS.find { |_, cmds| cmds.include?(cmd) } + possible_tap = Tap.fetch(possible_tap.first) if possible_tap + + if possible_tap && !possible_tap.installed? + brew_uid = HOMEBREW_BREW_FILE.stat.uid + tap_commands = [] + if Process.uid.zero? && !brew_uid.zero? + tap_commands += %W[/usr/bin/sudo -u ##{brew_uid}] + end + tap_commands += %W[#{HOMEBREW_BREW_FILE} tap #{possible_tap}] + safe_system(*tap_commands) + exec HOMEBREW_BREW_FILE, cmd, *ARGV + else + onoe "Unknown command: #{cmd}" + exit 1 + end + end + +rescue UsageError => e + require "cmd/help" + Homebrew.help cmd, :usage_error => e.message +rescue SystemExit => e + onoe "Kernel.exit" if ARGV.verbose? && !e.success? + $stderr.puts e.backtrace if ARGV.debug? + raise +rescue Interrupt => e + $stderr.puts # seemingly a newline is typical + exit 130 +rescue BuildError => e + Utils::Analytics.report_exception(e) + e.dump + exit 1 +rescue RuntimeError, SystemCallError => e + Utils::Analytics.report_exception(e) + raise if e.message.empty? + onoe e + $stderr.puts e.backtrace if ARGV.debug? + exit 1 +rescue Exception => e + Utils::Analytics.report_exception(e) + onoe e + if internal_cmd && defined?(OS::ISSUES_URL) + $stderr.puts "#{Tty.white}Please report this bug:" + $stderr.puts " #{Tty.em}#{OS::ISSUES_URL}#{Tty.reset}" + end + $stderr.puts e.backtrace + exit 1 +else + exit 1 if Homebrew.failed? +end diff --git a/Library/Homebrew/brew.sh b/Library/Homebrew/brew.sh new file mode 100644 index 000000000..dd9e54e7e --- /dev/null +++ b/Library/Homebrew/brew.sh @@ -0,0 +1,249 @@ +HOMEBREW_VERSION="0.9.9" + +onoe() { + if [[ -t 2 ]] # check whether stderr is a tty. + then + echo -ne "\033[4;31mError\033[0m: " >&2 # highlight Error with underline and red color + else + echo -n "Error: " >&2 + fi + if [[ $# -eq 0 ]] + then + /bin/cat >&2 + else + echo "$*" >&2 + fi +} + +odie() { + onoe "$@" + exit 1 +} + +safe_cd() { + cd "$@" >/dev/null || odie "Error: failed to cd to $*!" +} + +brew() { + "$HOMEBREW_BREW_FILE" "$@" +} + +git() { + "$HOMEBREW_LIBRARY/Homebrew/shims/scm/git" "$@" +} + +# Force UTF-8 to avoid encoding issues for users with broken locale settings. +if [[ "$(locale charmap 2> /dev/null)" != "UTF-8" ]] +then + export LC_ALL="en_US.UTF-8" +fi + +# Where we store built products; /usr/local/Cellar if it exists, +# otherwise a Cellar relative to the Repository. +if [[ -d "$HOMEBREW_PREFIX/Cellar" ]] +then + HOMEBREW_CELLAR="$HOMEBREW_PREFIX/Cellar" +else + HOMEBREW_CELLAR="$HOMEBREW_REPOSITORY/Cellar" +fi + +case "$*" in + --prefix) echo "$HOMEBREW_PREFIX"; exit 0 ;; + --cellar) echo "$HOMEBREW_CELLAR"; exit 0 ;; + --repository|--repo) echo "$HOMEBREW_REPOSITORY"; exit 0 ;; +esac + +if [[ "$HOMEBREW_PREFIX" = "/" || "$HOMEBREW_PREFIX" = "/usr" ]] +then + # it may work, but I only see pain this route and don't want to support it + odie "Cowardly refusing to continue at this prefix: $HOMEBREW_PREFIX" +fi + +# Users may have these set, pointing the system Ruby +# at non-system gem paths +unset GEM_HOME +unset GEM_PATH + +HOMEBREW_SYSTEM="$(uname -s)" +case "$HOMEBREW_SYSTEM" in + Darwin) HOMEBREW_OSX="1";; + Linux) HOMEBREW_LINUX="1";; +esac + +HOMEBREW_CURL="/usr/bin/curl" +if [[ -n "$HOMEBREW_OSX" ]] +then + HOMEBREW_PROCESSOR="$(uname -p)" + HOMEBREW_PRODUCT="Homebrew" + HOMEBREW_SYSTEM="Macintosh" + # This is i386 even on x86_64 machines + [[ "$HOMEBREW_PROCESSOR" = "i386" ]] && HOMEBREW_PROCESSOR="Intel" + HOMEBREW_OSX_VERSION="$(/usr/bin/sw_vers -productVersion)" + HOMEBREW_OS_VERSION="Mac OS X $HOMEBREW_OSX_VERSION" + + printf -v HOMEBREW_OSX_VERSION_NUMERIC "%02d%02d%02d" ${HOMEBREW_OSX_VERSION//./ } + if [[ "$HOMEBREW_OSX_VERSION_NUMERIC" -lt "100900" && + -x "$HOMEBREW_PREFIX/opt/curl/bin/curl" ]] + then + HOMEBREW_CURL="$HOMEBREW_PREFIX/opt/curl/bin/curl" + fi +else + HOMEBREW_PROCESSOR="$(uname -m)" + HOMEBREW_PRODUCT="${HOMEBREW_SYSTEM}brew" + [[ -n "$HOMEBREW_LINUX" ]] && HOMEBREW_OS_VERSION="$(lsb_release -sd 2>/dev/null)" + : "${HOMEBREW_OS_VERSION:=$(uname -r)}" +fi +HOMEBREW_USER_AGENT="$HOMEBREW_PRODUCT/$HOMEBREW_VERSION ($HOMEBREW_SYSTEM; $HOMEBREW_PROCESSOR $HOMEBREW_OS_VERSION)" +HOMEBREW_CURL_VERSION="$("$HOMEBREW_CURL" --version 2>/dev/null | head -n1 | /usr/bin/awk '{print $1"/"$2}')" +HOMEBREW_USER_AGENT_CURL="$HOMEBREW_USER_AGENT $HOMEBREW_CURL_VERSION" + +if [[ -z "$HOMEBREW_CACHE" ]] +then + HOMEBREW_CACHE="$HOME/Library/Caches/Homebrew" +fi + +# Declared in bin/brew +export HOMEBREW_BREW_FILE +export HOMEBREW_PREFIX +export HOMEBREW_REPOSITORY +export HOMEBREW_LIBRARY + +# Declared in brew.sh +export HOMEBREW_VERSION +export HOMEBREW_CACHE +export HOMEBREW_CELLAR +export HOMEBREW_SYSTEM +export HOMEBREW_CURL +export HOMEBREW_PROCESSOR +export HOMEBREW_PRODUCT +export HOMEBREW_OS_VERSION +export HOMEBREW_OSX_VERSION +export HOMEBREW_USER_AGENT +export HOMEBREW_USER_AGENT_CURL + +if [[ -n "$HOMEBREW_OSX" ]] +then + XCODE_SELECT_PATH=$('/usr/bin/xcode-select' --print-path 2>/dev/null) + if [[ "$XCODE_SELECT_PATH" = "/" ]] + then + odie < e - # HACK: ( because we should raise on syntax errors but - # not if the file doesn't exist. TODO make robust! - raise unless e.to_s.include? path -end - -begin - trap("INT", std_trap) # restore default CTRL-C handler - - empty_argv = ARGV.empty? - help_flag_list = %w[-h --help --usage -?] - help_flag = false - internal_cmd = true - cmd = nil - - ARGV.dup.each_with_index do |arg, i| - if help_flag && cmd - break - elsif help_flag_list.include?(arg) - # Option-style help: Both `--help ` and ` --help` are fine. - help_flag = true - elsif arg == "help" && !cmd - # Command-style help: `help ` is fine, but ` help` is not. - help_flag = true - elsif !cmd - cmd = ARGV.delete_at(i) - end - end - - # Add contributed commands to PATH before checking. - Dir["#{HOMEBREW_LIBRARY}/Taps/*/*/cmd"].each do |tap_cmd_dir| - ENV["PATH"] += "#{File::PATH_SEPARATOR}#{tap_cmd_dir}" - end - - # Add SCM wrappers. - ENV["PATH"] += "#{File::PATH_SEPARATOR}#{HOMEBREW_SHIMS_PATH}/scm" - - if cmd - internal_cmd = require? HOMEBREW_LIBRARY_PATH.join("cmd", cmd) - - if !internal_cmd && ARGV.homebrew_developer? - internal_cmd = require? HOMEBREW_LIBRARY_PATH.join("dev-cmd", cmd) - end - end - - # Usage instructions should be displayed if and only if one of: - # - a help flag is passed AND an internal command is matched - # - a help flag is passed AND there is no command specified - # - no arguments are passed - # - # It should never affect external commands so they can handle usage - # arguments themselves. - if empty_argv || help_flag - require "cmd/help" - Homebrew.help cmd, :empty_argv => empty_argv - # `Homebrew.help` never returns, except for external/unknown commands. - end - - # Uninstall old brew-cask if it's still around; we just use the tap now. - if cmd == "cask" && (HOMEBREW_CELLAR/"brew-cask").exist? - system(HOMEBREW_BREW_FILE, "uninstall", "--force", "brew-cask") - end - - if internal_cmd - Homebrew.send cmd.to_s.tr("-", "_").downcase - elsif which "brew-#{cmd}" - %w[CACHE LIBRARY_PATH].each do |e| - ENV["HOMEBREW_#{e}"] = Object.const_get("HOMEBREW_#{e}").to_s - end - exec "brew-#{cmd}", *ARGV - elsif (path = which("brew-#{cmd}.rb")) && require?(path) - exit Homebrew.failed? ? 1 : 0 - else - require "tap" - possible_tap = OFFICIAL_CMD_TAPS.find { |_, cmds| cmds.include?(cmd) } - possible_tap = Tap.fetch(possible_tap.first) if possible_tap - - if possible_tap && !possible_tap.installed? - brew_uid = HOMEBREW_BREW_FILE.stat.uid - tap_commands = [] - if Process.uid.zero? && !brew_uid.zero? - tap_commands += %W[/usr/bin/sudo -u ##{brew_uid}] - end - tap_commands += %W[#{HOMEBREW_BREW_FILE} tap #{possible_tap}] - safe_system(*tap_commands) - exec HOMEBREW_BREW_FILE, cmd, *ARGV - else - onoe "Unknown command: #{cmd}" - exit 1 - end - end - -rescue UsageError => e - require "cmd/help" - Homebrew.help cmd, :usage_error => e.message -rescue SystemExit => e - onoe "Kernel.exit" if ARGV.verbose? && !e.success? - $stderr.puts e.backtrace if ARGV.debug? - raise -rescue Interrupt => e - $stderr.puts # seemingly a newline is typical - exit 130 -rescue BuildError => e - Utils::Analytics.report_exception(e) - e.dump - exit 1 -rescue RuntimeError, SystemCallError => e - Utils::Analytics.report_exception(e) - raise if e.message.empty? - onoe e - $stderr.puts e.backtrace if ARGV.debug? - exit 1 -rescue Exception => e - Utils::Analytics.report_exception(e) - onoe e - if internal_cmd && defined?(OS::ISSUES_URL) - $stderr.puts "#{Tty.white}Please report this bug:" - $stderr.puts " #{Tty.em}#{OS::ISSUES_URL}#{Tty.reset}" - end - $stderr.puts e.backtrace - exit 1 -else - exit 1 if Homebrew.failed? -end diff --git a/Library/brew.sh b/Library/brew.sh deleted file mode 100644 index 5dd1ce630..000000000 --- a/Library/brew.sh +++ /dev/null @@ -1,249 +0,0 @@ -HOMEBREW_VERSION="0.9.9" - -onoe() { - if [[ -t 2 ]] # check whether stderr is a tty. - then - echo -ne "\033[4;31mError\033[0m: " >&2 # highlight Error with underline and red color - else - echo -n "Error: " >&2 - fi - if [[ $# -eq 0 ]] - then - /bin/cat >&2 - else - echo "$*" >&2 - fi -} - -odie() { - onoe "$@" - exit 1 -} - -safe_cd() { - cd "$@" >/dev/null || odie "Error: failed to cd to $*!" -} - -brew() { - "$HOMEBREW_BREW_FILE" "$@" -} - -git() { - "$HOMEBREW_LIBRARY/Homebrew/shims/scm/git" "$@" -} - -# Force UTF-8 to avoid encoding issues for users with broken locale settings. -if [[ "$(locale charmap 2> /dev/null)" != "UTF-8" ]] -then - export LC_ALL="en_US.UTF-8" -fi - -# Where we store built products; /usr/local/Cellar if it exists, -# otherwise a Cellar relative to the Repository. -if [[ -d "$HOMEBREW_PREFIX/Cellar" ]] -then - HOMEBREW_CELLAR="$HOMEBREW_PREFIX/Cellar" -else - HOMEBREW_CELLAR="$HOMEBREW_REPOSITORY/Cellar" -fi - -case "$*" in - --prefix) echo "$HOMEBREW_PREFIX"; exit 0 ;; - --cellar) echo "$HOMEBREW_CELLAR"; exit 0 ;; - --repository|--repo) echo "$HOMEBREW_REPOSITORY"; exit 0 ;; -esac - -if [[ "$HOMEBREW_PREFIX" = "/" || "$HOMEBREW_PREFIX" = "/usr" ]] -then - # it may work, but I only see pain this route and don't want to support it - odie "Cowardly refusing to continue at this prefix: $HOMEBREW_PREFIX" -fi - -# Users may have these set, pointing the system Ruby -# at non-system gem paths -unset GEM_HOME -unset GEM_PATH - -HOMEBREW_SYSTEM="$(uname -s)" -case "$HOMEBREW_SYSTEM" in - Darwin) HOMEBREW_OSX="1";; - Linux) HOMEBREW_LINUX="1";; -esac - -HOMEBREW_CURL="/usr/bin/curl" -if [[ -n "$HOMEBREW_OSX" ]] -then - HOMEBREW_PROCESSOR="$(uname -p)" - HOMEBREW_PRODUCT="Homebrew" - HOMEBREW_SYSTEM="Macintosh" - # This is i386 even on x86_64 machines - [[ "$HOMEBREW_PROCESSOR" = "i386" ]] && HOMEBREW_PROCESSOR="Intel" - HOMEBREW_OSX_VERSION="$(/usr/bin/sw_vers -productVersion)" - HOMEBREW_OS_VERSION="Mac OS X $HOMEBREW_OSX_VERSION" - - printf -v HOMEBREW_OSX_VERSION_NUMERIC "%02d%02d%02d" ${HOMEBREW_OSX_VERSION//./ } - if [[ "$HOMEBREW_OSX_VERSION_NUMERIC" -lt "100900" && - -x "$HOMEBREW_PREFIX/opt/curl/bin/curl" ]] - then - HOMEBREW_CURL="$HOMEBREW_PREFIX/opt/curl/bin/curl" - fi -else - HOMEBREW_PROCESSOR="$(uname -m)" - HOMEBREW_PRODUCT="${HOMEBREW_SYSTEM}brew" - [[ -n "$HOMEBREW_LINUX" ]] && HOMEBREW_OS_VERSION="$(lsb_release -sd 2>/dev/null)" - : "${HOMEBREW_OS_VERSION:=$(uname -r)}" -fi -HOMEBREW_USER_AGENT="$HOMEBREW_PRODUCT/$HOMEBREW_VERSION ($HOMEBREW_SYSTEM; $HOMEBREW_PROCESSOR $HOMEBREW_OS_VERSION)" -HOMEBREW_CURL_VERSION="$("$HOMEBREW_CURL" --version 2>/dev/null | head -n1 | /usr/bin/awk '{print $1"/"$2}')" -HOMEBREW_USER_AGENT_CURL="$HOMEBREW_USER_AGENT $HOMEBREW_CURL_VERSION" - -if [[ -z "$HOMEBREW_CACHE" ]] -then - HOMEBREW_CACHE="$HOME/Library/Caches/Homebrew" -fi - -# Declared in bin/brew -export HOMEBREW_BREW_FILE -export HOMEBREW_PREFIX -export HOMEBREW_REPOSITORY -export HOMEBREW_LIBRARY - -# Declared in brew.sh -export HOMEBREW_VERSION -export HOMEBREW_CACHE -export HOMEBREW_CELLAR -export HOMEBREW_SYSTEM -export HOMEBREW_CURL -export HOMEBREW_PROCESSOR -export HOMEBREW_PRODUCT -export HOMEBREW_OS_VERSION -export HOMEBREW_OSX_VERSION -export HOMEBREW_USER_AGENT -export HOMEBREW_USER_AGENT_CURL - -if [[ -n "$HOMEBREW_OSX" ]] -then - XCODE_SELECT_PATH=$('/usr/bin/xcode-select' --print-path 2>/dev/null) - if [[ "$XCODE_SELECT_PATH" = "/" ]] - then - odie <