You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
177 lines
3.9 KiB
177 lines
3.9 KiB
#!/bin/sh |
|
# |
|
# 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. |
|
|
|
# Having this variable in your environment would break scripts because |
|
# you would cause "cd" to be taken to unexpected places. If you |
|
# like CDPATH, define it for your interactive shell sessions without |
|
# exporting it. |
|
unset CDPATH |
|
|
|
die() { |
|
echo >&2 "$@" |
|
exit 1 |
|
} |
|
|
|
if test -n "$OPTIONS_SPEC"; then |
|
usage() { |
|
"$0" -h |
|
exit 1 |
|
} |
|
|
|
parseopt_extra= |
|
[ -n "$OPTIONS_KEEPDASHDASH" ] && |
|
parseopt_extra="--keep-dashdash" |
|
|
|
eval "$( |
|
echo "$OPTIONS_SPEC" | |
|
git rev-parse --parseopt $parseopt_extra -- "$@" || |
|
echo exit $? |
|
)" |
|
else |
|
dashless=$(basename "$0" | sed -e 's/-/ /') |
|
usage() { |
|
die "Usage: $dashless $USAGE" |
|
} |
|
|
|
if [ -z "$LONG_USAGE" ] |
|
then |
|
LONG_USAGE="Usage: $dashless $USAGE" |
|
else |
|
LONG_USAGE="Usage: $dashless $USAGE |
|
|
|
$LONG_USAGE" |
|
fi |
|
|
|
case "$1" in |
|
-h|--h|--he|--hel|--help) |
|
echo "$LONG_USAGE" |
|
exit |
|
esac |
|
fi |
|
|
|
set_reflog_action() { |
|
if [ -z "${GIT_REFLOG_ACTION:+set}" ] |
|
then |
|
GIT_REFLOG_ACTION="$*" |
|
export GIT_REFLOG_ACTION |
|
fi |
|
} |
|
|
|
git_editor() { |
|
: "${GIT_EDITOR:=$(git config core.editor)}" |
|
: "${GIT_EDITOR:=${VISUAL:-${EDITOR}}}" |
|
case "$GIT_EDITOR,$TERM" in |
|
,dumb) |
|
echo >&2 "No editor specified in GIT_EDITOR, core.editor, VISUAL," |
|
echo >&2 "or EDITOR. Tried to fall back to vi but terminal is dumb." |
|
echo >&2 "Please set one of these variables to an appropriate" |
|
echo >&2 "editor or run $0 with options that will not cause an" |
|
echo >&2 "editor to be invoked (e.g., -m or -F for git-commit)." |
|
exit 1 |
|
;; |
|
esac |
|
eval "${GIT_EDITOR:=vi}" '"$@"' |
|
} |
|
|
|
is_bare_repository () { |
|
git rev-parse --is-bare-repository |
|
} |
|
|
|
cd_to_toplevel () { |
|
cdup=$(git rev-parse --show-cdup) |
|
if test ! -z "$cdup" |
|
then |
|
case "$cdup" in |
|
/*) |
|
# Not quite the same as if we did "cd -P '$cdup'" when |
|
# $cdup contains ".." after symlink path components. |
|
# Don't fix that case at least until Git switches to |
|
# "cd -P" across the board. |
|
phys="$cdup" |
|
;; |
|
..|../*|*/..|*/../*) |
|
# Interpret $cdup relative to the physical, not logical, cwd. |
|
# Probably /bin/pwd is more portable than passing -P to cd or pwd. |
|
phys="$(unset PWD; /bin/pwd)/$cdup" |
|
;; |
|
*) |
|
# There's no "..", so no need to make things absolute. |
|
phys="$cdup" |
|
;; |
|
esac |
|
|
|
cd "$phys" || { |
|
echo >&2 "Cannot chdir to $phys, the toplevel of the working tree" |
|
exit 1 |
|
} |
|
fi |
|
} |
|
|
|
require_work_tree () { |
|
test $(git rev-parse --is-inside-work-tree) = true || |
|
die "fatal: $0 cannot be used without a working tree." |
|
} |
|
|
|
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) |
|
git show -s --pretty=raw --encoding="$encoding" "$1" -- | |
|
LANG=C LC_ALL=C sed -ne "$pick_author_script" |
|
} |
|
|
|
# Make sure we are in a valid repository of a vintage we understand, |
|
# if we require to be in a git repository. |
|
if test -z "$NONGIT_OK" |
|
then |
|
GIT_DIR=$(git rev-parse --git-dir) || exit |
|
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 |
|
} |
|
: ${GIT_OBJECT_DIRECTORY="$GIT_DIR/objects"} |
|
fi |
|
|
|
# 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
|
|
|