#!/bin/sh test_description='recursive merge diff3 style conflict markers' GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME . ./test-lib.sh # Setup: # L1 # \ # ? # / # R1 # # Where: # L1 and R1 both have a file named 'content' but have no common history # test_expect_success 'setup no merge base' ' test_create_repo no_merge_base && ( cd no_merge_base && git checkout -b L && test_commit A content A && git checkout --orphan R && test_commit B content B ) ' test_expect_success 'check no merge base' ' ( cd no_merge_base && git checkout L^0 && test_must_fail git -c merge.conflictstyle=diff3 merge --allow-unrelated-histories -s recursive R^0 && grep "|||||| empty tree" content ) ' # Setup: # L1 # / \ # main ? # \ / # R1 # # Where: # L1 and R1 have modified the same file ('content') in conflicting ways # test_expect_success 'setup unique merge base' ' test_create_repo unique_merge_base && ( cd unique_merge_base && test_commit base content "1 2 3 4 5 " && git branch L && git branch R && git checkout L && test_commit L content "1 2 3 4 5 7" && git checkout R && git rm content && test_commit R renamed "1 2 3 4 5 six" ) ' test_expect_success 'check unique merge base' ' ( cd unique_merge_base && git checkout L^0 && MAIN=$(git rev-parse --short main) && test_must_fail git -c merge.conflictstyle=diff3 merge -s recursive R^0 && grep "|||||| $MAIN:content" renamed ) ' # Setup: # L1---L2--L3 # / \ / \ # main X1 ? # \ / \ / # R1---R2--R3 # # Where: # commits L1 and R1 have modified the same file in non-conflicting ways # X1 is an auto-generated merge-base used when merging L1 and R1 # commits L2 and R2 are merges of R1 and L1 into L1 and R1, respectively # commits L3 and R3 both modify 'content' in conflicting ways # test_expect_success 'setup multiple merge bases' ' test_create_repo multiple_merge_bases && ( cd multiple_merge_bases && test_commit initial content "1 2 3 4 5" && git branch L && git branch R && # Create L1 git checkout L && test_commit L1 content "0 1 2 3 4 5" && # Create R1 git checkout R && test_commit R1 content "1 2 3 4 5 6" && # Create L2 git checkout L && git merge R1 && # Create R2 git checkout R && git merge L1 && # Create L3 git checkout L && test_commit L3 content "0 1 2 3 4 5 A" && # Create R3 git checkout R && git rm content && test_commit R3 renamed "0 2 3 4 5 six" ) ' test_expect_success 'check multiple merge bases' ' ( cd multiple_merge_bases && git checkout L^0 && test_must_fail git -c merge.conflictstyle=diff3 merge -s recursive R^0 && grep "|||||| merged common ancestors:content" renamed ) ' test_expect_success 'rebase --merge describes parent of commit being picked' ' test_create_repo rebase && ( cd rebase && test_commit base file && test_commit main file && git checkout -b side HEAD^ && test_commit side file && test_must_fail git -c merge.conflictstyle=diff3 rebase --merge main && grep "||||||| parent of" file ) ' test_expect_success 'rebase --apply describes fake ancestor base' ' ( cd rebase && git rebase --abort && test_must_fail git -c merge.conflictstyle=diff3 rebase --apply main && grep "||||||| constructed merge base" file ) ' test_setup_zdiff3 () { test_create_repo zdiff3 && ( cd zdiff3 && test_write_lines 1 2 3 4 5 6 7 8 9 >basic && test_write_lines 1 2 3 AA 4 5 BB 6 7 8 >middle-common && test_write_lines 1 2 3 4 5 6 7 8 9 >interesting && test_write_lines 1 2 3 4 5 6 7 8 9 >evil && git add basic middle-common interesting evil && git commit -m base && git branch left && git branch right && git checkout left && test_write_lines 1 2 3 4 A B C D E 7 8 9 >basic && test_write_lines 1 2 3 CC 4 5 DD 6 7 8 >middle-common && test_write_lines 1 2 3 4 A B C D E F G H I J 7 8 9 >interesting && test_write_lines 1 2 3 4 X A B C 7 8 9 >evil && git add -u && git commit -m letters && git checkout right && test_write_lines 1 2 3 4 A X C Y E 7 8 9 >basic && test_write_lines 1 2 3 EE 4 5 FF 6 7 8 >middle-common && test_write_lines 1 2 3 4 A B C 5 6 G H I J 7 8 9 >interesting && test_write_lines 1 2 3 4 Y A B C B C 7 8 9 >evil && git add -u && git commit -m permuted ) } test_expect_success 'check zdiff3 markers' ' test_setup_zdiff3 && ( cd zdiff3 && git checkout left^0 && base=$(git rev-parse --short HEAD^1) && test_must_fail git -c merge.conflictstyle=zdiff3 merge -s recursive right^0 && test_write_lines 1 2 3 4 A \ "<<<<<<< HEAD" B C D \ "||||||| $base" 5 6 \ ======= X C Y \ ">>>>>>> right^0" \ E 7 8 9 \ >expect && test_cmp expect basic && test_write_lines 1 2 3 \ "<<<<<<< HEAD" CC \ "||||||| $base" AA \ ======= EE \ ">>>>>>> right^0" \ 4 5 \ "<<<<<<< HEAD" DD \ "||||||| $base" BB \ ======= FF \ ">>>>>>> right^0" \ 6 7 8 \ >expect && test_cmp expect middle-common && test_write_lines 1 2 3 4 A B C \ "<<<<<<< HEAD" D E F \ "||||||| $base" 5 6 \ ======= 5 6 \ ">>>>>>> right^0" \ G H I J 7 8 9 \ >expect && test_cmp expect interesting && # Not passing this one yet; the common "B C" lines is still # being left in the conflict blocks on the left and right # sides. test_write_lines 1 2 3 4 \ "<<<<<<< HEAD" X A \ "||||||| $base" 5 6 \ ======= Y A B C \ ">>>>>>> right^0" \ B C 7 8 9 \ >expect && test_cmp expect evil ) ' test_done