aboutsummaryrefslogtreecommitdiffstats
path: root/Library/ENV
diff options
context:
space:
mode:
authorXu Cheng2016-07-12 15:20:37 +0800
committerGitHub2016-07-12 15:20:37 +0800
commitc598e1afd5516724be8a67f2c929578bfeb69a18 (patch)
treebd278974f4facb5d6bc0fab7dfc9aa4d0e2c96c2 /Library/ENV
parent768ba34b1428782a2df6c6d0b4d49241d257439e (diff)
downloadbrew-c598e1afd5516724be8a67f2c929578bfeb69a18.tar.bz2
ENV/scm/git: rewrite in Bash (#496)
Diffstat (limited to 'Library/ENV')
-rwxr-xr-xLibrary/ENV/scm/git161
1 files changed, 105 insertions, 56 deletions
diff --git a/Library/ENV/scm/git b/Library/ENV/scm/git
index 8122be68c..f277f6bb9 100755
--- a/Library/ENV/scm/git
+++ b/Library/ENV/scm/git
@@ -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
+
+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"
-SELF_REAL = Pathname.new(__FILE__).realpath
-F = File.basename(__FILE__).freeze
-D = File.expand_path(File.dirname(__FILE__)).freeze
+ 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
-def executable?(file)
- File.file?(file) && File.executable?(file)
-end
+ echo "$path"
+}
-def exec(*args)
+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
-
-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
-
-brew_version = File.expand_path("#{D}/../../../bin/#{F}")
-exec brew_version, *ARGV if executable? brew_version
-
-`/usr/bin/which -a #{F} 2>/dev/null`.split("\n").each do |path|
- exec path, *ARGV unless path == "/usr/bin/#{F}"
-end
-
-popup_stub = false
-if executable? "/usr/bin/xcode-select"
+ fi
+ exec "$@"
+}
+
+SCM_FILE="${0##*/}"
+SCM_DIR="$(quiet_safe_cd "${0%/*}/" && pwd -P)"
+SCM_REAL="$(realpath "$0")"
+
+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/<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