148 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			148 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
| #!/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/<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 [[ "$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" "$@"
 | |
| 
 | |
| if [[ -z "$popup_stub" && "$HOMEBREW_MACOS_VERSION_NUMERIC" -lt "101500" ]]
 | |
| then
 | |
|   path="/usr/bin/$SCM_FILE"
 | |
|   safe_exec "$path" "$@"
 | |
| fi
 | |
| 
 | |
| echo "You must: brew install $SCM_FILE" >&2
 | |
| exit 1
 | 
