mirror of
https://github.com/git/git
synced 2024-08-24 18:26:02 +00:00
![Elijah Newren](/assets/img/avatar_default.png)
The tests for the merge machinery are spread over several places.
Collect them into t64xx for simplicity. Some notes:
t60[234]*.sh:
Merge tests started in t602*, overgrew bisect and remote tracking
tests in t6030, t6040, and t6041, and nearly overtook replace tests
in t6050. This made picking out relevant tests that I wanted to run
in a tighter loop slightly more annoying for years.
t303*.sh:
These started out as tests for the 'merge-recursive' toplevel command,
but did not restrict to that and had lots of overlap with the
underlying merge machinery.
t7405, t7613:
submodule-specific merge logic started out in submodule.c but was
moved to merge-recursive.c in commit 18cfc08866
("submodule.c: move
submodule merging to merge-recursive.c", 2018-05-15). Since these
tests are about the logic found in the merge machinery, moving these
tests to be with the merge tests makes sense.
t7607, t7609:
Having tests spread all over the place makes it more likely that
additional tests related to a certain piece of logic grow in all those
other places. Much like t303*.sh, these two tests were about the
underlying merge machinery rather than outer levels.
Tests that were NOT moved:
t76[01]*.sh:
Other than the four tests mentioned above, the remaining tests in
t76[01]*.sh are related to non-recursive merge strategies, parameter
parsing, and other stuff associated with the highlevel builtin/merge.c
rather than the recursive merge machinery.
t3[45]*.sh:
The rebase testcases in t34*.sh also test the merge logic pretty
heavily; sometimes changes I make only trigger failures in the rebase
tests. The rebase tests are already nicely coupled together, though,
and I didn't want to mess that up. Similar comments apply for the
cherry-pick tests in t35*.sh.
Signed-off-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
212 lines
3.3 KiB
Bash
Executable file
212 lines
3.3 KiB
Bash
Executable file
#!/bin/sh
|
|
|
|
test_description='recursive merge diff3 style conflict markers'
|
|
|
|
. ./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
|
|
# / \
|
|
# master ?
|
|
# \ /
|
|
# 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 &&
|
|
MASTER=$(git rev-parse --short master) &&
|
|
|
|
test_must_fail git -c merge.conflictstyle=diff3 merge -s recursive R^0 &&
|
|
|
|
grep "|||||| $MASTER:content" renamed
|
|
)
|
|
'
|
|
|
|
# Setup:
|
|
# L1---L2--L3
|
|
# / \ / \
|
|
# master 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 master file &&
|
|
git checkout -b side HEAD^ &&
|
|
test_commit side file &&
|
|
test_must_fail git -c merge.conflictstyle=diff3 rebase --merge master &&
|
|
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 master &&
|
|
grep "||||||| constructed merge base" file
|
|
)
|
|
'
|
|
|
|
test_done
|