mirror of
https://github.com/Homebrew/brew.git
synced 2025-07-14 16:09:03 +08:00

- only document HOMEBREW_* variables in the manpage (although still read from all the original environment variables). - resort manpage environment variables in alphabetical order - check the original path for trailing slashes
141 lines
2.9 KiB
Bash
Executable File
141 lines
2.9 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_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
|
|
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
|