git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: "Elijah Newren via GitGitGadget" <gitgitgadget@gmail.com>
To: git@vger.kernel.org
Cc: Eric Sunshine <sunshine@sunshineco.com>,
	Elijah Newren <newren@gmail.com>,
	Elijah Newren <newren@gmail.com>,
	Elijah Newren <newren@gmail.com>
Subject: [PATCH v3 2/8] builtin/merge-recursive: switch to using merge_ort_generic()
Date: Tue, 08 Apr 2025 15:48:36 +0000	[thread overview]
Message-ID: <b093d74968b146987fd7ea2373c3879d69fdf448.1744127322.git.gitgitgadget@gmail.com> (raw)
In-Reply-To: <pull.1898.v3.git.1744127322.gitgitgadget@gmail.com>

From: Elijah Newren <newren@gmail.com>

Switch from merge-recursive to merge-ort.  Adjust the following
testcases due to the switch:

* t6430: most of the test differences here were due to improved D/F
  conflict handling explained in more detail in ef527787089c (merge
  tests: expect improved directory/file conflict handling in ort,
  2020-10-26).  These changes weren't made to this test back in that
  commit simply because I had been looking at `git merge` rather than
  `git merge-recursive`.  The final test in this testsuite, though, was
  expunged because it was looking for specific output, and the calls to
  output_commit_title() were discarded from merge_ort_internal() in its
  adaptation from merge_recursive_internal(); see 8119214f4e70
  (merge-ort: implement merge_incore_recursive(), 2020-12-16).

* t6434: This test is built entirely around rename/delete conflicts,
  which had a suboptimal handling under merge-recursive.  As explained
  in more detail in commits 1f3c9ba707 ("t6425: be more flexible with
  rename/delete conflict messages", 2020-08-10) and 727c75b23f ("t6404,
  t6423: expect improved rename/delete handling in ort backend",
  2020-10-26), rename/delete conflicts should each have two entries in
  the index rather than just one.  Adjust the expectations for all the
  tests in this testcase to see the two entries per rename/delete
  conflict.

* t6424: merge-recursive had a special check-if-toplevel-trees-match
  check that it ran at the beginning on both the merge-base and the
  other side being merged in.  In such a case, it exited early and
  printed an "Already up to date." message.  merge-ort got rid of
  this, and instead checks the merge base tree matching the other
  side throughout the tree instead of just at the toplevel, allowing
  it to avoid recursing into various subtrees.  As part of that, it
  got rid of the specialty toplevel message.  That message hasn't
  been missed for years from `git merge`, so I don't think it is
  necessary to keep it just for `git merge-recursive`, especially
  since the latter is rarely used.  (git itself only references it
  in the testsuite, whereas it used to power one of the three
  rebase backends that existed once upon a time.)

Signed-off-by: Elijah Newren <newren@gmail.com>
---
 builtin/merge-recursive.c                 |  4 +--
 t/t6424-merge-unrelated-index-changes.sh  |  4 ++-
 t/t6430-merge-recursive.sh                | 43 +++++------------------
 t/t6434-merge-recursive-rename-options.sh | 16 +++++----
 4 files changed, 22 insertions(+), 45 deletions(-)

diff --git a/builtin/merge-recursive.c b/builtin/merge-recursive.c
index abfc060e28a..03b5100cfae 100644
--- a/builtin/merge-recursive.c
+++ b/builtin/merge-recursive.c
@@ -3,7 +3,7 @@
 #include "advice.h"
 #include "gettext.h"
 #include "hash.h"
-#include "merge-recursive.h"
+#include "merge-ort-wrappers.h"
 #include "object-name.h"
 
 static const char builtin_merge_recursive_usage[] =
@@ -89,7 +89,7 @@ int cmd_merge_recursive(int argc,
 	if (o.verbosity >= 3)
 		printf(_("Merging %s with %s\n"), o.branch1, o.branch2);
 
-	failed = merge_recursive_generic(&o, &h1, &h2, bases_count, bases, &result);
+	failed = merge_ort_generic(&o, &h1, &h2, bases_count, bases, &result);
 
 	free(better1);
 	free(better2);
diff --git a/t/t6424-merge-unrelated-index-changes.sh b/t/t6424-merge-unrelated-index-changes.sh
index 7677c5f08d0..084bfe7e6ce 100755
--- a/t/t6424-merge-unrelated-index-changes.sh
+++ b/t/t6424-merge-unrelated-index-changes.sh
@@ -176,9 +176,11 @@ test_expect_success 'merge-recursive, when index==head but head!=HEAD' '
 	# Make index match B
 	git diff C B -- | git apply --cached &&
 	test_when_finished "git clean -fd" &&  # Do not leave untracked around
+	git write-tree >index-before &&
 	# Merge B & F, with B as "head"
 	git merge-recursive A -- B F > out &&
-	test_grep "Already up to date" out
+	git write-tree >index-after &&
+	test_cmp index-before index-after
 '
 
 test_expect_success 'recursive, when file has staged changes not matching HEAD nor what a merge would give' '
diff --git a/t/t6430-merge-recursive.sh b/t/t6430-merge-recursive.sh
index ca15e6dd6da..c539a68fd07 100755
--- a/t/t6430-merge-recursive.sh
+++ b/t/t6430-merge-recursive.sh
@@ -373,9 +373,9 @@ test_expect_success 'merge-recursive d/f conflict result' '
 
 	git ls-files -s >actual &&
 	(
-		echo "100644 $o0 1	a" &&
-		echo "100644 $o1 2	a" &&
 		echo "100644 $o4 0	a/c" &&
+		echo "100644 $o0 1	a~$c1" &&
+		echo "100644 $o1 2	a~$c1" &&
 		echo "100644 $o0 0	b" &&
 		echo "100644 $o0 0	c" &&
 		echo "100644 $o1 0	d/e"
@@ -397,9 +397,9 @@ test_expect_success 'merge-recursive d/f conflict result the other way' '
 
 	git ls-files -s >actual &&
 	(
-		echo "100644 $o0 1	a" &&
-		echo "100644 $o1 3	a" &&
 		echo "100644 $o4 0	a/c" &&
+		echo "100644 $o0 1	a~$c1" &&
+		echo "100644 $o1 3	a~$c1" &&
 		echo "100644 $o0 0	b" &&
 		echo "100644 $o0 0	c" &&
 		echo "100644 $o1 0	d/e"
@@ -424,9 +424,9 @@ test_expect_success 'merge-recursive d/f conflict result' '
 		echo "100644 $o1 0	a" &&
 		echo "100644 $o0 0	b" &&
 		echo "100644 $o0 0	c" &&
-		echo "100644 $o6 3	d" &&
 		echo "100644 $o0 1	d/e" &&
-		echo "100644 $o1 2	d/e"
+		echo "100644 $o1 2	d/e" &&
+		echo "100644 $o6 3	d~$c6"
 	) >expected &&
 	test_cmp expected actual
 
@@ -448,9 +448,9 @@ test_expect_success 'merge-recursive d/f conflict result' '
 		echo "100644 $o1 0	a" &&
 		echo "100644 $o0 0	b" &&
 		echo "100644 $o0 0	c" &&
-		echo "100644 $o6 2	d" &&
 		echo "100644 $o0 1	d/e" &&
-		echo "100644 $o1 3	d/e"
+		echo "100644 $o1 3	d/e" &&
+		echo "100644 $o6 2	d~$c6"
 	) >expected &&
 	test_cmp expected actual
 
@@ -696,33 +696,6 @@ test_expect_success 'merging with triple rename across D/F conflict' '
 	git merge other
 '
 
-test_expect_success 'merge-recursive remembers the names of all base trees' '
-	git reset --hard HEAD &&
-
-	# make the index match $c1 so that merge-recursive below does not
-	# fail early
-	git diff --binary HEAD $c1 -- | git apply --cached &&
-
-	# more trees than static slots used by oid_to_hex()
-	for commit in $c0 $c2 $c4 $c5 $c6 $c7
-	do
-		git rev-parse "$commit^{tree}" || return 1
-	done >trees &&
-
-	# ignore the return code; it only fails because the input is weird...
-	test_must_fail git -c merge.verbosity=5 merge-recursive $(cat trees) -- $c1 $c3 >out &&
-
-	# ...but make sure it fails in the expected way
-	test_grep CONFLICT.*rename/rename out &&
-
-	# merge-recursive prints in reverse order, but we do not care
-	sort <trees >expect &&
-	sed -n "s/^virtual //p" out | sort >actual &&
-	test_cmp expect actual &&
-
-	git clean -fd
-'
-
 test_expect_success 'merge-recursive internal merge resolves to the sameness' '
 	git reset --hard HEAD &&
 
diff --git a/t/t6434-merge-recursive-rename-options.sh b/t/t6434-merge-recursive-rename-options.sh
index 6e913c30a13..5a6f74839cb 100755
--- a/t/t6434-merge-recursive-rename-options.sh
+++ b/t/t6434-merge-recursive-rename-options.sh
@@ -34,7 +34,9 @@ export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 get_expected_stages () {
 	git checkout rename -- $1-new &&
 	git ls-files --stage $1-new >expected-stages-undetected-$1 &&
-	sed "s/ 0	/ 2	/" <expected-stages-undetected-$1 \
+	git ls-tree HEAD^ $1-old >tmp &&
+	git ls-tree HEAD  $1-new >>tmp &&
+	cat tmp | awk '{print $1 " " $3 " " NR "\t" '$1'"-new"}' \
 		>expected-stages-detected-$1 &&
 	git read-tree -u --reset HEAD
 }
@@ -51,11 +53,11 @@ rename_undetected () {
 
 check_common () {
 	git ls-files --stage >stages-actual &&
-	test_line_count = 4 stages-actual
+	test_line_count = $1 stages-actual
 }
 
 check_threshold_0 () {
-	check_common &&
+	check_common 8 &&
 	rename_detected 0 &&
 	rename_detected 1 &&
 	rename_detected 2 &&
@@ -63,7 +65,7 @@ check_threshold_0 () {
 }
 
 check_threshold_1 () {
-	check_common &&
+	check_common 7 &&
 	rename_undetected 0 &&
 	rename_detected 1 &&
 	rename_detected 2 &&
@@ -71,7 +73,7 @@ check_threshold_1 () {
 }
 
 check_threshold_2 () {
-	check_common &&
+	check_common 6 &&
 	rename_undetected 0 &&
 	rename_undetected 1 &&
 	rename_detected 2 &&
@@ -79,7 +81,7 @@ check_threshold_2 () {
 }
 
 check_exact_renames () {
-	check_common &&
+	check_common 5 &&
 	rename_undetected 0 &&
 	rename_undetected 1 &&
 	rename_undetected 2 &&
@@ -87,7 +89,7 @@ check_exact_renames () {
 }
 
 check_no_renames () {
-	check_common &&
+	check_common 4 &&
 	rename_undetected 0 &&
 	rename_undetected 1 &&
 	rename_undetected 2 &&
-- 
gitgitgadget


  parent reply	other threads:[~2025-04-08 15:48 UTC|newest]

Thread overview: 31+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-03-31 15:51 [PATCH 0/8] Debug merge-recursive.[ch] Elijah Newren via GitGitGadget
2025-03-31 15:51 ` [PATCH 1/8] checkout: replace merge_trees() with merge_ort_nonrecursive() Elijah Newren via GitGitGadget
2025-03-31 15:51 ` [PATCH 2/8] builtin/merge-recursive: switch to using merge_ort_generic() Elijah Newren via GitGitGadget
2025-03-31 15:51 ` [PATCH 3/8] merge-ort: enable diff-algorithms other than histogram Elijah Newren via GitGitGadget
2025-03-31 15:51 ` [PATCH 4/8] sequencer: switch non-recursive merges over to ort Elijah Newren via GitGitGadget
2025-03-31 15:51 ` [PATCH 5/8] merge, sequencer: switch recursive " Elijah Newren via GitGitGadget
2025-03-31 15:51 ` [PATCH 6/8] merge-recursive.[ch]: thoroughly debug these Elijah Newren via GitGitGadget
2025-03-31 15:51 ` [PATCH 7/8] tests: remove GIT_TEST_MERGE_ALGORITHM and test_expect_merge_algorithm Elijah Newren via GitGitGadget
2025-03-31 17:34   ` Eric Sunshine
2025-03-31 18:14     ` Elijah Newren
2025-03-31 15:51 ` [PATCH 8/8] builtin/{merge,rebase,revert}: remove GIT_TEST_MERGE_ALGORITHM Elijah Newren via GitGitGadget
2025-04-05 22:16 ` [PATCH v2 0/8] Debug merge-recursive.[ch] Elijah Newren via GitGitGadget
2025-04-05 22:16   ` [PATCH v2 1/8] checkout: replace merge_trees() with merge_ort_nonrecursive() Elijah Newren via GitGitGadget
2025-04-05 22:16   ` [PATCH v2 2/8] builtin/merge-recursive: switch to using merge_ort_generic() Elijah Newren via GitGitGadget
2025-04-05 22:16   ` [PATCH v2 3/8] merge-ort: enable diff-algorithms other than histogram Elijah Newren via GitGitGadget
2025-04-05 22:16   ` [PATCH v2 4/8] sequencer: switch non-recursive merges over to ort Elijah Newren via GitGitGadget
2025-04-05 22:16   ` [PATCH v2 5/8] merge, sequencer: switch recursive " Elijah Newren via GitGitGadget
2025-04-05 22:16   ` [PATCH v2 6/8] merge-recursive.[ch]: thoroughly debug these Elijah Newren via GitGitGadget
2025-04-05 22:16   ` [PATCH v2 7/8] tests: remove GIT_TEST_MERGE_ALGORITHM and test_expect_merge_algorithm Elijah Newren via GitGitGadget
2025-04-05 22:16   ` [PATCH v2 8/8] builtin/{merge,rebase,revert}: remove GIT_TEST_MERGE_ALGORITHM Elijah Newren via GitGitGadget
2025-04-07 20:09   ` [PATCH v2 0/8] Debug merge-recursive.[ch] Junio C Hamano
2025-04-07 22:23     ` Elijah Newren
2025-04-08 15:48   ` [PATCH v3 " Elijah Newren via GitGitGadget
2025-04-08 15:48     ` [PATCH v3 1/8] checkout: replace merge_trees() with merge_ort_nonrecursive() Elijah Newren via GitGitGadget
2025-04-08 15:48     ` Elijah Newren via GitGitGadget [this message]
2025-04-08 15:48     ` [PATCH v3 3/8] merge-ort: enable diff-algorithms other than histogram Elijah Newren via GitGitGadget
2025-04-08 15:48     ` [PATCH v3 4/8] sequencer: switch non-recursive merges over to ort Elijah Newren via GitGitGadget
2025-04-08 15:48     ` [PATCH v3 5/8] merge, sequencer: switch recursive " Elijah Newren via GitGitGadget
2025-04-08 15:48     ` [PATCH v3 6/8] merge-recursive.[ch]: thoroughly debug these Elijah Newren via GitGitGadget
2025-04-08 15:48     ` [PATCH v3 7/8] tests: remove GIT_TEST_MERGE_ALGORITHM and test_expect_merge_algorithm Elijah Newren via GitGitGadget
2025-04-08 15:48     ` [PATCH v3 8/8] builtin/{merge,rebase,revert}: remove GIT_TEST_MERGE_ALGORITHM Elijah Newren via GitGitGadget

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=b093d74968b146987fd7ea2373c3879d69fdf448.1744127322.git.gitgitgadget@gmail.com \
    --to=gitgitgadget@gmail.com \
    --cc=git@vger.kernel.org \
    --cc=newren@gmail.com \
    --cc=sunshine@sunshineco.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).