Do not strip out "-- >8 --" comment in commit-msg hook
When commiting with "git commit --cleanup=scissors" or "git commit --verbose", Git includes the following lines in the commit message template, with additional information that should not go in the commit message after it: # ------------------------ >8 ------------------------ # Do not modify or remove the line above. # Everything below it will be ignored. In I78b50a789860cc11d63d891b0507786890158754 (Handle messages with only comments in the commit-msg hook, 2018-12-18), we started stripping comments from the proposed commit message in order to determine whether it is empty and as an accidental side effect we lost this line. As a result, Git includes the supporting information (e.g., the diff) in the commit message. Fortunately we only needed to strip out comments in order to check for emptiness. Afterward, the hook invokes "git interpret-trailers", which is prepared to cope with comments and scissor lines in front of a diff in recent versions of Git[*]. Fix the hook to work in scissors mode by using the stripped commit message only for the emptiness check and going back to the unstripped message for subsequent steps. This way, users can run "git commit -v" without having the diff end up in the resulting commit message. Users with older versions of Git will not benefit from this fix, but it does not produce a regression there, either: "git commit" in cleanup modes other than scissors continues to work as expected. In other words, in all cases this works as well as before I78b50a78986. [*] v2.13.1~16^2 (interpret-trailers: honor the cut line, 2017-05-15) Bug: Issue 10346 Change-Id: I633e5db4643851376422f839d969094043abb5c5
This commit is contained in:
parent
296772f362
commit
731eb42b8a
@ -11,6 +11,11 @@ function fail {
|
||||
exit 1
|
||||
}
|
||||
|
||||
function prereq_modern_git {
|
||||
# "git interpret-trailers --where" was introduced in Git 2.15.0.
|
||||
git interpret-trailers -h 2>&1 | grep -e --where > /dev/null
|
||||
}
|
||||
|
||||
function test_nonexistent_argument {
|
||||
rm -f input
|
||||
if ${hook} input ; then
|
||||
@ -38,6 +43,38 @@ EOF
|
||||
fi
|
||||
}
|
||||
|
||||
function test_keep_cutoff_line {
|
||||
if ! prereq_modern_git ; then
|
||||
echo "old version of Git detected; skipping scissors test."
|
||||
return 0
|
||||
fi
|
||||
rm -f input
|
||||
cat << EOF > input
|
||||
Do something nice
|
||||
|
||||
# Please enter the commit message for your changes.
|
||||
# ------------------------ >8 ------------------------
|
||||
# Do not modify or remove the line above.
|
||||
# Everything below it will be ignored.
|
||||
diff --git a/file.txt b/file.txt
|
||||
index 625fd613d9..03aeba3b21 100755
|
||||
--- a/file.txt
|
||||
+++ b/file.txt
|
||||
@@ -38,6 +38,7 @@
|
||||
context
|
||||
line
|
||||
|
||||
+hello, world
|
||||
|
||||
context
|
||||
line
|
||||
EOF
|
||||
${hook} input || fail "failed hook execution"
|
||||
grep '>8' input || fail "lost cut-off line"
|
||||
sed -n -e '1,/>8/ p' input >top
|
||||
grep '^Change-Id' top || fail "missing Change-Id above cut-off line"
|
||||
}
|
||||
|
||||
# a Change-Id already set is preserved.
|
||||
function test_preserve_changeid {
|
||||
cat << EOF > input
|
||||
|
@ -43,11 +43,6 @@ if test ! -s "${dest}" ; then
|
||||
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
|
||||
if ! git -c trailer.ifexists=doNothing interpret-trailers \
|
||||
|
Loading…
x
Reference in New Issue
Block a user