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

[PATCH] merge-tree: fix "same file added in subdir"

From
John Keeping <john@keeping.me.uk>
Date
Mar 27, 2013, 21:34 UTC
Message-ID
<0a6a0c978569906b8c8d9209a85338554e503236.1364419952.git.john@keeping.me.uk>

When the same file is added with identical content at the top level, git-merge-tree prints "added in both" with the details. But if the file is added in an existing subdirectory, threeway_callback() bails out early because the two trees have been modified identically.

In order to detect this, we need to fall through and recurse into the subtree in this case.

Signed-off-by: John Keeping <john@keeping.me.uk>
---
 builtin/merge-tree.c  |  9 +++++++--
 t/t4300-merge-tree.sh | 17 +++++++++++++++++
 2 files changed, 24 insertions(+), 2 deletions(-)
diff --git a/builtin/merge-tree.c b/builtin/merge-tree.c
index e0d0b7d..ca97fbd 100644
--- a/builtin/merge-tree.c
+++ b/builtin/merge-tree.c
@@ -298,12 +298,17 @@ static int threeway_callback(int n, unsigned long mask, unsigned long dirmask, s
 {
 	/* Same in both? */
 	if (same_entry(entry+1, entry+2)) {
-		if (entry[0].sha1) {
+		if (entry[0].sha1 && !S_ISDIR(entry[0].mode)) {
 			/* Modified identically */
 			resolve(info, NULL, entry+1);
 			return mask;
 		}
-		/* "Both added the same" is left unresolved */
+		/*
+		 * "Both added the same" is left unresolved.  We also leave
+		 * "Both directories modified identically" unresolved in
+		 * order to catch changes where the same file (with the same
+		 * content) has been added to both directories.
+		 */
 	}
 
 	if (same_entry(entry+0, entry+1)) {
diff --git a/t/t4300-merge-tree.sh b/t/t4300-merge-tree.sh
index d0b2a45..be0737e 100755
--- a/t/t4300-merge-tree.sh
+++ b/t/t4300-merge-tree.sh
@@ -298,4 +298,21 @@ test_expect_success 'turn tree to file' '
 	test_cmp expect actual
 '
 
+test_expect_success 'add identical files to subdir' '
+	cat >expected <<\EXPECTED &&
+added in both
+  our    100644 43d5a8ed6ef6c00ff775008633f95787d088285d sub/ONE
+  their  100644 43d5a8ed6ef6c00ff775008633f95787d088285d sub/ONE
+EXPECTED
+
+	git reset --hard initial &&
+	mkdir sub &&
+	test_commit "sub-initial" "sub/initial" "initial" &&
+	test_commit "sub-add-a-b-same-A" "sub/ONE" "AAA" &&
+	git reset --hard sub-initial &&
+	test_commit "sub-add-a-b-same-B" "sub/ONE" "AAA" &&
+	git merge-tree sub-initial sub-add-a-b-same-A sub-add-a-b-same-B >actual &&
+	test_cmp expected actual
+'
+
 test_done
-- 
1.8.2.411.g65a544e
Next: Junio C Hamano
Message 1 of 8 in “merge-tree: fix "same file added in subdir"”
  1. merge-tree: fix "same file added in subdir"John Keeping, Mar 27, 2013
  2. Junio C HamanoMar 27, 2013
  3. John KeepingMar 27, 2013
  4. John KeepingMar 28, 2013
  5. Junio C HamanoApr 7, 2013
  6. merge-tree: don't print entries that match "local"John Keeping, Apr 7, 2013
  7. René ScharfeApr 27, 2013
  8. John KeepingApr 27, 2013

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.