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. 7 8# 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 13 14git_broken_path_fix () { 15case":$PATH:"in 16*:$1:*) : ok ;; 17*) 18 PATH=$( 19 SANE_TOOL_PATH="$1" 20 IFS=: path= sep= 21set x $PATH 22shift 23for elem 24do 25case"$SANE_TOOL_PATH:$elem"in 26(?*:/bin | ?*:/usr/bin) 27 path="$path$sep$SANE_TOOL_PATH" 28 sep=: 29 SANE_TOOL_PATH= 30esac 31 path="$path$sep$elem" 32 sep=: 33done 34echo"$path" 35) 36;; 37esac 38} 39 40# @@BROKEN_PATH_FIX@@ 41 42die() { 43echo>&2"$@" 44exit1 45} 46 47GIT_QUIET= 48 49say () { 50iftest -z"$GIT_QUIET" 51then 52printf'%s\n'"$*" 53fi 54} 55 56iftest -n"$OPTIONS_SPEC";then 57 usage() { 58"$0"-h 59exit1 60} 61 62 parseopt_extra= 63[-n"$OPTIONS_KEEPDASHDASH"] && 64 parseopt_extra="--keep-dashdash" 65 66eval"$( 67 echo "$OPTIONS_SPEC" | 68 git rev-parse --parseopt$parseopt_extra-- "$@" || 69 echo exit $? 70 )" 71else 72 dashless=$(basename "$0" | sed -e 's/-/ /') 73 usage() { 74 die "Usage:$dashless$USAGE" 75} 76 77if[-z"$LONG_USAGE"] 78then 79 LONG_USAGE="Usage:$dashless$USAGE" 80else 81 LONG_USAGE="Usage:$dashless$USAGE 82 83$LONG_USAGE" 84fi 85 86case"$1"in 87-h|--h|--he|--hel|--help) 88echo"$LONG_USAGE" 89exit 90esac 91fi 92 93set_reflog_action() { 94if[-z"${GIT_REFLOG_ACTION:+set}"] 95then 96 GIT_REFLOG_ACTION="$*" 97export GIT_REFLOG_ACTION 98fi 99} 100 101git_editor() { 102:"${GIT_EDITOR:=$(git config core.editor)}" 103:"${GIT_EDITOR:=${VISUAL:-${EDITOR}}}" 104case"$GIT_EDITOR,$TERM"in 105,dumb) 106echo>&2"No editor specified in GIT_EDITOR, core.editor, VISUAL," 107echo>&2"or EDITOR. Tried to fall back to vi but terminal is dumb." 108echo>&2"Please set one of these variables to an appropriate" 109echo>&2"editor or run$0with options that will not cause an" 110echo>&2"editor to be invoked (e.g., -m or -F for git-commit)." 111exit1 112;; 113esac 114eval"${GIT_EDITOR:=vi}"'"$@"' 115} 116 117sane_grep () { 118 GREP_OPTIONS= LC_ALL=C grep"$@" 119} 120 121sane_egrep () { 122 GREP_OPTIONS= LC_ALL=C egrep"$@" 123} 124 125is_bare_repository () { 126 git rev-parse --is-bare-repository 127} 128 129cd_to_toplevel () { 130 cdup=$(git rev-parse --show-cdup) 131iftest!-z"$cdup" 132then 133# The "-P" option says to follow "physical" directory 134# structure instead of following symbolic links. When cdup is 135# "../", this means following the ".." entry in the current 136# directory instead textually removing a symlink path element 137# from the PWD shell variable. The "-P" behavior is more 138# consistent with the C-style chdir used by most of Git. 139cd -P"$cdup"|| { 140echo>&2"Cannot chdir to$cdup, the toplevel of the working tree" 141exit1 142} 143fi 144} 145 146require_work_tree () { 147test$(git rev-parse --is-inside-work-tree)= true || 148 die "fatal:$0cannot be used without a working tree." 149} 150 151get_author_ident_from_commit () { 152 pick_author_script=' 153 /^author /{ 154 s/'\''/'\''\\'\'\''/g 155 h 156 s/^author \([^<]*\) <[^>]*> .*$/\1/ 157 s/'\''/'\''\'\'\''/g 158 s/.*/GIT_AUTHOR_NAME='\''&'\''/p 159 160 g 161 s/^author [^<]* <\([^>]*\)> .*$/\1/ 162 s/'\''/'\''\'\'\''/g 163 s/.*/GIT_AUTHOR_EMAIL='\''&'\''/p 164 165 g 166 s/^author [^<]* <[^>]*> \(.*\)$/\1/ 167 s/'\''/'\''\'\'\''/g 168 s/.*/GIT_AUTHOR_DATE='\''&'\''/p 169 170 q 171} 172' 173 encoding=$(git config i18n.commitencoding || echo UTF-8) 174 git show -s --pretty=raw --encoding="$encoding" "$1" -- | 175 LANG=C LC_ALL=C sed -ne "$pick_author_script" 176} 177 178# Make sure we are in a valid repository of a vintage we understand, 179# if we require to be in a git repository. 180if test -z "$NONGIT_OK" 181then 182 GIT_DIR=$(git rev-parse --git-dir)|| exit 183 if [ -z "$SUBDIRECTORY_OK" ] 184 then 185 test -z "$(git rev-parse --show-cdup)" || { 186 exit=$? 187 echo >&2 "You need to run this command from the toplevel of the working tree." 188 exit$exit 189 } 190 fi 191 test -n "$GIT_DIR" && GIT_DIR=$(cd "$GIT_DIR" && pwd)|| { 192 echo >&2 "Unable to determine absolute path of git directory" 193 exit 1 194 } 195 :${GIT_OBJECT_DIRECTORY="$GIT_DIR/objects"} 196fi 197 198# Fix some commands on Windows 199case$(uname -s)in 200*MINGW*) 201 # Windows has its own (incompatible) sort and find 202 sort () { 203 /usr/bin/sort "$@" 204 } 205 find () { 206 /usr/bin/find "$@" 207 } 208 ;; 209esac