| #!/bin/sh |
| |
| test_description='remerge-diff handling' |
| |
| TEST_PASSES_SANITIZE_LEAK=true |
| . ./test-lib.sh |
| |
| # This test is ort-specific |
| if test "${GIT_TEST_MERGE_ALGORITHM}" != ort |
| then |
| skip_all="GIT_TEST_MERGE_ALGORITHM != ort" |
| test_done |
| fi |
| |
| test_expect_success 'setup basic merges' ' |
| test_write_lines 1 2 3 4 5 6 7 8 9 >numbers && |
| git add numbers && |
| git commit -m base && |
| |
| git branch feature_a && |
| git branch feature_b && |
| git branch feature_c && |
| |
| git branch ab_resolution && |
| git branch bc_resolution && |
| |
| git checkout feature_a && |
| test_write_lines 1 2 three 4 5 6 7 eight 9 >numbers && |
| git commit -a -m change_a && |
| |
| git checkout feature_b && |
| test_write_lines 1 2 tres 4 5 6 7 8 9 >numbers && |
| git commit -a -m change_b && |
| |
| git checkout feature_c && |
| test_write_lines 1 2 3 4 5 6 7 8 9 10 >numbers && |
| git commit -a -m change_c && |
| |
| git checkout bc_resolution && |
| git merge --ff-only feature_b && |
| # no conflict |
| git merge feature_c && |
| |
| git checkout ab_resolution && |
| git merge --ff-only feature_a && |
| # conflicts! |
| test_must_fail git merge feature_b && |
| # Resolve conflict...and make another change elsewhere |
| test_write_lines 1 2 drei 4 5 6 7 acht 9 >numbers && |
| git add numbers && |
| git merge --continue |
| ' |
| |
| test_expect_success 'remerge-diff on a clean merge' ' |
| git log -1 --oneline bc_resolution >expect && |
| git show --oneline --remerge-diff bc_resolution >actual && |
| test_cmp expect actual |
| ' |
| |
| test_expect_success 'remerge-diff on a clean merge with a filter' ' |
| git show --oneline --remerge-diff --diff-filter=U bc_resolution >actual && |
| test_must_be_empty actual |
| ' |
| |
| test_expect_success 'remerge-diff with both a resolved conflict and an unrelated change' ' |
| git log -1 --oneline ab_resolution >tmp && |
| cat <<-EOF >>tmp && |
| diff --git a/numbers b/numbers |
| remerge CONFLICT (content): Merge conflict in numbers |
| index a1fb731..6875544 100644 |
| --- a/numbers |
| +++ b/numbers |
| @@ -1,13 +1,9 @@ |
| 1 |
| 2 |
| -<<<<<<< b0ed5cb (change_a) |
| -three |
| -======= |
| -tres |
| ->>>>>>> 6cd3f82 (change_b) |
| +drei |
| 4 |
| 5 |
| 6 |
| 7 |
| -eight |
| +acht |
| 9 |
| EOF |
| # Hashes above are sha1; rip them out so test works with sha256 |
| sed -e "s/[0-9a-f]\{7,\}/HASH/g" tmp >expect && |
| |
| git show --oneline --remerge-diff ab_resolution >tmp && |
| sed -e "s/[0-9a-f]\{7,\}/HASH/g" tmp >actual && |
| test_cmp expect actual |
| ' |
| |
| test_expect_success 'pickaxe still includes additional headers for relevant changes' ' |
| # reuses "expect" from the previous testcase |
| |
| git log --oneline --remerge-diff -Sacht ab_resolution >tmp && |
| sed -e "s/[0-9a-f]\{7,\}/HASH/g" tmp >actual && |
| test_cmp expect actual |
| ' |
| |
| test_expect_success 'can filter out additional headers with pickaxe' ' |
| git show --remerge-diff --submodule=log --find-object=HEAD ab_resolution >actual && |
| test_must_be_empty actual && |
| |
| git show --remerge-diff -S"not present" --all >actual && |
| test_must_be_empty actual |
| ' |
| |
| test_expect_success 'remerge-diff also works for git-diff-tree' ' |
| # With a clean merge |
| git diff-tree -r -p --remerge-diff --no-commit-id bc_resolution >actual && |
| test_must_be_empty actual && |
| |
| # With both a resolved conflict and an unrelated change |
| cat <<-EOF >tmp && |
| diff --git a/numbers b/numbers |
| remerge CONFLICT (content): Merge conflict in numbers |
| index a1fb731..6875544 100644 |
| --- a/numbers |
| +++ b/numbers |
| @@ -1,13 +1,9 @@ |
| 1 |
| 2 |
| -<<<<<<< b0ed5cb (change_a) |
| -three |
| -======= |
| -tres |
| ->>>>>>> 6cd3f82 (change_b) |
| +drei |
| 4 |
| 5 |
| 6 |
| 7 |
| -eight |
| +acht |
| 9 |
| EOF |
| sed -e "s/[0-9a-f]\{7,\}/HASH/g" tmp >expect && |
| git diff-tree -r -p --remerge-diff --no-commit-id ab_resolution >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 base && |
| |
| test_write_lines 1 2 3 4 5 6 7 8 9 >numbers && |
| test_write_lines a b c d e f g h i >letters && |
| test_write_lines in the way >content && |
| git add numbers letters content && |
| git commit -m base && |
| |
| git branch side1 && |
| git branch side2 && |
| |
| git checkout side1 && |
| test_write_lines 1 2 three 4 5 6 7 8 9 >numbers && |
| git mv letters letters_side1 && |
| git mv content file_or_directory && |
| git add numbers && |
| git commit -m side1 && |
| |
| git checkout side2 && |
| git rm numbers && |
| git mv letters letters_side2 && |
| mkdir file_or_directory && |
| echo hello >file_or_directory/world && |
| git add file_or_directory/world && |
| git commit -m side2 && |
| |
| git checkout -b resolution side1 && |
| test_must_fail git merge side2 && |
| test_write_lines 1 2 three 4 5 6 7 8 9 >numbers && |
| git add numbers && |
| git add letters_side1 && |
| git rm letters && |
| git rm letters_side2 && |
| git add file_or_directory~HEAD && |
| git mv file_or_directory~HEAD wanted_content && |
| git commit -m resolved |
| ' |
| |
| test_expect_success 'remerge-diff with non-content conflicts' ' |
| git log -1 --oneline resolution >tmp && |
| cat <<-EOF >>tmp && |
| diff --git a/file_or_directory~HASH (side1) b/wanted_content |
| similarity index 100% |
| rename from file_or_directory~HASH (side1) |
| rename to wanted_content |
| remerge CONFLICT (file/directory): directory in the way of file_or_directory from HASH (side1); moving it to file_or_directory~HASH (side1) instead. |
| diff --git a/letters b/letters |
| remerge CONFLICT (rename/rename): letters renamed to letters_side1 in HASH (side1) and to letters_side2 in HASH (side2). |
| diff --git a/letters_side2 b/letters_side2 |
| deleted file mode 100644 |
| index b236ae5..0000000 |
| --- a/letters_side2 |
| +++ /dev/null |
| @@ -1,9 +0,0 @@ |
| -a |
| -b |
| -c |
| -d |
| -e |
| -f |
| -g |
| -h |
| -i |
| diff --git a/numbers b/numbers |
| remerge CONFLICT (modify/delete): numbers deleted in HASH (side2) and modified in HASH (side1). Version HASH (side1) of numbers left in tree. |
| 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 resolution >tmp && |
| sed -e "s/[0-9a-f]\{7,\}/HASH/g" tmp >actual && |
| test_cmp expect actual |
| ' |
| |
| test_expect_success 'remerge-diff w/ diff-filter=U: all conflict headers, no diff content' ' |
| git log -1 --oneline resolution >tmp && |
| cat <<-EOF >>tmp && |
| diff --git a/file_or_directory~HASH (side1) b/file_or_directory~HASH (side1) |
| remerge CONFLICT (file/directory): directory in the way of file_or_directory from HASH (side1); moving it to file_or_directory~HASH (side1) instead. |
| diff --git a/letters b/letters |
| remerge CONFLICT (rename/rename): letters renamed to letters_side1 in HASH (side1) and to letters_side2 in HASH (side2). |
| diff --git a/numbers b/numbers |
| remerge CONFLICT (modify/delete): numbers deleted in HASH (side2) and modified in HASH (side1). Version HASH (side1) of numbers left in tree. |
| 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 --diff-filter=U resolution >tmp && |
| sed -e "s/[0-9a-f]\{7,\}/HASH/g" tmp >actual && |
| test_cmp expect actual |
| ' |
| |
| test_expect_success 'submodule formatting ignores additional headers' ' |
| # Reuses "expect" from last testcase |
| |
| git show --oneline --remerge-diff --diff-filter=U --submodule=log >tmp && |
| sed -e "s/[0-9a-f]\{7,\}/HASH/g" tmp >actual && |
| test_cmp expect actual |
| ' |
| |
| test_expect_success 'remerge-diff w/ diff-filter=R: relevant file + conflict header' ' |
| git log -1 --oneline resolution >tmp && |
| cat <<-EOF >>tmp && |
| diff --git a/file_or_directory~HASH (side1) b/wanted_content |
| similarity index 100% |
| rename from file_or_directory~HASH (side1) |
| rename to wanted_content |
| remerge CONFLICT (file/directory): directory in the way of file_or_directory from HASH (side1); moving it to file_or_directory~HASH (side1) instead. |
| 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 --diff-filter=R resolution >tmp && |
| sed -e "s/[0-9a-f]\{7,\}/HASH/g" tmp >actual && |
| test_cmp expect actual |
| ' |
| |
| test_expect_success 'remerge-diff w/ pathspec: limits to relevant file including conflict header' ' |
| git log -1 --oneline resolution >tmp && |
| cat <<-EOF >>tmp && |
| diff --git a/letters b/letters |
| remerge CONFLICT (rename/rename): letters renamed to letters_side1 in HASH (side1) and to letters_side2 in HASH (side2). |
| diff --git a/letters_side2 b/letters_side2 |
| deleted file mode 100644 |
| index b236ae5..0000000 |
| --- a/letters_side2 |
| +++ /dev/null |
| @@ -1,9 +0,0 @@ |
| -a |
| -b |
| -c |
| -d |
| -e |
| -f |
| -g |
| -h |
| -i |
| 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 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 |
| ' |
| |
| test_done |