git-commit.sh 5.2 KB
Newer Older
L
Linus Torvalds 已提交
1
#!/bin/sh
2 3 4 5
#
# Copyright (c) 2005 Linus Torvalds
#

J
Junio C Hamano 已提交
6
. git-sh-setup || die "Not a git archive"
7

8
usage () {
9
	die 'git commit [-a] [-v | --no-verify]  [-m <message>] [-F <logfile>] [(-C|-c) <commit>] [<path>...]'
10 11
}

12
all= logfile= use_commit= no_edit= log_given= log_message= verify=t signoff=
13
while case "$#" in 0) break;; esac
14
do
15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
  case "$1" in
  -a|--a|--al|--all)
    all=t
    shift ;;
  -F=*|--f=*|--fi=*|--fil=*|--file=*)
    log_given=t$log_given
    logfile=`expr "$1" : '-[^=]*=\(.*\)'`
    no_edit=t
    shift ;;
  -F|--f|--fi|--fil|--file)
    case "$#" in 1) usage ;; esac; shift
    log_given=t$log_given
    logfile="$1"
    no_edit=t
    shift ;;
  -m=*|--m=*|--me=*|--mes=*|--mess=*|--messa=*|--messag=*|--message=*)
    log_given=t$log_given
    log_message=`expr "$1" : '-[^=]*=\(.*\)'`
    no_edit=t
    shift ;;
  -m|--m|--me|--mes|--mess|--messa|--messag|--message)
    case "$#" in 1) usage ;; esac; shift
    log_given=t$log_given
    log_message="$1"
    no_edit=t
    shift ;;
  -c=*|--ree=*|--reed=*|--reedi=*|--reedit=*|--reedit-=*|--reedit-m=*|\
  --reedit-me=*|--reedit-mes=*|--reedit-mess=*|--reedit-messa=*|\
  --reedit-messag=*|--reedit-message=*)
    log_given=t$log_given
    use_commit=`expr "$1" : '-[^=]*=\(.*\)'`
    shift ;;
  -c|--ree|--reed|--reedi|--reedit|--reedit-|--reedit-m|--reedit-me|\
  --reedit-mes|--reedit-mess|--reedit-messa|--reedit-messag|--reedit-message)
    case "$#" in 1) usage ;; esac; shift
    log_given=t$log_given
    use_commit="$1"
    shift ;;
  -C=*|--reu=*|--reus=*|--reuse=*|--reuse-=*|--reuse-m=*|--reuse-me=*|\
  --reuse-mes=*|--reuse-mess=*|--reuse-messa=*|--reuse-messag=*|\
  --reuse-message=*)
    log_given=t$log_given
    use_commit=`expr "$1" : '-[^=]*=\(.*\)'`
    no_edit=t
    shift ;;
  -C|--reu|--reus|--reuse|--reuse-|--reuse-m|--reuse-me|--reuse-mes|\
  --reuse-mess|--reuse-messa|--reuse-messag|--reuse-message)
    case "$#" in 1) usage ;; esac; shift
    log_given=t$log_given
    use_commit="$1"
    no_edit=t
    shift ;;
67 68 69
  -e|--e|--ed|--edi|--edit)
    no_edit=
    shift ;;
70 71 72
  -s|--s|--si|--sig|--sign|--signo|--signof|--signoff)
    signoff=t
    shift ;;
73 74 75
  -n|--n|--no|--no-|--no-v|--no-ve|--no-ver|--no-veri|--no-verif|--no-verify)
    verify=
    shift ;;
76 77 78
  -v|--v|--ve|--ver|--veri|--verif|--verify)
    verify=t
    shift ;;
79
  --)
80
    shift
81 82 83 84 85 86
    break ;;
  -*)
     usage ;;
  *)
    break ;;
  esac
87 88
done

89 90 91 92 93
case "$log_given" in
tt*)
  die "Only one of -c/-C/-F/-m can be used." ;;
esac

J
Junio C Hamano 已提交
94 95
case "$all,$#" in
t,*)
96
	git-diff-files --name-only -z |
97
	git-update-index --remove -z --stdin
98
	;;
J
Junio C Hamano 已提交
99 100
,0)
	;;
101 102
*)
	git-diff-files --name-only -z "$@" |
103
	git-update-index --remove -z --stdin
104 105
	;;
esac || exit 1
J
Junio C Hamano 已提交
106
git-update-index -q --refresh || exit 1
107

108 109
case "$verify" in
t)
110 111 112 113
	if test -x "$GIT_DIR"/hooks/pre-commit
	then
		"$GIT_DIR"/hooks/pre-commit || exit
	fi
114 115
esac

116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
if test "$log_message" != ''
then
	echo "$log_message"
elif test "$logfile" != ""
then
	if test "$logfile" = -
	then
		test -t 0 &&
		echo >&2 "(reading log message from standard input)"
		cat
	else
		cat <"$logfile"
	fi
elif test "$use_commit" != ""
then
	git-cat-file commit "$use_commit" | sed -e '1,/^$/d'
132 133 134 135 136 137 138 139 140 141 142 143
fi | git-stripspace >.editmsg

case "$signoff" in
t)
	git-var GIT_COMMITTER_IDENT | sed -e '
		s/>.*/>/
		s/^/Signed-off-by: /
	' >>.editmsg
	;;
esac

if [ -f "$GIT_DIR/MERGE_HEAD" ]; then
144 145 146

	test -f "$GIT_DIR/MERGE_MSG" && cat "$GIT_DIR/MERGE_MSG"

147 148 149 150 151 152 153
	echo "#"
	echo "# It looks like your may be committing a MERGE."
	echo "# If this is not correct, please remove the file"
	echo "#	$GIT_DIR/MERGE_HEAD"
	echo "# and try again"
	echo "#"
fi >>.editmsg
154

155
PARENTS="-p HEAD"
156
if [ ! -r "$GIT_DIR/HEAD" ]; then
157 158 159 160 161
	if [ -z "$(git-ls-files)" ]; then
		echo Nothing to commit 1>&2
		exit 1
	fi
	PARENTS=""
J
Junio C Hamano 已提交
162
	current=
163
else
J
Junio C Hamano 已提交
164
	current=$(git-rev-parse --verify HEAD)
165
	if [ -f "$GIT_DIR/MERGE_HEAD" ]; then
J
Junio C Hamano 已提交
166
		PARENTS="-p HEAD "`sed -e 's/^/-p /' "$GIT_DIR/MERGE_HEAD"`
167 168
	fi
	if test "$use_commit" != ""
169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195
	then
		pick_author_script='
		/^author /{
			h
			s/^author \([^<]*\) <[^>]*> .*$/\1/
			s/'\''/'\''\'\'\''/g
			s/.*/GIT_AUTHOR_NAME='\''&'\''/p

			g
			s/^author [^<]* <\([^>]*\)> .*$/\1/
			s/'\''/'\''\'\'\''/g
			s/.*/GIT_AUTHOR_EMAIL='\''&'\''/p

			g
			s/^author [^<]* <[^>]*> \(.*\)$/\1/
			s/'\''/'\''\'\'\''/g
			s/.*/GIT_AUTHOR_DATE='\''&'\''/p

			q
		}
		'
		set_author_env=`git-cat-file commit "$use_commit" |
		sed -ne "$pick_author_script"`
		eval "$set_author_env"
		export GIT_AUTHOR_NAME
		export GIT_AUTHOR_EMAIL
		export GIT_AUTHOR_DATE
196
	fi
197
fi
J
Junio C Hamano 已提交
198
git-status >>.editmsg
199
if [ "$?" != "0" -a ! -f $GIT_DIR/MERGE_HEAD ]
L
Linus Torvalds 已提交
200
then
201
	rm -f .editmsg
J
Junio C Hamano 已提交
202
	git-status
L
Linus Torvalds 已提交
203 204
	exit 1
fi
205
case "$no_edit" in
206 207 208 209
'')
	${VISUAL:-${EDITOR:-vi}} .editmsg
	;;
esac
210 211 212 213 214 215 216 217 218

case "$verify" in
t)
	if test -x "$GIT_DIR"/hooks/commit-msg
	then
		"$GIT_DIR"/hooks/commit-msg .editmsg || exit
	fi
esac

L
Linus Torvalds 已提交
219
grep -v '^#' < .editmsg | git-stripspace > .cmitmsg
220 221
grep -v -i '^Signed-off-by' .cmitmsg >.cmitchk
if test -s .cmitchk
222
then
223 224
	tree=$(git-write-tree) &&
	commit=$(cat .cmitmsg | git-commit-tree $tree $PARENTS) &&
J
Junio C Hamano 已提交
225
	git-update-ref HEAD $commit $current &&
226
	rm -f -- "$GIT_DIR/MERGE_HEAD"
227 228 229 230
else
	echo >&2 "* no commit message?  aborting commit."
	false
fi
231
ret="$?"
232
rm -f .cmitmsg .editmsg .cmitchk
233 234 235 236 237

if test -x "$GIT_DIR"/hooks/post-commit && test "$ret" = 0
then
	"$GIT_DIR"/hooks/post-commit
fi
238
exit "$ret"