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

[PATCH 4/5] merge_recursive: Fix renames across paths below D/F conflicts

From
newren@gmail.com <newren@gmail.com>
Date
Jun 29, 2010, 01:12 UTC
Message-ID
<1277773936-12412-5-git-send-email-newren@gmail.com>
In-Reply-To
<1277773936-12412-1-git-send-email-newren@gmail.com>
From: Elijah Newren <newren@gmail.com>
Signed-off-by: Elijah Newren <newren@gmail.com>
---
I'm a little uneasy with this change, mainly because I don't fully
understand the rename processing logic (I was actually kind of surprised
when I made these changes and it worked).  Although I verified that
these changes (and my others in this patch series) introduce no new
breakages in the testsuite and even fix a known issue, I'm still not
quite sure I follow the logic well enough to feel fully confident in
this change.  I'm particularly worried I may have neglected some closely
related cases that I should have fixed but which may still be broken.
 merge-recursive.c   |   13 +++++++++++--
 t/t6020-merge-df.sh |    4 ++--
 2 files changed, 13 insertions(+), 4 deletions(-)
diff --git a/merge-recursive.c b/merge-recursive.c
index 8d70fc0..ab0743f 100644
--- a/merge-recursive.c
+++ b/merge-recursive.c
@@ -1019,14 +1019,23 @@ static int process_renames(struct merge_options *o,
 
 				if (mfi.clean &&
 				    sha_eq(mfi.sha, ren1->pair->two->sha1) &&
-				    mfi.mode == ren1->pair->two->mode)
+				    mfi.mode == ren1->pair->two->mode) {
 					/*
 					 * This messaged is part of
 					 * t6022 test. If you change
 					 * it update the test too.
 					 */
 					output(o, 3, "Skipped %s (merged same as existing)", ren1_dst);
-				else {
+
+					/* If this was a rename across a path involved
+					 * in a D/F conflict, there may be more work to
+					 * do.
+					 */
+					for (i=1; i<=3; ++i) {
+						if (ren1->dst_entry->stages[i].mode)
+							ren1->dst_entry->processed = 0;
+					}
+				} else {
 					if (mfi.merge || !mfi.clean)
 						output(o, 1, "Renaming %s => %s", ren1_src, ren1_dst);
 					if (mfi.merge)
diff --git a/t/t6020-merge-df.sh b/t/t6020-merge-df.sh
index 99acb89..7278eee 100755
--- a/t/t6020-merge-df.sh
+++ b/t/t6020-merge-df.sh
@@ -22,7 +22,7 @@ git commit -m "File: dir"'
 
 test_expect_code 1 'Merge with d/f conflicts' 'git merge "merge msg" B master'
 
-test_expect_failure 'F/D conflict' '
+test_expect_success 'F/D conflict' '
 	git reset --hard &&
 	git checkout master &&
 	rm .git/index &&
@@ -72,7 +72,7 @@ test_expect_success 'Setup rename across paths each below D/F conflicts' '
 	git commit -m "f1"
 '
 
-test_expect_failure 'Test rename across paths below D/F conflicts' '
+test_expect_success 'Test rename across paths below D/F conflicts' '
 	git checkout newmaster &&
 	git cherry-pick branch
 '
-- 
1.7.2.rc0.212.g0c601
Previous: newren@gmail.comNext: Miklos Vajna
Message 6 of 13 in “D/F conflict fixes”
  1. 0/5 D/F conflict fixesnewren@gmail.com, Jun 29, 2010
  2. 1/5 Add additional testcases for D/F conflictsnewren@gmail.com, Jun 29, 2010
  3. 2/5 Add another rename + D/F conflict testcasenewren@gmail.com, Jun 29, 2010
  4. Alexander GladyshJun 29, 2010
  5. 3/5 merge-recursive: Fix D/F conflictsnewren@gmail.com, Jun 29, 2010
  6. 4/5 merge_recursive: Fix renames across paths below D/F conflictsnewren@gmail.com, Jun 29, 2010
  7. Miklos VajnaJun 29, 2010
  8. Elijah NewrenJun 29, 2010
  9. Alex RiesenJun 29, 2010
  10. Elijah NewrenJun 29, 2010
  11. Miklos VajnaJun 29, 2010
  12. Alex RiesenJun 30, 2010
  13. 5/5 fast-import: Handle directories changing into symlinksnewren@gmail.com, Jun 29, 2010

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.