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 47iftest -n"$OPTIONS_SPEC";then 48 usage() { 49"$0"-h 50exit1 51} 52 53 parseopt_extra= 54[-n"$OPTIONS_KEEPDASHDASH"] && 55 parseopt_extra="--keep-dashdash" 56 57eval"$( 58 echo "$OPTIONS_SPEC" | 59 git rev-parse --parseopt$parseopt_extra-- "$@" || 60 echo exit $? 61 )" 62else 63 dashless=$(basename "$0" | sed -e 's/-/ /') 64 usage() { 65 die "Usage:$dashless$USAGE" 66} 67 68if[-z"$LONG_USAGE"] 69then 70 LONG_USAGE="Usage:$dashless$USAGE" 71else 72 LONG_USAGE="Usage:$dashless$USAGE 73 74$LONG_USAGE" 75fi 76 77case"$1"in 78-h|--h|--he|--hel|--help) 79echo"$LONG_USAGE" 80exit 81esac 82fi 83 84set_reflog_action() { 85if[-z"${GIT_REFLOG_ACTION:+set}"] 86then 87 GIT_REFLOG_ACTION="$*" 88export GIT_REFLOG_ACTION 89fi 90} 91 92git_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$0with options that will not cause an" 101echo>&2"editor to be invoked (e.g., -m or -F for git-commit)." 102exit1 103;; 104esac 105eval"${GIT_EDITOR:=vi}"'"$@"' 106} 107 108is_bare_repository () { 109 git rev-parse --is-bare-repository 110} 111 112cd_to_toplevel () { 113 cdup=$(git rev-parse --show-cdup) 114iftest!-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" 124exit1 125} 126fi 127} 128 129require_work_tree () { 130test$(git rev-parse --is-inside-work-tree)= true || 131 die "fatal:$0cannot be used without a working tree." 132} 133 134get_author_ident_from_commit () { 135 pick_author_script=' 136 /^author /{ 137 s/'\''/'\''\\'\'\''/g 138 h 139 s/^author \([^<]*\) <[^>]*> .*$/\1/ 140 s/'\''/'\''\'\'\''/g 141 s/.*/GIT_AUTHOR_NAME='\''&'\''/p 142 143 g 144 s/^author [^<]* <\([^>]*\)> .*$/\1/ 145 s/'\''/'\''\'\'\''/g 146 s/.*/GIT_AUTHOR_EMAIL='\''&'\''/p 147 148 g 149 s/^author [^<]* <[^>]*> \(.*\)$/\1/ 150 s/'\''/'\''\'\'\''/g 151 s/.*/GIT_AUTHOR_DATE='\''&'\''/p 152 153 q 154} 155' 156 encoding=$(git config i18n.commitencoding || echo UTF-8) 157 git show -s --pretty=raw --encoding="$encoding" "$1" -- | 158 LANG=C LC_ALL=C sed -ne "$pick_author_script" 159} 160 161# 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 165 GIT_DIR=$(git rev-parse --git-dir)|| exit 166 if [ -z "$SUBDIRECTORY_OK" ] 167 then 168 test -z "$(git rev-parse --show-cdup)" || { 169 exit=$? 170 echo >&2 "You need to run this command from the toplevel of the working tree." 171 exit$exit 172 } 173 fi 174 test -n "$GIT_DIR" && GIT_DIR=$(cd "$GIT_DIR" && pwd)|| { 175 echo >&2 "Unable to determine absolute path of git directory" 176 exit 1 177 } 178 :${GIT_OBJECT_DIRECTORY="$GIT_DIR/objects"} 179fi 180 181# Fix some commands on Windows 182case$(uname -s)in 183*MINGW*) 184 # Windows has its own (incompatible) sort and find 185 sort () { 186 /usr/bin/sort "$@" 187 } 188 find () { 189 /usr/bin/find "$@" 190 } 191 ;; 192esac