From: Johannes Schindelin <johannes.schindelin@xxxxxx> When showing the conflict output in an `ls-files -u`-style form, it makes sense to show conflicted files' names in the form that they were written on disk (for example, in case of a file/directory conflict, we would have written the file under a different name by appending a `~<branch>` suffix). However, when the intention is to perform a worktree-less merge, this makes less sense, and causes more confusion than is necessary. Let's show the original file names instead. This patch also fixes a bug where the output of conflicts involving a rename did not always show the correct file name for the respective stages. Signed-off-by: Johannes Schindelin <johannes.schindelin@xxxxxx> --- builtin/merge-tree.c | 2 +- merge-ort.c | 2 +- merge-ort.h | 1 + t/t4301-merge-tree-write-tree.sh | 18 +++++++++--------- 4 files changed, 12 insertions(+), 11 deletions(-) diff --git a/builtin/merge-tree.c b/builtin/merge-tree.c index ae5782917b9..8cd9ce399aa 100644 --- a/builtin/merge-tree.c +++ b/builtin/merge-tree.c @@ -454,8 +454,8 @@ static int real_merge(struct merge_tree_options *o, merge_get_conflicted_files(&result, &conflicted_files); for (i = 0; i < conflicted_files.nr; i++) { - const char *name = conflicted_files.items[i].string; struct stage_info *c = conflicted_files.items[i].util; + const char *name = c->path; if (!o->name_only) printf("%06o %s %d\t", c->mode, oid_to_hex(&c->oid), c->stage); diff --git a/merge-ort.c b/merge-ort.c index 211f6823e1d..ed72d2e338e 100644 --- a/merge-ort.c +++ b/merge-ort.c @@ -4488,7 +4488,7 @@ void merge_get_conflicted_files(struct merge_result *result, if (!(ci->filemask & (1ul << i))) continue; - si = xmalloc(sizeof(*si)); + FLEX_ALLOC_STR(si, path, ci->pathnames[i]); si->stage = i+1; si->mode = ci->stages[i].mode; oidcpy(&si->oid, &ci->stages[i].oid); diff --git a/merge-ort.h b/merge-ort.h index a994c9a5fcd..595031fbab9 100644 --- a/merge-ort.h +++ b/merge-ort.h @@ -94,6 +94,7 @@ struct stage_info { struct object_id oid; int mode; int stage; + const char path[FLEX_ARRAY]; }; /* diff --git a/t/t4301-merge-tree-write-tree.sh b/t/t4301-merge-tree-write-tree.sh index e0ef9724b2b..e08452a8531 100755 --- a/t/t4301-merge-tree-write-tree.sh +++ b/t/t4301-merge-tree-write-tree.sh @@ -125,7 +125,7 @@ test_expect_success 'test conflict notices and such' ' cat <<-EOF >expect && HASH greeting - whatever~side1 + whatever Auto-merging greeting CONFLICT (content): Merge conflict in greeting @@ -153,7 +153,7 @@ test_expect_success 'Just the conflicted files without the messages' ' test_expect_code 1 git merge-tree --write-tree --no-messages --name-only side1 side2 >out && anonymize_hash out >actual && - test_write_lines HASH greeting whatever~side1 >expect && + test_write_lines HASH greeting whatever >expect && test_cmp expect actual ' @@ -168,14 +168,14 @@ test_expect_success 'Check conflicted oids and modes without messages' ' 100644 HASH 1Qgreeting 100644 HASH 2Qgreeting 100644 HASH 3Qgreeting - 100644 HASH 1Qwhatever~side1 - 100644 HASH 2Qwhatever~side1 + 100644 HASH 1Qwhatever + 100644 HASH 2Qwhatever EOF test_cmp expect actual && # Check the actual hashes against the `ls-files -u` output too - tail -n +2 out | sed -e s/side1/HEAD/ >actual && + tail -n +2 out | sed -e s/whatever/whatever~HEAD/ >actual && test_cmp conflicted-file-info actual ' @@ -200,11 +200,11 @@ test_expect_success 'NUL terminated conflicted file "lines"' ' 100644 HASH 1Qgreeting 100644 HASH 2Qgreeting 100644 HASH 3Qgreeting - 100644 HASH 1Qwhatever~tweak1 - 100644 HASH 2Qwhatever~tweak1 - 100644 HASH 1QΑυτά μου φαίνονται κινέζικα + 100644 HASH 1Qwhatever + 100644 HASH 2Qwhatever + 100644 HASH 1Qnumbers 100644 HASH 2QΑυτά μου φαίνονται κινέζικα - 100644 HASH 3QΑυτά μου φαίνονται κινέζικα + 100644 HASH 3Qnumbers EOF -- gitgitgadget