#!/bin/bash # This script because we support $HOMEBREW_GIT, $HOMEBREW_SVN, etc., Xcode-only and # no Xcode/CLT configurations. Order is careful to be what the user would want. set +o posix quiet_safe_cd() { cd "$1" >/dev/null || { echo "Error: failed to cd to $1" >&2; exit 1; } } absdir() { quiet_safe_cd "${1%/*}/" && pwd -P } dirbasepath() { local dir="$1" local base="${2##*/}" echo "$dir/$base" } realpath() { local path="$1" local dir local dest dir="$(absdir "$path")" path="$(dirbasepath "$dir" "$path")" while [[ -L "$path" ]] do dest="$(readlink "$path")" if [[ "$dest" = "/"* ]] then path="$dest" else path="$dir/$dest" fi dir="$(absdir "$path")" path="$(dirbasepath "$dir" "$path")" done echo "$path" } executable() { local file="$1" [[ -f "$file" && -x "$file" ]] } lowercase() { echo "$1" | tr "[:upper:]" "[:lower:]" } safe_exec() { local arg0="$1" if ! executable "$arg0" then return fi # prevent fork-bombs if [[ "$(lowercase "$arg0")" = "$SCM_FILE" || "$(realpath "$arg0")" = "$SCM_REAL" ]] then return fi if [[ "$HOMEBREW" = "print-path" ]] then local dir="$(quiet_safe_cd "${arg0%/*}/" && pwd)" local path="$(dirbasepath "$dir" "$arg0")" echo "$path" exit fi exec "$@" } SCM_FILE="${0##*/}" SCM_REAL="$(realpath "$0")" SCM_DIR="$(quiet_safe_cd "${SCM_REAL%/*}/" && pwd -P)" if [[ "$1" = --homebrew=* ]] then HOMEBREW="${1:11}" shift fi case "$(lowercase "$SCM_FILE")" in git) if [[ -n "$HOMEBREW_GIT" && "$HOMEBREW_GIT" != git ]] then safe_exec "$(type -P "$HOMEBREW_GIT")" "$@" fi ;; svn) if [[ -n "$HOMEBREW_SVN" && "$HOMEBREW_SVN" != svn ]] then safe_exec "$(type -P "$HOMEBREW_SVN")" "$@" fi ;; esac brew_prefix_version="$(quiet_safe_cd "$SCM_DIR/../../../../../bin" 2>/dev/null && pwd -P)/$SCM_FILE" safe_exec "$brew_prefix_version" "$@" brew_repo_version="$(quiet_safe_cd "$SCM_DIR/../../../../bin" && pwd -P)/$SCM_FILE" safe_exec "$brew_repo_version" "$@" IFS=$'\n' for path in $(type -aP "$SCM_FILE") do if [[ "$path" != "/usr/bin/$SCM_FILE" ]] then safe_exec "$path" "$@" fi done unset IFS if executable "/usr/bin/xcode-select" then # xcode-select will return empty on no Xcode/CLT configuration. # /usr/bin/ will be a popup stub under such configuration. # xcrun hangs if xcode-select is set to "/" xcode_path="$(/usr/bin/xcode-select -print-path 2>/dev/null)" if [[ -z "$xcode_path" ]] then if [[ "$HOMEBREW_MACOS_VERSION_NUMERIC" -ge "100900" ]] then popup_stub=1 fi fi if [[ -z "$popup_stub" && "$xcode_path" != "/" ]] then path="$(/usr/bin/xcrun -find "$SCM_FILE" 2>/dev/null)" safe_exec "$path" "$@" fi fi path="/Applications/Xcode.app/Contents/Developer/usr/bin/$SCM_FILE" safe_exec "$path" "$@" path="/usr/bin/$SCM_FILE" [[ -z "$popup_stub" ]] && safe_exec "$path" "$@" echo "You must: brew install $SCM_FILE" >&2 exit 1