2005-07-09 01:57:21 +08:00
|
|
|
#!/bin/sh
|
|
|
|
#
|
2005-11-24 16:12:11 +08:00
|
|
|
# This is included in commands that either have to be run from the toplevel
|
|
|
|
# of the repository, or with GIT_DIR environment variable properly.
|
|
|
|
# If the GIT_DIR does not look like the right correct git-repository,
|
|
|
|
# it dies.
|
2005-07-09 01:57:21 +08:00
|
|
|
|
2005-09-13 10:47:07 +08:00
|
|
|
# Having this variable in your environment would break scripts because
|
2007-09-16 07:32:23 +08:00
|
|
|
# you would cause "cd" to be taken to unexpected places. If you
|
2005-09-13 10:47:07 +08:00
|
|
|
# like CDPATH, define it for your interactive shell sessions without
|
|
|
|
# exporting it.
|
|
|
|
unset CDPATH
|
|
|
|
|
2009-06-09 00:41:49 +08:00
|
|
|
git_broken_path_fix () {
|
|
|
|
case ":$PATH:" in
|
|
|
|
*:$1:*) : ok ;;
|
|
|
|
*)
|
|
|
|
PATH=$(
|
|
|
|
SANE_TOOL_PATH="$1"
|
|
|
|
IFS=: path= sep=
|
|
|
|
set x $PATH
|
|
|
|
shift
|
|
|
|
for elem
|
|
|
|
do
|
|
|
|
case "$SANE_TOOL_PATH:$elem" in
|
|
|
|
(?*:/bin | ?*:/usr/bin)
|
|
|
|
path="$path$sep$SANE_TOOL_PATH"
|
|
|
|
sep=:
|
|
|
|
SANE_TOOL_PATH=
|
|
|
|
esac
|
|
|
|
path="$path$sep$elem"
|
|
|
|
sep=:
|
|
|
|
done
|
|
|
|
echo "$path"
|
|
|
|
)
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
}
|
|
|
|
|
|
|
|
# @@BROKEN_PATH_FIX@@
|
2009-06-06 07:36:15 +08:00
|
|
|
|
2005-07-09 01:57:21 +08:00
|
|
|
die() {
|
2005-10-01 05:26:57 +08:00
|
|
|
echo >&2 "$@"
|
2005-07-09 01:57:21 +08:00
|
|
|
exit 1
|
|
|
|
}
|
|
|
|
|
2009-06-17 06:32:59 +08:00
|
|
|
GIT_QUIET=
|
|
|
|
|
|
|
|
say () {
|
|
|
|
if test -z "$GIT_QUIET"
|
|
|
|
then
|
|
|
|
printf '%s\n' "$*"
|
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
2007-11-04 18:30:54 +08:00
|
|
|
if test -n "$OPTIONS_SPEC"; then
|
|
|
|
usage() {
|
2007-12-21 04:58:06 +08:00
|
|
|
"$0" -h
|
|
|
|
exit 1
|
2007-11-04 18:30:54 +08:00
|
|
|
}
|
|
|
|
|
2007-11-08 17:32:11 +08:00
|
|
|
parseopt_extra=
|
|
|
|
[ -n "$OPTIONS_KEEPDASHDASH" ] &&
|
|
|
|
parseopt_extra="--keep-dashdash"
|
|
|
|
|
|
|
|
eval "$(
|
2007-11-08 15:04:38 +08:00
|
|
|
echo "$OPTIONS_SPEC" |
|
2007-11-08 17:32:11 +08:00
|
|
|
git rev-parse --parseopt $parseopt_extra -- "$@" ||
|
|
|
|
echo exit $?
|
|
|
|
)"
|
2007-11-04 18:30:54 +08:00
|
|
|
else
|
2008-07-13 21:36:15 +08:00
|
|
|
dashless=$(basename "$0" | sed -e 's/-/ /')
|
2007-11-04 18:30:54 +08:00
|
|
|
usage() {
|
2008-07-13 21:36:15 +08:00
|
|
|
die "Usage: $dashless $USAGE"
|
2007-11-04 18:30:54 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
if [ -z "$LONG_USAGE" ]
|
|
|
|
then
|
2008-07-13 21:36:15 +08:00
|
|
|
LONG_USAGE="Usage: $dashless $USAGE"
|
2007-11-04 18:30:54 +08:00
|
|
|
else
|
2008-07-13 21:36:15 +08:00
|
|
|
LONG_USAGE="Usage: $dashless $USAGE
|
2007-11-04 18:30:54 +08:00
|
|
|
|
|
|
|
$LONG_USAGE"
|
|
|
|
fi
|
|
|
|
|
|
|
|
case "$1" in
|
|
|
|
-h|--h|--he|--hel|--help)
|
|
|
|
echo "$LONG_USAGE"
|
|
|
|
exit
|
|
|
|
esac
|
|
|
|
fi
|
2005-12-11 17:55:49 +08:00
|
|
|
|
2006-12-28 15:34:48 +08:00
|
|
|
set_reflog_action() {
|
|
|
|
if [ -z "${GIT_REFLOG_ACTION:+set}" ]
|
|
|
|
then
|
|
|
|
GIT_REFLOG_ACTION="$*"
|
|
|
|
export GIT_REFLOG_ACTION
|
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
2007-07-20 13:09:35 +08:00
|
|
|
git_editor() {
|
2009-10-31 09:42:34 +08:00
|
|
|
if test -z "${GIT_EDITOR:+set}"
|
|
|
|
then
|
|
|
|
GIT_EDITOR="$(git var GIT_EDITOR)" || return $?
|
|
|
|
fi
|
|
|
|
|
|
|
|
eval "$GIT_EDITOR" '"$@"'
|
2007-07-20 13:09:35 +08:00
|
|
|
}
|
|
|
|
|
2010-02-15 13:04:13 +08:00
|
|
|
git_pager() {
|
|
|
|
if test -t 1
|
|
|
|
then
|
|
|
|
GIT_PAGER=$(git var GIT_PAGER)
|
|
|
|
else
|
|
|
|
GIT_PAGER=cat
|
|
|
|
fi
|
|
|
|
: ${LESS=-FRSX}
|
|
|
|
export LESS
|
|
|
|
|
|
|
|
eval "$GIT_PAGER" '"$@"'
|
|
|
|
}
|
|
|
|
|
2009-11-24 07:56:32 +08:00
|
|
|
sane_grep () {
|
|
|
|
GREP_OPTIONS= LC_ALL=C grep "$@"
|
|
|
|
}
|
|
|
|
|
|
|
|
sane_egrep () {
|
|
|
|
GREP_OPTIONS= LC_ALL=C egrep "$@"
|
|
|
|
}
|
|
|
|
|
2007-01-07 18:17:52 +08:00
|
|
|
is_bare_repository () {
|
2007-07-03 13:52:14 +08:00
|
|
|
git rev-parse --is-bare-repository
|
2007-01-07 18:17:52 +08:00
|
|
|
}
|
|
|
|
|
2007-01-13 04:44:08 +08:00
|
|
|
cd_to_toplevel () {
|
2010-01-12 06:34:34 +08:00
|
|
|
cdup=$(git rev-parse --show-toplevel) &&
|
|
|
|
cd "$cdup" || {
|
|
|
|
echo >&2 "Cannot chdir to $cdup, the toplevel of the working tree"
|
|
|
|
exit 1
|
|
|
|
}
|
2007-01-13 04:44:08 +08:00
|
|
|
}
|
|
|
|
|
2006-12-31 12:32:38 +08:00
|
|
|
require_work_tree () {
|
2010-02-17 12:18:50 +08:00
|
|
|
test "$(git rev-parse --is-inside-work-tree 2>/dev/null)" = true ||
|
2006-12-31 12:32:38 +08:00
|
|
|
die "fatal: $0 cannot be used without a working tree."
|
|
|
|
}
|
|
|
|
|
2007-06-25 08:04:11 +08:00
|
|
|
get_author_ident_from_commit () {
|
|
|
|
pick_author_script='
|
|
|
|
/^author /{
|
|
|
|
s/'\''/'\''\\'\'\''/g
|
|
|
|
h
|
|
|
|
s/^author \([^<]*\) <[^>]*> .*$/\1/
|
|
|
|
s/'\''/'\''\'\'\''/g
|
|
|
|
s/.*/GIT_AUTHOR_NAME='\''&'\''/p
|
|
|
|
|
|
|
|
g
|
|
|
|
s/^author [^<]* <\([^>]*\)> .*$/\1/
|
|
|
|
s/'\''/'\''\'\'\''/g
|
|
|
|
s/.*/GIT_AUTHOR_EMAIL='\''&'\''/p
|
|
|
|
|
|
|
|
g
|
|
|
|
s/^author [^<]* <[^>]*> \(.*\)$/\1/
|
|
|
|
s/'\''/'\''\'\'\''/g
|
|
|
|
s/.*/GIT_AUTHOR_DATE='\''&'\''/p
|
|
|
|
|
|
|
|
q
|
|
|
|
}
|
|
|
|
'
|
|
|
|
encoding=$(git config i18n.commitencoding || echo UTF-8)
|
2008-02-14 05:13:21 +08:00
|
|
|
git show -s --pretty=raw --encoding="$encoding" "$1" -- |
|
2007-06-25 08:04:11 +08:00
|
|
|
LANG=C LC_ALL=C sed -ne "$pick_author_script"
|
|
|
|
}
|
|
|
|
|
2010-02-25 07:34:16 +08:00
|
|
|
# Clear repo-local GIT_* environment variables. Useful when switching to
|
|
|
|
# another repository (e.g. when entering a submodule). See also the env
|
|
|
|
# list in git_connect()
|
|
|
|
clear_local_git_env() {
|
|
|
|
unset $(git rev-parse --local-env-vars)
|
|
|
|
}
|
|
|
|
|
2007-12-13 09:34:30 +08:00
|
|
|
# Make sure we are in a valid repository of a vintage we understand,
|
|
|
|
# if we require to be in a git repository.
|
2007-12-15 12:57:28 +08:00
|
|
|
if test -z "$NONGIT_OK"
|
2005-12-11 17:55:49 +08:00
|
|
|
then
|
2008-02-18 18:44:19 +08:00
|
|
|
GIT_DIR=$(git rev-parse --git-dir) || exit
|
2007-12-13 09:34:30 +08:00
|
|
|
if [ -z "$SUBDIRECTORY_OK" ]
|
|
|
|
then
|
|
|
|
test -z "$(git rev-parse --show-cdup)" || {
|
|
|
|
exit=$?
|
|
|
|
echo >&2 "You need to run this command from the toplevel of the working tree."
|
|
|
|
exit $exit
|
|
|
|
}
|
|
|
|
fi
|
|
|
|
test -n "$GIT_DIR" && GIT_DIR=$(cd "$GIT_DIR" && pwd) || {
|
|
|
|
echo >&2 "Unable to determine absolute path of git directory"
|
|
|
|
exit 1
|
2007-08-11 21:36:28 +08:00
|
|
|
}
|
2007-12-13 09:34:30 +08:00
|
|
|
: ${GIT_OBJECT_DIRECTORY="$GIT_DIR/objects"}
|
2005-12-11 17:55:49 +08:00
|
|
|
fi
|
2007-12-01 05:06:30 +08:00
|
|
|
|
|
|
|
# Fix some commands on Windows
|
|
|
|
case $(uname -s) in
|
|
|
|
*MINGW*)
|
|
|
|
# Windows has its own (incompatible) sort and find
|
|
|
|
sort () {
|
|
|
|
/usr/bin/sort "$@"
|
|
|
|
}
|
|
|
|
find () {
|
|
|
|
/usr/bin/find "$@"
|
|
|
|
}
|
|
|
|
;;
|
|
|
|
esac
|