git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH 2/3] merge-tree: show the original file names in the conflict output

From
Johannes Schindelin via GitGitGadget <gitgitgadget@gmail.com>
Date
Aug 19, 2022, 06:57 UTC
Message-ID
<3aa390f3007f7f15e780bc9b36159846104be32e.1660892256.git.gitgitgadget@gmail.com>
In-Reply-To
<pull.1327.git.1660892256.gitgitgadget@gmail.com>
From: Johannes Schindelin <johannes.schindelin@gmx.de>

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@gmx.de>
---
 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
Previous: Elijah NewrenNext: Johannes Schindelin via GitGitGadget
Message 11 of 12 in “Show original filenames in merge tree”
  1. 0/3 Show original filenames in merge treeJohannes Schindelin via GitGitGadget, Aug 19, 2022
  2. 1/3 merge-tree -z: always show the original file name firstJohannes Schindelin via GitGitGadget, Aug 19, 2022
  3. Johannes SchindelinAug 19, 2022
  4. Elijah NewrenAug 20, 2022
  5. Elijah NewrenAug 20, 2022
  6. Elijah NewrenAug 21, 2022
  7. Johannes SchindelinAug 22, 2022
  8. Elijah NewrenAug 23, 2022
  9. Johannes SchindelinAug 26, 2022
  10. Elijah NewrenAug 30, 2022
  11. 2/3 merge-tree: show the original file names in the conflict outputJohannes Schindelin via GitGitGadget, Aug 19, 2022
  12. 3/3 t4301: add a test case involving a rename, type change & modificationJohannes Schindelin via GitGitGadget, Aug 19, 2022

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.