Handle messages with only comments in the commit-msg hook

Commit messages with comments occur when the editor is aborted, and
should be treated as empty.

We do this using git-stripspace, which was introduced in 2005, so this
has no compatibility implications.

Change-Id: I78b50a789860cc11d63d891b0507786890158754
This commit is contained in:
Han-Wen Nienhuys 2018-12-18 12:56:36 +01:00
parent 572f4e3804
commit 627d07c2bf
2 changed files with 40 additions and 9 deletions

View File

@ -26,6 +26,18 @@ function test_empty {
fi
}
function test_empty_with_comments {
rm -f input
cat << EOF > input
# comment
# comment2
EOF
if ${hook} input ; then
fail "must fail on empty message"
fi
}
# a Change-Id already set is preserved.
function test_preserve_changeid {
cat << EOF > input
@ -113,7 +125,7 @@ EOF
# Test driver.
git init
for func in $( declare -F | awk '{print $3;}' | sort); do
case ${func} in
test_*)

View File

@ -27,17 +27,36 @@ if test ! -f "$1" ; then
exit 1
fi
if test ! -s "$1" ; then
echo "file is empty: $1"
exit 1
fi
# $RANDOM will be undefined if not using bash, so don't use set -u
random=$( (whoami ; hostname ; date; cat $1 ; echo $RANDOM) | git hash-object --stdin)
dest="$1.tmp.${random}"
trap 'rm -f "${dest}"' EXIT
if ! git stripspace --strip-comments < "$1" > "${dest}" ; then
echo "cannot strip comments from $1"
exit 1
fi
if test ! -s "${dest}" ; then
echo "file is empty: $1"
exit 1
fi
if ! mv "${dest}" "$1" ; then
echo "cannot mv ${dest} to $1"
exit 1
fi
# Avoid the --in-place option which only appeared in Git 2.8
# Avoid the --if-exists option which only appeared in Git 2.15
cat "$1" \
| git -c trailer.ifexists=doNothing interpret-trailers --trailer "Change-Id: I${random}" > "${dest}" \
&& mv "${dest}" "$1"
if ! git -c trailer.ifexists=doNothing interpret-trailers \
--trailer "Change-Id: I${random}" < "$1" > "${dest}" ; then
echo "cannot insert change-id line in $1"
exit 1
fi
if ! mv "${dest}" "$1" ; then
echo "cannot mv ${dest} to $1"
exit 1
fi