##### ##### First do the essential, fast things to be able to make e.g. brew --prefix and other commands we want to be ##### able to `source` in shell configuration quick. ##### HOMEBREW_PROCESSOR="$(uname -m)" HOMEBREW_SYSTEM="$(uname -s)" case "$HOMEBREW_SYSTEM" in Darwin) HOMEBREW_MACOS="1" ;; Linux) HOMEBREW_LINUX="1" ;; esac # Where we store built products; a Cellar in HOMEBREW_PREFIX (often /usr/local # for bottles) unless there's already a Cellar in HOMEBREW_REPOSITORY. if [[ -d "$HOMEBREW_REPOSITORY/Cellar" ]] then HOMEBREW_CELLAR="$HOMEBREW_REPOSITORY/Cellar" else HOMEBREW_CELLAR="$HOMEBREW_PREFIX/Cellar" fi if [[ -n "$HOMEBREW_MACOS" ]] then HOMEBREW_DEFAULT_CACHE="${HOME}/Library/Caches/Homebrew" HOMEBREW_DEFAULT_LOGS="${HOME}/Library/Logs/Homebrew" HOMEBREW_DEFAULT_TEMP="/private/tmp" else CACHE_HOME="${XDG_CACHE_HOME:-${HOME}/.cache}" HOMEBREW_DEFAULT_CACHE="${CACHE_HOME}/Homebrew" HOMEBREW_DEFAULT_LOGS="${CACHE_HOME}/Homebrew/Logs" HOMEBREW_DEFAULT_TEMP="/tmp" fi HOMEBREW_CACHE="${HOMEBREW_CACHE:-${HOMEBREW_DEFAULT_CACHE}}" HOMEBREW_LOGS="${HOMEBREW_LOGS:-${HOMEBREW_DEFAULT_LOGS}}" HOMEBREW_TEMP="${HOMEBREW_TEMP:-${HOMEBREW_DEFAULT_TEMP}}" # Don't need shellcheck to follow these `source`. # shellcheck disable=SC1090 case "$*" in --prefix) echo "$HOMEBREW_PREFIX"; exit 0 ;; --cellar) echo "$HOMEBREW_CELLAR"; exit 0 ;; --repository|--repo) echo "$HOMEBREW_REPOSITORY"; exit 0 ;; --caskroom) echo "$HOMEBREW_PREFIX/Caskroom"; exit 0 ;; --cache) echo "$HOMEBREW_CACHE"; exit 0 ;; shellenv) source "$HOMEBREW_LIBRARY/Homebrew/cmd/shellenv.sh"; homebrew-shellenv; exit 0 ;; formulae) source "$HOMEBREW_LIBRARY/Homebrew/cmd/formulae.sh"; homebrew-formulae; exit 0 ;; esac ##### ##### Next, define all helper functions. ##### ohai() { if [[ -n "$HOMEBREW_COLOR" || (-t 1 && -z "$HOMEBREW_NO_COLOR") ]] # check whether stdout is a tty. then echo -e "\\033[34m==>\\033[0m \\033[1m$*\\033[0m" # blue arrow and bold text else echo "==> $*" fi } onoe() { if [[ -n "$HOMEBREW_COLOR" || (-t 2 && -z "$HOMEBREW_NO_COLOR") ]] # 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 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" "$@" } numeric() { # Condense the exploded argument into a single return value. # shellcheck disable=SC2086,SC2183 printf "%01d%02d%02d%03d" ${1//[.rc]/ } 2>/dev/null } check-run-command-as-root() { [[ "$(id -u)" = 0 ]] || return # Allow Azure Pipelines/GitHub Actions/Docker/Concourse/Kubernetes to do everything as root (as it's normal there) [[ -f /proc/1/cgroup ]] && grep -E "azpl_job|actions_job|docker|garden|kubepods" -q /proc/1/cgroup && return # Homebrew Services may need `sudo` for system-wide daemons. [[ "$HOMEBREW_COMMAND" = "services" ]] && return # It's fine to run this as root as it's not changing anything. [[ "$HOMEBREW_COMMAND" = "--prefix" ]] && return odie <&2 } update-preinstall() { [[ -z "$HOMEBREW_HELP" ]] || return [[ -z "$HOMEBREW_NO_AUTO_UPDATE" ]] || return [[ -z "$HOMEBREW_AUTO_UPDATING" ]] || return [[ -z "$HOMEBREW_UPDATE_PREINSTALL" ]] || return [[ -z "$HOMEBREW_AUTO_UPDATE_CHECKED" ]] || return # If we've checked for updates, we don't need to check again. export HOMEBREW_AUTO_UPDATE_CHECKED="1" if [[ "$HOMEBREW_COMMAND" = "cask" ]] then if [[ "$HOMEBREW_CASK_COMMAND" != "upgrade" && $HOMEBREW_ARG_COUNT -lt 3 ]] then return fi elif [[ "$HOMEBREW_COMMAND" != "upgrade" && $HOMEBREW_ARG_COUNT -lt 2 ]] then return fi if [[ "$HOMEBREW_COMMAND" = "install" || "$HOMEBREW_COMMAND" = "upgrade" || "$HOMEBREW_COMMAND" = "bump-formula-pr" || "$HOMEBREW_COMMAND" = "bump-cask-pr" || "$HOMEBREW_COMMAND" = "bundle" || "$HOMEBREW_COMMAND" = "tap" && $HOMEBREW_ARG_COUNT -gt 1 || "$HOMEBREW_CASK_COMMAND" = "install" || "$HOMEBREW_CASK_COMMAND" = "upgrade" ]] then export HOMEBREW_AUTO_UPDATING="1" # Skip auto-update if the cask/core tap has been updated in the # last $HOMEBREW_AUTO_UPDATE_SECS. if [[ "$HOMEBREW_COMMAND" = "cask" ]] then tap_fetch_head="$HOMEBREW_LIBRARY/Taps/homebrew/homebrew-cask/.git/FETCH_HEAD" else tap_fetch_head="$HOMEBREW_LIBRARY/Taps/homebrew/homebrew-core/.git/FETCH_HEAD" fi if [[ -f "$tap_fetch_head" && -n "$(find "$tap_fetch_head" -type f -mtime -"${HOMEBREW_AUTO_UPDATE_SECS}"s 2>/dev/null)" ]] then return fi if [[ -z "$HOMEBREW_VERBOSE" ]] then update-preinstall-timer & timer_pid=$! fi brew update --preinstall if [[ -n "$timer_pid" ]] then kill "$timer_pid" 2>/dev/null wait "$timer_pid" 2>/dev/null fi unset HOMEBREW_AUTO_UPDATING # exec a new process to set any new environment variables. exec "$HOMEBREW_BREW_FILE" "$@" fi } ##### ##### Setup output so e.g. odie looks as nice as possible. ##### # Colorize output on GitHub Actions. if [[ -n "$GITHUB_ACTIONS" ]]; then export HOMEBREW_COLOR="1" fi # Force UTF-8 to avoid encoding issues for users with broken locale settings. if [[ -n "$HOMEBREW_MACOS" ]] then if [[ "$(locale charmap)" != "UTF-8" ]] then export LC_ALL="en_US.UTF-8" fi else if ! command -v locale >/dev/null then export LC_ALL=C elif [[ "$(locale charmap)" != "UTF-8" ]] then locales=$(locale -a) c_utf_regex='\bC\.(utf8|UTF-8)\b' en_us_regex='\ben_US\.(utf8|UTF-8)\b' utf_regex='\b[a-z][a-z]_[A-Z][A-Z]\.(utf8|UTF-8)\b' if [[ $locales =~ $c_utf_regex || $locales =~ $en_us_regex || $locales =~ $utf_regex ]] then export LC_ALL=${BASH_REMATCH[0]} else export LC_ALL=C fi fi fi ##### ##### odie as quickly as possible. ##### 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 # Many Pathname operations use getwd when they shouldn't, and then throw # odd exceptions. Reduce our support burden by showing a user-friendly error. if [[ ! -d "$(pwd)" ]] then odie "The current working directory doesn't exist, cannot proceed." fi ##### ##### Now, do everything else (that may be a bit slower). ##### # USER isn't always set so provide a fall back for `brew` and subprocesses. export USER=${USER:-$(id -un)} # A depth of 1 means this command was directly invoked by a user. # Higher depths mean this command was invoked by another Homebrew command. export HOMEBREW_COMMAND_DEPTH=$((HOMEBREW_COMMAND_DEPTH + 1)) if [[ -n "$HOMEBREW_FORCE_BREWED_CURL" && -x "$HOMEBREW_PREFIX/opt/curl/bin/curl" ]] && "$HOMEBREW_PREFIX/opt/curl/bin/curl" --version >/dev/null then HOMEBREW_CURL="$HOMEBREW_PREFIX/opt/curl/bin/curl" elif [[ -n "$HOMEBREW_DEVELOPER" && -x "$HOMEBREW_CURL_PATH" ]] then HOMEBREW_CURL="$HOMEBREW_CURL_PATH" else HOMEBREW_CURL="curl" fi if [[ -n "$HOMEBREW_FORCE_BREWED_GIT" && -x "$HOMEBREW_PREFIX/opt/git/bin/git" ]] && "$HOMEBREW_PREFIX/opt/git/bin/git" --version >/dev/null then HOMEBREW_GIT="$HOMEBREW_PREFIX/opt/git/bin/git" elif [[ -n "$HOMEBREW_DEVELOPER" && -x "$HOMEBREW_GIT_PATH" ]] then HOMEBREW_GIT="$HOMEBREW_GIT_PATH" else HOMEBREW_GIT="git" fi HOMEBREW_VERSION="$("$HOMEBREW_GIT" -C "$HOMEBREW_REPOSITORY" describe --tags --dirty --abbrev=7 2>/dev/null)" HOMEBREW_USER_AGENT_VERSION="$HOMEBREW_VERSION" if [[ -z "$HOMEBREW_VERSION" ]] then HOMEBREW_VERSION=">=2.5.0 (shallow or no git repository)" HOMEBREW_USER_AGENT_VERSION="2.X.Y" fi if [[ -n "$HOMEBREW_MACOS" ]] then HOMEBREW_PRODUCT="Homebrew" HOMEBREW_SYSTEM="Macintosh" [[ "$HOMEBREW_PROCESSOR" = "x86_64" ]] && HOMEBREW_PROCESSOR="Intel" HOMEBREW_MACOS_VERSION="$(/usr/bin/sw_vers -productVersion)" HOMEBREW_OS_VERSION="macOS $HOMEBREW_MACOS_VERSION" # Don't change this from Mac OS X to match what macOS itself does in Safari on 10.12 HOMEBREW_OS_USER_AGENT_VERSION="Mac OS X $HOMEBREW_MACOS_VERSION" # Intentionally set this variable by exploding another. # shellcheck disable=SC2086,SC2183 printf -v HOMEBREW_MACOS_VERSION_NUMERIC "%02d%02d%02d" ${HOMEBREW_MACOS_VERSION//./ } # Refuse to run on pre-Yosemite if [[ "$HOMEBREW_MACOS_VERSION_NUMERIC" -lt "101000" ]] then printf "ERROR: Your version of macOS (%s) is too old to run Homebrew!\\n" "$HOMEBREW_MACOS_VERSION" >&2 if [[ "$HOMEBREW_MACOS_VERSION_NUMERIC" -lt "100700" ]] then printf " For 10.4 - 10.6 support see: https://github.com/mistydemeo/tigerbrew\\n" >&2 fi printf "\\n" >&2 fi # The system Git on macOS versions before Sierra is too old for some Homebrew functionality we rely on. HOMEBREW_MINIMUM_GIT_VERSION="2.14.3" if [[ "$HOMEBREW_MACOS_VERSION_NUMERIC" -lt "101200" ]] then HOMEBREW_FORCE_BREWED_GIT="1" fi # Set a variable when the macOS system Ruby is new enough to avoid spawning # a Ruby process unnecessarily. if [[ "$HOMEBREW_MACOS_VERSION_NUMERIC" -lt "101500" ]] then unset HOMEBREW_MACOS_SYSTEM_RUBY_NEW_ENOUGH else # Used in ruby.sh. # shellcheck disable=SC2034 HOMEBREW_MACOS_SYSTEM_RUBY_NEW_ENOUGH="1" fi else HOMEBREW_PRODUCT="${HOMEBREW_SYSTEM}brew" [[ -n "$HOMEBREW_LINUX" ]] && HOMEBREW_OS_VERSION="$(lsb_release -sd 2>/dev/null)" : "${HOMEBREW_OS_VERSION:=$(uname -r)}" HOMEBREW_OS_USER_AGENT_VERSION="$HOMEBREW_OS_VERSION" if [[ -n "$HOMEBREW_FORCE_HOMEBREW_ON_LINUX" && -n "$HOMEBREW_ON_DEBIAN7" ]] then # Special version for our debian 7 docker container used to build patchelf and binutils HOMEBREW_MINIMUM_CURL_VERSION="7.25.0" else # Ensure the system Curl is a version that supports modern HTTPS certificates. HOMEBREW_MINIMUM_CURL_VERSION="7.41.0" fi curl_version_output="$($HOMEBREW_CURL --version 2>/dev/null)" curl_name_and_version="${curl_version_output%% (*}" if [[ $(numeric "${curl_name_and_version##* }") -lt $(numeric "$HOMEBREW_MINIMUM_CURL_VERSION") ]] then message="Please update your system cURL. Minimum required version: ${HOMEBREW_MINIMUM_CURL_VERSION} Your cURL version: ${curl_name_and_version##* } Your cURL executable: $(type -p $HOMEBREW_CURL)" if [[ -z $HOMEBREW_CURL_PATH || -z $HOMEBREW_DEVELOPER ]]; then HOMEBREW_SYSTEM_CURL_TOO_OLD=1 HOMEBREW_FORCE_BREWED_CURL=1 if [[ -z $HOMEBREW_CURL_WARNING ]]; then onoe "$message" HOMEBREW_CURL_WARNING=1 fi else odie "$message" fi fi # Ensure the system Git is at or newer than the minimum required version. # Git 2.7.4 is the version of git on Ubuntu 16.04 LTS (Xenial Xerus). HOMEBREW_MINIMUM_GIT_VERSION="2.7.0" git_version_output="$($HOMEBREW_GIT --version 2>/dev/null)" # $extra is intentionally discarded. # shellcheck disable=SC2034 IFS=. read -r major minor micro build extra <<< "${git_version_output##* }" if [[ $(numeric "$major.$minor.$micro.$build") -lt $(numeric "$HOMEBREW_MINIMUM_GIT_VERSION") ]] then message="Please update your system Git. Minimum required version: ${HOMEBREW_MINIMUM_GIT_VERSION} Your Git version: $major.$minor.$micro.$build Your Git executable: $(unset git && type -p $HOMEBREW_GIT)" if [[ -z $HOMEBREW_GIT_PATH || -z $HOMEBREW_DEVELOPER ]]; then HOMEBREW_FORCE_BREWED_GIT="1" if [[ -z $HOMEBREW_GIT_WARNING ]]; then onoe "$message" HOMEBREW_GIT_WARNING=1 fi else odie "$message" fi fi unset HOMEBREW_MACOS_SYSTEM_RUBY_NEW_ENOUGH fi if [[ -n "$HOMEBREW_MACOS" || -n "$HOMEBREW_FORCE_HOMEBREW_ON_LINUX" ]] then HOMEBREW_BOTTLE_DEFAULT_DOMAIN="https://homebrew.bintray.com" else HOMEBREW_BOTTLE_DEFAULT_DOMAIN="https://linuxbrew.bintray.com" fi HOMEBREW_USER_AGENT="$HOMEBREW_PRODUCT/$HOMEBREW_USER_AGENT_VERSION ($HOMEBREW_SYSTEM; $HOMEBREW_PROCESSOR $HOMEBREW_OS_USER_AGENT_VERSION)" curl_version_output="$("$HOMEBREW_CURL" --version 2>/dev/null)" curl_name_and_version="${curl_version_output%% (*}" HOMEBREW_USER_AGENT_CURL="$HOMEBREW_USER_AGENT ${curl_name_and_version// //}" # 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_DEFAULT_CACHE export HOMEBREW_CACHE export HOMEBREW_DEFAULT_LOGS export HOMEBREW_LOGS export HOMEBREW_DEFAULT_TEMP export HOMEBREW_TEMP export HOMEBREW_CELLAR export HOMEBREW_SYSTEM export HOMEBREW_CURL export HOMEBREW_CURL_WARNING export HOMEBREW_SYSTEM_CURL_TOO_OLD export HOMEBREW_GIT export HOMEBREW_GIT_WARNING export HOMEBREW_MINIMUM_GIT_VERSION export HOMEBREW_PROCESSOR export HOMEBREW_PRODUCT export HOMEBREW_OS_VERSION export HOMEBREW_MACOS_VERSION export HOMEBREW_MACOS_VERSION_NUMERIC export HOMEBREW_USER_AGENT export HOMEBREW_USER_AGENT_CURL export HOMEBREW_BOTTLE_DEFAULT_DOMAIN if [[ -n "$HOMEBREW_MACOS" && -x "/usr/bin/xcode-select" ]] then XCODE_SELECT_PATH=$('/usr/bin/xcode-select' --print-path 2>/dev/null) if [[ "$XCODE_SELECT_PATH" = "/" ]] then odie </dev/null)" if [[ "$HOMEBREW_GIT_CONFIG_DEVELOPERMODE" = "true" ]] then export HOMEBREW_DEV_CMD_RUN="1" fi # Don't allow non-developers to customise Ruby warnings. unset HOMEBREW_RUBY_WARNINGS # Disable Ruby options we don't need. RubyGems provides a decent speedup. RUBY_DISABLE_OPTIONS="--disable=gems,did_you_mean,rubyopt" else # Don't disable did_you_mean for developers as it's useful. RUBY_DISABLE_OPTIONS="--disable=gems,rubyopt" fi if [[ -z "$HOMEBREW_RUBY_WARNINGS" ]] then export HOMEBREW_RUBY_WARNINGS="-W0" fi if [[ -z "$HOMEBREW_BOTTLE_DOMAIN" ]] then export HOMEBREW_BOTTLE_DOMAIN="$HOMEBREW_BOTTLE_DEFAULT_DOMAIN" fi export HOMEBREW_BREW_DEFAULT_GIT_REMOTE="https://github.com/Homebrew/brew" if [[ -z "$HOMEBREW_BREW_GIT_REMOTE" ]] then HOMEBREW_BREW_GIT_REMOTE="$HOMEBREW_BREW_DEFAULT_GIT_REMOTE" fi export HOMEBREW_BREW_GIT_REMOTE if [[ -n "$HOMEBREW_MACOS" ]] || [[ -n "$HOMEBREW_FORCE_HOMEBREW_ON_LINUX" ]] then HOMEBREW_CORE_DEFAULT_GIT_REMOTE="https://github.com/Homebrew/homebrew-core" else HOMEBREW_CORE_DEFAULT_GIT_REMOTE="https://github.com/Homebrew/linuxbrew-core" fi export HOMEBREW_CORE_DEFAULT_GIT_REMOTE if [[ -z "$HOMEBREW_CORE_GIT_REMOTE" ]] then HOMEBREW_CORE_GIT_REMOTE="$HOMEBREW_CORE_DEFAULT_GIT_REMOTE" fi export HOMEBREW_CORE_GIT_REMOTE if [[ -f "$HOMEBREW_LIBRARY/Homebrew/cmd/$HOMEBREW_COMMAND.sh" ]] then HOMEBREW_BASH_COMMAND="$HOMEBREW_LIBRARY/Homebrew/cmd/$HOMEBREW_COMMAND.sh" elif [[ -f "$HOMEBREW_LIBRARY/Homebrew/dev-cmd/$HOMEBREW_COMMAND.sh" ]] then if [[ -z "$HOMEBREW_DEVELOPER" ]] then git config --file="$HOMEBREW_GIT_CONFIG_FILE" --replace-all homebrew.devcmdrun true 2>/dev/null export HOMEBREW_DEV_CMD_RUN="1" fi HOMEBREW_BASH_COMMAND="$HOMEBREW_LIBRARY/Homebrew/dev-cmd/$HOMEBREW_COMMAND.sh" fi check-run-command-as-root check-prefix-is-not-tmpdir if [[ "$HOMEBREW_PREFIX" = "/usr/local" && "$HOMEBREW_PREFIX" != "$HOMEBREW_REPOSITORY" && "$HOMEBREW_CELLAR" = "$HOMEBREW_REPOSITORY/Cellar" ]] then cat >&2 <