Fix duplicate Change-Id addition when non-colon tags are present
When non-colon tags such as TAG=agy or CONV=... are present in the
commit message, git interpret-trailers --parse fails to parse trailers.
As a result, commit-msg would incorrectly assume no Change-Id tag was
present and append a duplicate Change-Id tag.
Fix this by allowing both ':' and '=' separators in the trailer.
Bug: 540011387
Test: Ran commit-msg hook test cases with and without Change-Id and TAG/CONV lines
Test: bazel test --test_filter=com.google.gerrit.acceptance.server.git.receive.ReceiveCommitsChangeIdValidationIT \
//javatests/com/google/gerrit/acceptance/server/git/receive:receive
Release-Notes: Fix duplicate Change-Id addition when non-colon tags are present
Change-Id: Ie80bd76e7c431d01032316bb69e8c6e15a920c34
diff --git a/javatests/com/google/gerrit/acceptance/server/git/receive/ReceiveCommitsChangeIdValidationIT.java b/javatests/com/google/gerrit/acceptance/server/git/receive/ReceiveCommitsChangeIdValidationIT.java
index 6945329..1fc0ebf 100644
--- a/javatests/com/google/gerrit/acceptance/server/git/receive/ReceiveCommitsChangeIdValidationIT.java
+++ b/javatests/com/google/gerrit/acceptance/server/git/receive/ReceiveCommitsChangeIdValidationIT.java
@@ -96,6 +96,22 @@
assertThat(pushResult.getMessage()).matches(missingChangeIdRegex);
}
+ @Test
+ public void pushWithNonColonTagsInFooter_changeIdAccepted() throws Exception {
+ RevCommit parent = createParentCommit();
+ String changeId = "I0000000000000000000000000000000000000012";
+
+ pushFactory
+ .create(
+ admin.newIdent(),
+ testRepo,
+ "Subject line\n\nTAG=agy\nCONV=123\nChange-Id: " + changeId,
+ ImmutableMap.of("foo.txt", "content"))
+ .setParent(parent)
+ .to("refs/for/master")
+ .assertOkStatus();
+ }
+
@CanIgnoreReturnValue
private RevCommit createParentCommit() throws Exception {
RevCommit parent = commitBuilder().add("f.txt", "content").message("base commit").create();
diff --git a/resources/com/google/gerrit/server/commit-msg_test.sh b/resources/com/google/gerrit/server/commit-msg_test.sh
index adea3c8..361b908 100755
--- a/resources/com/google/gerrit/server/commit-msg_test.sh
+++ b/resources/com/google/gerrit/server/commit-msg_test.sh
@@ -131,6 +131,27 @@
fi
}
+function test_preserve_changeid_with_non_colon_tags {
+ cat << EOF > input
+bla bla
+
+TAG=agy
+CONV=123
+Change-Id: I123
+EOF
+
+ ${hook} input || fail "failed hook execution"
+
+ found=$(grep -c '^Change-Id' input) || :
+ if [[ "${found}" != "1" ]]; then
+ fail "got ${found} Change-Ids, want 1"
+ fi
+ found=$(grep -c '^Change-Id: I123' input) || :
+ if [[ "${found}" != "1" ]]; then
+ fail "got ${found} Change-Id: I123, want 1"
+ fi
+}
+
# Change-Id should not be inserted if gerrit.createChangeId=false
function test_suppress_changeid {
cat << EOF > input
diff --git a/resources/com/google/gerrit/server/tools/root/hooks/commit-msg b/resources/com/google/gerrit/server/tools/root/hooks/commit-msg
index bea4904..4e7a49b 100755
--- a/resources/com/google/gerrit/server/tools/root/hooks/commit-msg
+++ b/resources/com/google/gerrit/server/tools/root/hooks/commit-msg
@@ -77,7 +77,7 @@
pattern=".*"
fi
-if git interpret-trailers --no-divider --parse < "$1" | grep -q "^$token: $pattern$" ; then
+if git -c 'trailer.separators=:=' interpret-trailers --no-divider --parse < "$1" | grep -q "^$token: $pattern$" ; then
exit 0
fi