#!/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 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@@ die() { echo >&2 "$@" exit 1 } GIT_QUIET= say () { if test -z "$GIT_QUIET" then printf '%s\n' "$*" fi } 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() { if test -z "${GIT_EDITOR:+set}" then GIT_EDITOR="$(git var GIT_EDITOR)" || return $? fi eval "$GIT_EDITOR" '"$@"' } 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" '"$@"' } sane_grep () { GREP_OPTIONS= LC_ALL=C grep "$@" } sane_egrep () { GREP_OPTIONS= LC_ALL=C egrep "$@" } is_bare_repository () { git rev-parse --is-bare-repository } cd_to_toplevel () { cdup=$(git rev-parse --show-toplevel) && cd "$cdup" || { echo >&2 "Cannot chdir to $cdup, the toplevel of the working tree" exit 1 } } require_work_tree () { test "$(git rev-parse --is-inside-work-tree 2>/dev/null)" = 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/.*/GIT_AUTHOR_NAME='\''&'\''/p g s/^author [^<]* <\([^>]*\)> .*$/\1/ s/.*/GIT_AUTHOR_EMAIL='\''&'\''/p g s/^author [^<]* <[^>]*> \(.*\)$/\1/ 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" } # 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) } # 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