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 14die() { 15echo>&2"$@" 16exit1 17} 18 19iftest -n"$OPTIONS_SPEC";then 20 usage() { 21"$0"-h 22exit1 23} 24 25 parseopt_extra= 26[-n"$OPTIONS_KEEPDASHDASH"] && 27 parseopt_extra="--keep-dashdash" 28 29eval"$( 30 echo "$OPTIONS_SPEC" | 31 git rev-parse --parseopt$parseopt_extra-- "$@" || 32 echo exit $? 33 )" 34else 35 dashless=$(basename "$0" | sed -e 's/-/ /') 36 usage() { 37 die "Usage:$dashless$USAGE" 38} 39 40if[-z"$LONG_USAGE"] 41then 42 LONG_USAGE="Usage:$dashless$USAGE" 43else 44 LONG_USAGE="Usage:$dashless$USAGE 45 46$LONG_USAGE" 47fi 48 49case"$1"in 50-h|--h|--he|--hel|--help) 51echo"$LONG_USAGE" 52exit 53esac 54fi 55 56set_reflog_action() { 57if[-z"${GIT_REFLOG_ACTION:+set}"] 58then 59 GIT_REFLOG_ACTION="$*" 60export GIT_REFLOG_ACTION 61fi 62} 63 64git_editor() { 65:"${GIT_EDITOR:=$(git config core.editor)}" 66:"${GIT_EDITOR:=${VISUAL:-${EDITOR}}}" 67case"$GIT_EDITOR,$TERM"in 68,dumb) 69echo>&2"No editor specified in GIT_EDITOR, core.editor, VISUAL," 70echo>&2"or EDITOR. Tried to fall back to vi but terminal is dumb." 71echo>&2"Please set one of these variables to an appropriate" 72echo>&2"editor or run$0with options that will not cause an" 73echo>&2"editor to be invoked (e.g., -m or -F for git-commit)." 74exit1 75;; 76esac 77eval"${GIT_EDITOR:=vi}"'"$@"' 78} 79 80is_bare_repository () { 81 git rev-parse --is-bare-repository 82} 83 84cd_to_toplevel () { 85 cdup=$(git rev-parse --show-cdup) 86iftest!-z"$cdup" 87then 88case"$cdup"in 89/*) 90# Not quite the same as if we did "cd -P '$cdup'" when 91# $cdup contains ".." after symlink path components. 92# Don't fix that case at least until Git switches to 93# "cd -P" across the board. 94 phys="$cdup" 95;; 96 ..|../*|*/..|*/../*) 97# Interpret $cdup relative to the physical, not logical, cwd. 98# Probably /bin/pwd is more portable than passing -P to cd or pwd. 99 phys="$(/bin/pwd)/$cdup" 100;; 101*) 102# There's no "..", so no need to make things absolute. 103 phys="$cdup" 104;; 105esac 106 107cd"$phys"|| { 108echo>&2"Cannot chdir to$phys, the toplevel of the working tree" 109exit1 110} 111fi 112} 113 114require_work_tree () { 115test$(git rev-parse --is-inside-work-tree)= true || 116 die "fatal:$0cannot be used without a working tree." 117} 118 119get_author_ident_from_commit () { 120 pick_author_script=' 121 /^author /{ 122 s/'\''/'\''\\'\'\''/g 123 h 124 s/^author \([^<]*\) <[^>]*> .*$/\1/ 125 s/'\''/'\''\'\'\''/g 126 s/.*/GIT_AUTHOR_NAME='\''&'\''/p 127 128 g 129 s/^author [^<]* <\([^>]*\)> .*$/\1/ 130 s/'\''/'\''\'\'\''/g 131 s/.*/GIT_AUTHOR_EMAIL='\''&'\''/p 132 133 g 134 s/^author [^<]* <[^>]*> \(.*\)$/\1/ 135 s/'\''/'\''\'\'\''/g 136 s/.*/GIT_AUTHOR_DATE='\''&'\''/p 137 138 q 139} 140' 141 encoding=$(git config i18n.commitencoding || echo UTF-8) 142 git show -s --pretty=raw --encoding="$encoding" "$1" -- | 143 LANG=C LC_ALL=C sed -ne "$pick_author_script" 144} 145 146# Make sure we are in a valid repository of a vintage we understand, 147# if we require to be in a git repository. 148if test -z "$NONGIT_OK" 149then 150 GIT_DIR=$(git rev-parse --git-dir)|| exit 151 if [ -z "$SUBDIRECTORY_OK" ] 152 then 153 test -z "$(git rev-parse --show-cdup)" || { 154 exit=$? 155 echo >&2 "You need to run this command from the toplevel of the working tree." 156 exit$exit 157 } 158 fi 159 test -n "$GIT_DIR" && GIT_DIR=$(cd "$GIT_DIR" && pwd)|| { 160 echo >&2 "Unable to determine absolute path of git directory" 161 exit 1 162 } 163 :${GIT_OBJECT_DIRECTORY="$GIT_DIR/objects"} 164fi 165 166# Fix some commands on Windows 167case$(uname -s)in 168*MINGW*) 169 # Windows has its own (incompatible) sort and find 170 sort () { 171 /usr/bin/sort "$@" 172 } 173 find () { 174 /usr/bin/find "$@" 175 } 176 ;; 177esac