
This may happen with certain checkout configurations (such as on our CI boxes). Also, rename the variables to be clearer about what they reference.
144 lines
3.1 KiB
Bash
Executable File
144 lines
3.1 KiB
Bash
Executable File
#!/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; }
|
|
}
|
|
|
|
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)
|
|
[[ -n "$HOMEBREW_GIT" ]] && safe_exec "$(which "$HOMEBREW_GIT")" "$@"
|
|
;;
|
|
svn)
|
|
[[ -n "$HOMEBREW_SVN" ]] && safe_exec "$(which "$HOMEBREW_SVN")" "$@"
|
|
;;
|
|
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 $(/usr/bin/which -a "$SCM_FILE" 2>/dev/null)
|
|
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/<tool> 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 [[ -z "$HOMEBREW_MACOS_VERSION" ]]
|
|
then
|
|
HOMEBREW_MACOS_VERSION="$(/usr/bin/sw_vers -productVersion)"
|
|
fi
|
|
printf -v macos_version_numeric "%02d%02d%02d" ${HOMEBREW_MACOS_VERSION//./ }
|
|
if [[ "$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
|