merge: handle --verify-signatures for unborn branch

When git-merge sees that we are on an unborn branch (i.e., there is no HEAD), it follows a totally separate code path than the usual merge logic. This code path does not know about verify_signatures, and so we fail to notice bad or missing signatures. This has been broken since --verify-signatures was added in efed002249 (merge/pull: verify GPG signatures of commits being merged, 2013-03-31). In an ideal world, we'd unify the flow for this case with the regular merge logic, which would fix this bug and avoid introducing similar ones. But because the unborn case is so different, it would be a burden on the rest of the function to continually handle the missing HEAD. So let's just port the verification check to this special case. Reported-by: Felix Eckhofer <felix@eckhofer.com> Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Jeff King committed Nov 6, 2018 at 02:51 UTC 7488ba3eeaaaeb8c0e06cca12384f9f7f76082b5
2 files changed +11
builtin/merge.c
+4
@@ -1334,6 +1334,10 @@ int cmd_merge(int argc, const char **argv, const char *prefix)
1334 die(_("%s - not something we can merge"), argv[0]);
1335 if (remoteheads->next)
1336 die(_("Can merge only exactly one commit into empty head"));
1337 +
1338 + if (verify_signatures)
1339 + verify_merge_signature(remoteheads->item, verbosity);
1340 +
1341 remote_head_oid = &remoteheads->item->object.oid;
1342 read_empty(remote_head_oid, 0);
1343 update_ref("initial pull", "HEAD", remote_head_oid, NULL, 0,
t/t7612-merge-verify-signatures.sh
+7
@@ -103,4 +103,11 @@ test_expect_success GPG 'merge commit with bad signature with merge.verifySignat
103 git merge --no-verify-signatures $(cat forged.commit)
104 '
105
106 +test_expect_success GPG 'merge unsigned commit into unborn branch' '
107 + test_when_finished "git checkout initial" &&
108 + git checkout --orphan unborn &&
109 + test_must_fail git merge --verify-signatures side-unsigned 2>mergeerror &&
110 + test_i18ngrep "does not have a GPG signature" mergeerror
111 +'
112 +
113 test_done