1#!/bin/sh
2#
3# This is included in commands that either have to be run from the toplevel
4# of the repository, or with GIT_DIR environment variable properly.
5# If the GIT_DIR does not look like the right correct git-repository,
6# it dies.
78
# Having this variable in your environment would break scripts because
9# you would cause "cd" to be taken to unexpected places. If you
10# like CDPATH, define it for your interactive shell sessions without
11# exporting it.
12unset CDPATH
1314
git_broken_path_fix () {
15case ":$PATH:" in
16*:$1:*) : ok ;;
17*)
18PATH=$(
19SANE_TOOL_PATH="$1"
20IFS=: path= sep=
21set x $PATH
22shift
23for elem
24do
25case "$SANE_TOOL_PATH:$elem" in
26(?*:/bin | ?*:/usr/bin)
27path="$path$sep$SANE_TOOL_PATH"
28sep=:
29SANE_TOOL_PATH=
30esac
31path="$path$sep$elem"
32sep=:
33done
34echo "$path"
35)
36;;
37esac
38}
3940
# @@BROKEN_PATH_FIX@@
4142
die() {
43echo >&2 "$@"
44exit 1
45}
4647
if test -n "$OPTIONS_SPEC"; then
48usage() {
49"$0" -h
50exit 1
51}
5253
parseopt_extra=
54[ -n "$OPTIONS_KEEPDASHDASH" ] &&
55parseopt_extra="--keep-dashdash"
5657
eval "$(
58echo "$OPTIONS_SPEC" |
59git rev-parse --parseopt $parseopt_extra -- "$@" ||
60echo exit $?
61)"
62else
63dashless=$(basename "$0" | sed -e 's/-/ /')
64usage() {
65die "Usage: $dashless $USAGE"
66}
6768
if [ -z "$LONG_USAGE" ]
69then
70LONG_USAGE="Usage: $dashless $USAGE"
71else
72LONG_USAGE="Usage: $dashless $USAGE
7374
$LONG_USAGE"
75fi
7677
case "$1" in
78-h|--h|--he|--hel|--help)
79echo "$LONG_USAGE"
80exit
81esac
82fi
8384
set_reflog_action() {
85if [ -z "${GIT_REFLOG_ACTION:+set}" ]
86then
87GIT_REFLOG_ACTION="$*"
88export GIT_REFLOG_ACTION
89fi
90}
9192
git_editor() {
93: "${GIT_EDITOR:=$(git config core.editor)}"
94: "${GIT_EDITOR:=${VISUAL:-${EDITOR}}}"
95case "$GIT_EDITOR,$TERM" in
96,dumb)
97echo >&2 "No editor specified in GIT_EDITOR, core.editor, VISUAL,"
98echo >&2 "or EDITOR. Tried to fall back to vi but terminal is dumb."
99echo >&2 "Please set one of these variables to an appropriate"
100echo >&2 "editor or run $0 with options that will not cause an"
101echo >&2 "editor to be invoked (e.g., -m or -F for git-commit)."
102exit 1
103;;
104esac
105eval "${GIT_EDITOR:=vi}" '"$@"'
106}
107108
is_bare_repository () {
109git rev-parse --is-bare-repository
110}
111112
cd_to_toplevel () {
113cdup=$(git rev-parse --show-cdup)
114if test ! -z "$cdup"
115then
116# The "-P" option says to follow "physical" directory
117# structure instead of following symbolic links. When cdup is
118# "../", this means following the ".." entry in the current
119# directory instead textually removing a symlink path element
120# from the PWD shell variable. The "-P" behavior is more
121# consistent with the C-style chdir used by most of Git.
122cd -P "$cdup" || {
123echo >&2 "Cannot chdir to $cdup, the toplevel of the working tree"
124exit 1
125}
126fi
127}
128129
require_work_tree () {
130test $(git rev-parse --is-inside-work-tree) = true ||
131die "fatal: $0 cannot be used without a working tree."
132}
133134
get_author_ident_from_commit () {
135pick_author_script='
136/^author /{
137s/'\''/'\''\\'\'\''/g
138h
139s/^author \([^<]*\) <[^>]*> .*$/\1/
140s/'\''/'\''\'\'\''/g
141s/.*/GIT_AUTHOR_NAME='\''&'\''/p
142143
g
144s/^author [^<]* <\([^>]*\)> .*$/\1/
145s/'\''/'\''\'\'\''/g
146s/.*/GIT_AUTHOR_EMAIL='\''&'\''/p
147148
g
149s/^author [^<]* <[^>]*> \(.*\)$/\1/
150s/'\''/'\''\'\'\''/g
151s/.*/GIT_AUTHOR_DATE='\''&'\''/p
152153
q
154}
155'
156encoding=$(git config i18n.commitencoding || echo UTF-8)
157git show -s --pretty=raw --encoding="$encoding" "$1" -- |
158LANG=C LC_ALL=C sed -ne "$pick_author_script"
159}
160161
# Make sure we are in a valid repository of a vintage we understand,
162# if we require to be in a git repository.
163if test -z "$NONGIT_OK"
164then
165GIT_DIR=$(git rev-parse --git-dir) || exit
166if [ -z "$SUBDIRECTORY_OK" ]
167then
168test -z "$(git rev-parse --show-cdup)" || {
169exit=$?
170echo >&2 "You need to run this command from the toplevel of the working tree."
171exit $exit
172}
173fi
174test -n "$GIT_DIR" && GIT_DIR=$(cd "$GIT_DIR" && pwd) || {
175echo >&2 "Unable to determine absolute path of git directory"
176exit 1
177}
178: ${GIT_OBJECT_DIRECTORY="$GIT_DIR/objects"}
179fi
180181
# Fix some commands on Windows
182case $(uname -s) in
183*MINGW*)
184# Windows has its own (incompatible) sort and find
185sort () {
186/usr/bin/sort "$@"
187}
188find () {
189/usr/bin/find "$@"
190}
191;;
192esac