merge-recursive: enforce opt->ancestor != NULL when calling merge_trees()

We always want our conflict hunks to be labelled so that users can know where each came from. The previous commit fixed the one caller in the codebase which was not setting opt->ancestor (and thus not providing a label for the "merge base" conflict hunk in diff3-style conflict markers); add an assertion to prevent future codepaths from also overlooking this requirement. Enforcing this requirement also allows us to simplify the code for labelling the conflict hunks by no longer checking if the ancestor label is NULL. Signed-off-by: Elijah Newren <newren@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Elijah Newren committed Aug 15, 2019 at 14:40 UTC 139ef37a2f4daf2071debeca8b2115b4e4b0a33f
1 file changed +9 -10
merge-recursive.c
+9 -10
@@ -1019,7 +1019,7 @@ static int merge_3way(struct merge_options *opt,
1019 {
1020 mmfile_t orig, src1, src2;
1021 struct ll_merge_options ll_opts = {0};
1022 - char *base_name, *name1, *name2;
1022 + char *base, *name1, *name2;
1023 int merge_status;
1024
1025 ll_opts.renormalize = opt->renormalize;
@@ -1043,16 +1043,13 @@ static int merge_3way(struct merge_options *opt,
1043 }
1044 }
1045
1046 - assert(a->path && b->path && o->path);
1047 - if (strcmp(a->path, b->path) ||
1048 - (opt->ancestor != NULL && strcmp(a->path, o->path) != 0)) {
1049 - base_name = opt->ancestor == NULL ? NULL :
1050 - mkpathdup("%s:%s", opt->ancestor, o->path);
1046 + assert(a->path && b->path && o->path && opt->ancestor);
1047 + if (strcmp(a->path, b->path) || strcmp(a->path, o->path) != 0) {
1048 + base = mkpathdup("%s:%s", opt->ancestor, o->path);
1049 name1 = mkpathdup("%s:%s", branch1, a->path);
1050 name2 = mkpathdup("%s:%s", branch2, b->path);
1051 } else {
1054 - base_name = opt->ancestor == NULL ? NULL :
1055 - mkpathdup("%s", opt->ancestor);
1052 + base = mkpathdup("%s", opt->ancestor);
1053 name1 = mkpathdup("%s", branch1);
1054 name2 = mkpathdup("%s", branch2);
1055 }
@@ -1061,11 +1058,11 @@ static int merge_3way(struct merge_options *opt,
1058 read_mmblob(&src1, &a->oid);
1059 read_mmblob(&src2, &b->oid);
1060
1064 - merge_status = ll_merge(result_buf, a->path, &orig, base_name,
1061 + merge_status = ll_merge(result_buf, a->path, &orig, base,
1062 &src1, name1, &src2, name2,
1063 opt->repo->index, &ll_opts);
1064
1068 - free(base_name);
1065 + free(base);
1066 free(name1);
1067 free(name2);
1068 free(orig.ptr);
@@ -3390,6 +3387,8 @@ int merge_trees(struct merge_options *opt,
3387 int code, clean;
3388 struct strbuf sb = STRBUF_INIT;
3389
3390 + assert(opt->ancestor != NULL);
3391 +
3392 if (!opt->call_depth && repo_index_has_changes(opt->repo, head, &sb)) {
3393 err(opt, _("Your local changes to the following files would be overwritten by merge:\n %s"),
3394 sb.buf);