The documentation claims that "recursive defaults to the diff.algorithm
config setting", but this is currently not the case. This fixes it,
ensuring that diff.algorithm is used when -Xdiff-algorithm is not
supplied. This affects the following porcelain commands: "merge",
"rebase", "cherry-pick", "pull", "stash", "log", "am" and "checkout".
It also affects the "merge-tree" ancillary interrogator.
This change refactors the initialization of merge options to introduce
two functions, "init_merge_ui_options" and "init_merge_basic_options"
instead of just one "init_merge_options". This design follows the
approach used in diff.c, providing initialization methods for
porcelain and plumbing commands respectively. Thanks to that, the
"replay" and "merge-recursive" plumbing commands remain unaffected by
diff.algorithm.
Signed-off-by: Antonin Delpeuch <antonin@delpeuch.eu>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Antonin Delpeuch committedJul 13, 2024 at 16:51 UTC9c93ba4d0aee1bc8c663a13552afd2b2c22863a9
new file mode 100755index 0000000000..9a83be518c--- /dev/null+++ b/t/t7615-diff-algo-with-mergy-operations.sh@@ -0,0 +1,60 @@+#!/bin/sh++test_description='git merge and other operations that rely on merge++Testing the influence of the diff algorithm on the merge output.'++TEST_PASSES_SANITIZE_LEAK=true+. ./test-lib.sh++test_expect_success 'setup' '+ cp "$TEST_DIRECTORY"/t7615/base.c file.c &&+ git add file.c &&+ git commit -m c0 &&+ git tag c0 &&+ cp "$TEST_DIRECTORY"/t7615/ours.c file.c &&+ git add file.c &&+ git commit -m c1 &&+ git tag c1 &&+ git reset --hard c0 &&+ cp "$TEST_DIRECTORY"/t7615/theirs.c file.c &&+ git add file.c &&+ git commit -m c2 &&+ git tag c2+'++GIT_TEST_MERGE_ALGORITHM=recursive++test_expect_success 'merge c2 to c1 with recursive merge strategy fails with the current default myers diff algorithm' '+ git reset --hard c1 &&+ test_must_fail git merge -s recursive c2+'++test_expect_success 'merge c2 to c1 with recursive merge strategy succeeds with -Xdiff-algorithm=histogram' '+ git reset --hard c1 &&+ git merge --strategy recursive -Xdiff-algorithm=histogram c2+'++test_expect_success 'merge c2 to c1 with recursive merge strategy succeeds with diff.algorithm = histogram' '+ git reset --hard c1 &&+ git config diff.algorithm histogram &&+ git merge --strategy recursive c2+'++test_expect_success 'cherry-pick c2 to c1 with recursive merge strategy fails with the current default myers diff algorithm' '+ git reset --hard c1 &&+ test_must_fail git cherry-pick -s recursive c2+'++test_expect_success 'cherry-pick c2 to c1 with recursive merge strategy succeeds with -Xdiff-algorithm=histogram' '+ git reset --hard c1 &&+ git cherry-pick --strategy recursive -Xdiff-algorithm=histogram c2+'++test_expect_success 'cherry-pick c2 to c1 with recursive merge strategy succeeds with diff.algorithm = histogram' '+ git reset --hard c1 &&+ git config diff.algorithm histogram &&+ git cherry-pick --strategy recursive c2+'++test_done
t/t7615/base.c
+17
new file mode 100644index 0000000000..c64abc5936--- /dev/null+++ b/t/t7615/base.c@@ -0,0 +1,17 @@+int f(int x, int y)+{+ if (x == 0)+ {+ return y;+ }+ return x;+}++int g(size_t u)+{+ while (u < 30)+ {+ u++;+ }+ return u;+}
t/t7615/ours.c
+17
new file mode 100644index 0000000000..44d8251397--- /dev/null+++ b/t/t7615/ours.c@@ -0,0 +1,17 @@+int g(size_t u)+{+ while (u < 30)+ {+ u++;+ }+ return u;+}++int h(int x, int y, int z)+{+ if (z == 0)+ {+ return x;+ }+ return y;+}
t/t7615/theirs.c
+17
new file mode 100644index 0000000000..85f02146fe--- /dev/null+++ b/t/t7615/theirs.c@@ -0,0 +1,17 @@+int f(int x, int y)+{+ if (x == 0)+ {+ return y;+ }+ return x;+}++int g(size_t u)+{+ while (u > 34)+ {+ u--;+ }+ return u;+}