#!/bin/bash # This script because we support $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; } } realpath() { local path="$1" local dir local base local dest dir="$(quiet_safe_cd "${path%/*}/" && pwd -P)" base="${path##*/}" path="$dir/$base" while [[ -L "$path" ]] do dest="$(readlink "$path")" if [[ "$dest" = "/"* ]] then path="$dest" else path="$dir/$dest" fi dir="$(quiet_safe_cd "${path%/*}/" && pwd -P)" base="${path##*/}" path="$dir/$base" 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 echo "$arg0" 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) [[ -n "$HOMEBREW_GIT" ]] && safe_exec "$(which "$HOMEBREW_GIT")" "$@" [[ -n "$GIT" ]] && safe_exec "$(which "$GIT")" "$@" ;; svn) [[ -n "$HOMEBREW_SVN" ]] && safe_exec "$(which "$HOMEBREW_SVN")" "$@" ;; esac brew_version="$(quiet_safe_cd "$SCM_DIR/../../../../bin" && pwd -P)/$SCM_FILE" safe_exec "$brew_version" "$@" IFS=$'\n' for path in $(/usr/bin/which -a "$SCM_FILE" 2>/dev/null) do if [[ "$path" != "/usr/bin/$SCM_FILE" ]] then safe_exec "$path" "$@" fi done 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)" [[ -n "$xcode_path" ]] || popup_stub=1 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