]> git.ipfire.org Git - thirdparty/git.git/commitdiff
diff-merges: avoid history simplifications when diffing merges
authorElijah Newren <newren@gmail.com>
Wed, 2 Feb 2022 02:37:37 +0000 (02:37 +0000)
committerJunio C Hamano <gitster@pobox.com>
Wed, 2 Feb 2022 18:02:28 +0000 (10:02 -0800)
Doing diffs for merges are special; they should typically avoid history
simplification.  For example, with

    git log --diff-merges=first-parent -- path

the default history simplification would remove merge commits from
consideration if the file "path" matched the second parent.  That is
counter to what the user wants when looking for first-parent diffs.
Similar comments can be made for --diff-merges=separate (which diffs
against both parents) and --diff-merges=remerge (which diffs against a
remerge of the merge commit).

However, history simplification still makes sense if not doing diffing
merges, and it also makes sense for the combined and dense-combined
forms of diffing merges (because both of those are defined to only show
a diff when the merge result at the relevant paths differs from *both*
parents).

So, for separate, first-parent, and remerge styles of diff-merges, turn
off history simplification.

Signed-off-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
diff-merges.c
t/t4069-remerge-diff.sh

index 0af4b3f919172dd0911267b1389ec41c6abc45be..a833fd747ad50e4b61704cff3662fdb47f2b4481 100644 (file)
@@ -24,6 +24,7 @@ static void set_separate(struct rev_info *revs)
 {
        suppress(revs);
        revs->separate_merges = 1;
+       revs->simplify_history = 0;
 }
 
 static void set_first_parent(struct rev_info *revs)
@@ -50,6 +51,7 @@ static void set_remerge_diff(struct rev_info *revs)
 {
        suppress(revs);
        revs->remerge_diff = 1;
+       revs->simplify_history = 0;
 }
 
 static diff_merges_setup_func_t func_by_opt(const char *optarg)
index fd6bce6478121452c8bea00f2cae0f080982052b..35f94957fceb2b02df9846a256f925833c6b4ba0 100755 (executable)
@@ -227,7 +227,63 @@ test_expect_success 'remerge-diff w/ pathspec: limits to relevant file including
        # with sha256
        sed -e "s/[0-9a-f]\{7,\}/HASH/g" tmp >expect &&
 
-       git show --oneline --remerge-diff --full-history resolution -- "letters*" >tmp &&
+       git show --oneline --remerge-diff resolution -- "letters*" >tmp &&
+       sed -e "s/[0-9a-f]\{7,\}/HASH/g" tmp >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success 'setup non-content conflicts' '
+       git switch --orphan newbase &&
+
+       test_write_lines 1 2 3 4 5 6 7 8 9 >numbers &&
+       git add numbers &&
+       git commit -m base &&
+
+       git branch newside1 &&
+       git branch newside2 &&
+
+       git checkout newside1 &&
+       test_write_lines 1 2 three 4 5 6 7 8 9 >numbers &&
+       git add numbers &&
+       git commit -m side1 &&
+
+       git checkout newside2 &&
+       test_write_lines 1 2 drei 4 5 6 7 8 9 >numbers &&
+       git add numbers &&
+       git commit -m side2 &&
+
+       git checkout -b newresolution newside1 &&
+       test_must_fail git merge newside2 &&
+       git checkout --theirs numbers &&
+       git add -u numbers &&
+       git commit -m resolved
+'
+
+test_expect_success 'remerge-diff turns off history simplification' '
+       git log -1 --oneline newresolution >tmp &&
+       cat <<-EOF >>tmp &&
+       diff --git a/numbers b/numbers
+       remerge CONFLICT (content): Merge conflict in numbers
+       index 070e9e7..5335e78 100644
+       --- a/numbers
+       +++ b/numbers
+       @@ -1,10 +1,6 @@
+        1
+        2
+       -<<<<<<< 96f1e45 (side1)
+       -three
+       -=======
+        drei
+       ->>>>>>> 4fd522f (side2)
+        4
+        5
+        6
+       EOF
+       # We still have some sha1 hashes above; rip them out so test works
+       # with sha256
+       sed -e "s/[0-9a-f]\{7,\}/HASH/g" tmp >expect &&
+
+       git show --oneline --remerge-diff newresolution -- numbers >tmp &&
        sed -e "s/[0-9a-f]\{7,\}/HASH/g" tmp >actual &&
        test_cmp expect actual
 '