ENV/scm/git: rewrite in Bash (#496)
This commit is contained in:
parent
768ba34b14
commit
c598e1afd5
@ -1,71 +1,120 @@
|
||||
#!/bin/sh
|
||||
# Make sure this shim uses the same Ruby interpreter that is used by Homebrew.
|
||||
unset RUBYLIB
|
||||
unset RUBYOPT
|
||||
if [ -z "$HOMEBREW_RUBY_PATH" ]
|
||||
then
|
||||
echo "${0##*/}: The build tool has reset ENV; --env=std required." >&2
|
||||
exit 1
|
||||
fi
|
||||
exec "$HOMEBREW_RUBY_PATH" -x "$0" "$@"
|
||||
#!/usr/bin/env ruby -W0
|
||||
#!/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.
|
||||
|
||||
require "pathname"
|
||||
set +o posix
|
||||
|
||||
SELF_REAL = Pathname.new(__FILE__).realpath
|
||||
F = File.basename(__FILE__).freeze
|
||||
D = File.expand_path(File.dirname(__FILE__)).freeze
|
||||
quiet_safe_cd() {
|
||||
cd "$1" >/dev/null || { echo "Error: failed to cd to $1" >&2; exit 1; }
|
||||
}
|
||||
|
||||
def executable?(file)
|
||||
File.file?(file) && File.executable?(file)
|
||||
end
|
||||
realpath() {
|
||||
local path="$1"
|
||||
local dir
|
||||
local base
|
||||
local dest
|
||||
|
||||
def exec(*args)
|
||||
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
|
||||
arg0 = args.first
|
||||
return if arg0 =~ /^#{F}/i || Pathname.new(arg0).realpath == SELF_REAL
|
||||
if ARGV == %w[--homebrew=print-path]
|
||||
puts arg0
|
||||
if [[ "$(lowercase "$arg0")" = "$SCM_FILE" || "$(realpath "$arg0")" = "$SCM_REAL" ]]
|
||||
then
|
||||
return
|
||||
fi
|
||||
if [[ "$HOMEBREW" = "print-path" ]]
|
||||
then
|
||||
echo "$arg0"
|
||||
exit
|
||||
end
|
||||
super
|
||||
end
|
||||
fi
|
||||
exec "$@"
|
||||
}
|
||||
|
||||
case F.downcase
|
||||
when "git" then %W[HOMEBREW_GIT GIT]
|
||||
when "svn" then %W[HOMEBREW_SVN]
|
||||
else []
|
||||
end.each do |key|
|
||||
exec ENV[key], *ARGV if ENV[key] && executable?(ENV[key])
|
||||
end
|
||||
SCM_FILE="${0##*/}"
|
||||
SCM_DIR="$(quiet_safe_cd "${0%/*}/" && pwd -P)"
|
||||
SCM_REAL="$(realpath "$0")"
|
||||
|
||||
brew_version = File.expand_path("#{D}/../../../bin/#{F}")
|
||||
exec brew_version, *ARGV if executable? brew_version
|
||||
if [[ "$1" = --homebrew=* ]]
|
||||
then
|
||||
HOMEBREW="${1:11}"
|
||||
shift
|
||||
fi
|
||||
|
||||
`/usr/bin/which -a #{F} 2>/dev/null`.split("\n").each do |path|
|
||||
exec path, *ARGV unless path == "/usr/bin/#{F}"
|
||||
end
|
||||
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
|
||||
|
||||
popup_stub = false
|
||||
if executable? "/usr/bin/xcode-select"
|
||||
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/<tool> will be a popup stub under such configuration.
|
||||
# xcrun hangs if xcode-select is set to "/"
|
||||
path = `/usr/bin/xcode-select -print-path 2>/dev/null`.chomp
|
||||
popup_stub = path.empty?
|
||||
if !popup_stub && path != "/"
|
||||
path = `/usr/bin/xcrun -find #{F} 2>/dev/null`.chomp
|
||||
exec path, *ARGV if executable? path
|
||||
end
|
||||
end
|
||||
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/#{F}"
|
||||
exec path, *ARGV if executable? path
|
||||
path="/Applications/Xcode.app/Contents/Developer/usr/bin/$SCM_FILE"
|
||||
safe_exec "$path" "$@"
|
||||
|
||||
path = "/usr/bin/#{F}"
|
||||
exec path, *ARGV if !popup_stub && executable?(path)
|
||||
path="/usr/bin/$SCM_FILE"
|
||||
[[ -z "$popup_stub" ]] && safe_exec "$path" "$@"
|
||||
|
||||
abort "You must: brew install #{F}"
|
||||
echo "You must: brew install $SCM_FILE" >&2
|
||||
exit 1
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user