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. 12# But we protect ourselves from such a user mistake nevertheless. 13unset CDPATH 14 15# Similarly for IFS 16unset IFS 17 18git_broken_path_fix () { 19case":$PATH:"in 20*:$1:*) : ok ;; 21*) 22 PATH=$( 23 SANE_TOOL_PATH="$1" 24 IFS=: path= sep= 25set x $PATH 26shift 27for elem 28do 29case"$SANE_TOOL_PATH:$elem"in 30(?*:/bin | ?*:/usr/bin) 31 path="$path$sep$SANE_TOOL_PATH" 32 sep=: 33 SANE_TOOL_PATH= 34esac 35 path="$path$sep$elem" 36 sep=: 37done 38echo"$path" 39) 40;; 41esac 42} 43 44# @@BROKEN_PATH_FIX@@ 45 46die () { 47 die_with_status 1"$@" 48} 49 50die_with_status () { 51 status=$1 52shift 53echo>&2"$*" 54exit"$status" 55} 56 57GIT_QUIET= 58 59say () { 60iftest -z"$GIT_QUIET" 61then 62printf'%s\n'"$*" 63fi 64} 65 66iftest -n"$OPTIONS_SPEC";then 67 usage() { 68"$0"-h 69exit1 70} 71 72 parseopt_extra= 73[-n"$OPTIONS_KEEPDASHDASH"] && 74 parseopt_extra="--keep-dashdash" 75 76eval"$( 77 echo "$OPTIONS_SPEC" | 78 git rev-parse --parseopt$parseopt_extra-- "$@" || 79 echo exit $? 80 )" 81else 82 dashless=$(basename "$0" | sed -e 's/-/ /') 83 usage() { 84 die "Usage:$dashless$USAGE" 85} 86 87if[-z"$LONG_USAGE"] 88then 89 LONG_USAGE="Usage:$dashless$USAGE" 90else 91 LONG_USAGE="Usage:$dashless$USAGE 92 93$LONG_USAGE" 94fi 95 96case"$1"in 97-h) 98echo"$LONG_USAGE" 99exit 100esac 101fi 102 103set_reflog_action() { 104if[-z"${GIT_REFLOG_ACTION:+set}"] 105then 106 GIT_REFLOG_ACTION="$*" 107export GIT_REFLOG_ACTION 108fi 109} 110 111git_editor() { 112iftest -z"${GIT_EDITOR:+set}" 113then 114 GIT_EDITOR="$(git var GIT_EDITOR)"||return $? 115fi 116 117eval"$GIT_EDITOR"'"$@"' 118} 119 120git_pager() { 121iftest -t1 122then 123 GIT_PAGER=$(git var GIT_PAGER) 124else 125 GIT_PAGER=cat 126fi 127:${LESS=-FRSX} 128export LESS 129 130eval"$GIT_PAGER"'"$@"' 131} 132 133sane_grep () { 134 GREP_OPTIONS= LC_ALL=C grep"$@" 135} 136 137sane_egrep () { 138 GREP_OPTIONS= LC_ALL=C egrep"$@" 139} 140 141is_bare_repository () { 142 git rev-parse --is-bare-repository 143} 144 145cd_to_toplevel () { 146 cdup=$(git rev-parse --show-toplevel)&& 147cd"$cdup"|| { 148echo>&2"Cannot chdir to$cdup, the toplevel of the working tree" 149exit1 150} 151} 152 153require_work_tree_exists () { 154iftest"z$(git rev-parse --is-bare-repository)"!= zfalse 155then 156 die "fatal:$0cannot be used without a working tree." 157fi 158} 159 160require_work_tree () { 161test"$(git rev-parse --is-inside-work-tree 2>/dev/null)"= true || 162 die "fatal:$0cannot be used without a working tree." 163} 164 165require_clean_work_tree () { 166 git rev-parse --verify HEAD >/dev/null ||exit1 167 git update-index -q --ignore-submodules --refresh 168 err=0 169 170if! git diff-files --quiet --ignore-submodules 171then 172echo>&2"Cannot$1: You have unstaged changes." 173 err=1 174fi 175 176if! git diff-index --cached --quiet --ignore-submodules HEAD -- 177then 178if[$err=0] 179then 180echo>&2"Cannot$1: Your index contains uncommitted changes." 181else 182echo>&2"Additionally, your index contains uncommitted changes." 183fi 184 err=1 185fi 186 187if[$err=1] 188then 189test -n"$2"&&echo>&2"$2" 190exit1 191fi 192} 193 194# Generate a sed script to parse identities from a commit. 195# 196# Reads the commit from stdin, which should be in raw format (e.g., from 197# cat-file or "--pretty=raw"). 198# 199# The first argument specifies the ident line to parse (e.g., "author"), and 200# the second specifies the environment variable to put it in (e.g., "AUTHOR" 201# for "GIT_AUTHOR_*"). Multiple pairs can be given to parse author and 202# committer. 203pick_ident_script () { 204whiletest$#-gt0 205do 206 lid=$1;shift 207 uid=$1;shift 208printf'%s'" 209 /^$lid/{ 210 s/'/'\\\\''/g 211 h 212 s/^$lid"'\([^<]*\) <[^>]*> .*$/\1/'" 213 s/.*/GIT_${uid}_NAME='&'/p 214 215 g 216 s/^$lid"'[^<]* <\([^>]*\)> .*$/\1/'" 217 s/.*/GIT_${uid}_EMAIL='&'/p 218 219 g 220 s/^$lid"'[^<]* <[^>]*> \(.*\)$/@\1/'" 221 s/.*/GIT_${uid}_DATE='&'/p 222 } 223 " 224done 225echo'/^$/q' 226} 227 228# Create a pick-script as above and feed it to sed. Stdout is suitable for 229# feeding to eval. 230parse_ident_from_commit () { 231 LANG=C LC_ALL=C sed-ne"$(pick_ident_script "$@")" 232} 233 234# Parse the author from a commit given as an argument. Stdout is suitable for 235# feeding to eval to set the usual GIT_* ident variables. 236get_author_ident_from_commit () { 237 encoding=$(git config i18n.commitencoding || echo UTF-8) 238 git show -s --pretty=raw --encoding="$encoding""$1"--| 239 parse_ident_from_commit author AUTHOR 240} 241 242# Clear repo-local GIT_* environment variables. Useful when switching to 243# another repository (e.g. when entering a submodule). See also the env 244# list in git_connect() 245clear_local_git_env() { 246unset$(git rev-parse --local-env-vars) 247} 248 249 250# Platform specific tweaks to work around some commands 251case$(uname -s)in 252*MINGW*) 253# Windows has its own (incompatible) sort and find 254sort() { 255/usr/bin/sort"$@" 256} 257find() { 258/usr/bin/find"$@" 259} 260# git sees Windows-style pwd 261pwd() { 262builtin pwd -W 263} 264 is_absolute_path () { 265case"$1"in 266[/\\]* | [A-Za-z]:*) 267return0;; 268esac 269return1 270} 271;; 272*) 273 is_absolute_path () { 274case"$1"in 275/*) 276return0;; 277esac 278return1 279} 280esac 281 282# Make sure we are in a valid repository of a vintage we understand, 283# if we require to be in a git repository. 284iftest -z"$NONGIT_OK" 285then 286 GIT_DIR=$(git rev-parse --git-dir)||exit 287if[-z"$SUBDIRECTORY_OK"] 288then 289test -z"$(git rev-parse --show-cdup)"|| { 290exit=$? 291echo>&2"You need to run this command from the toplevel of the working tree." 292exit$exit 293} 294fi 295test -n"$GIT_DIR"&& GIT_DIR=$(cd "$GIT_DIR" && pwd)|| { 296echo>&2"Unable to determine absolute path of git directory" 297exit1 298} 299:${GIT_OBJECT_DIRECTORY="$GIT_DIR/objects"} 300fi