mirror of
https://github.com/git/git.git
synced 2025-12-12 20:36:24 +01:00
Switch from merge-recursive to merge-ort. Adjust the following
testcases due to the switch:
* t4151: This test left an untracked file in the way of the merge.
merge-recursive could only sometimes tell when untracked files were
in the way, and by the time it discovers others, it has already made
too many changes to back out of the merge. So, instead of writing the
results to e.g. 'file1' it would instead write them to
'file1~branch1'. This is confusing for users, because they might not
notice 'file1~branch1' and accidentally add and commit 'file1'.
In contrast, merge-ort correctly notices the file in the way before
making any changes and aborts. Since this test didn't care about the
file in the way, just remove it before calling git-am.
* t4255: Usage of merge-ort allows us to change two known failures into
successes.
* t6427: As noted a few commits ago, the choice of conflict label for
diff3 markers for the ancestor commit was previously handled by
merge-recursive.c rather than by callers. Since that has now changed,
`git am` needs to specify that label. Although the previous conflict
label ("constructed merge base") was already fairly somewhat slanted
towards `git am`, let's use wording more along the lines of the
related command-line flag from `git apply` and function involved to
tie it more closely to `git am`.
Signed-off-by: Elijah Newren <newren@gmail.com>
Reviewed-by: Taylor Blau <me@ttaylorr.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
305 lines
5.6 KiB
Bash
Executable File
305 lines
5.6 KiB
Bash
Executable File
#!/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' '
|
|
git init 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' '
|
|
git init 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' '
|
|
git init 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' '
|
|
git init 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 fake ancestor" file
|
|
)
|
|
'
|
|
|
|
test_setup_zdiff3 () {
|
|
git init 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
|