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