revision: ensure MERGE_HEAD is a ref in prepare_show_merge

This is done to (1) ensure MERGE_HEAD is a ref, (2) obtain the oid without any prefixing by refs.c:repo_dwim_ref() (3) error out when MERGE_HEAD is a symref. Helped-by: Junio C Hamano <gitster@pobox.com> Signed-off-by: Michael Lohmann <mi.al.lohmann@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com> Signed-off-by: Philippe Blain <levraiphilippeblain@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Michael Lohmann committed Feb 28, 2024 at 08:54 UTC f476143ee6c8a58f41c569e4a637bc441b1e6f4a
1 file changed +5 -1
revision.c
+5 -1
@@ -1973,8 +1973,12 @@ static void prepare_show_merge(struct rev_info *revs)
1973 if (repo_get_oid(the_repository, "HEAD", &oid))
1974 die("--merge without HEAD?");
1975 head = lookup_commit_or_die(&oid, "HEAD");
1976 - if (repo_get_oid(the_repository, "MERGE_HEAD", &oid))
1976 + if (read_ref_full("MERGE_HEAD",
1977 + RESOLVE_REF_READING | RESOLVE_REF_NO_RECURSE,
1978 + &oid, NULL))
1979 die("--merge without MERGE_HEAD?");
1980 + if (is_null_oid(&oid))
1981 + die(_("MERGE_HEAD exists but is a symbolic ref"));
1982 other = lookup_commit_or_die(&oid, "MERGE_HEAD");
1983 add_pending_object(revs, &head->object, "HEAD");
1984 add_pending_object(revs, &other->object, "MERGE_HEAD");