mirror of
https://github.com/git/git.git
synced 2024-11-23 18:05:29 +08:00
14da26230a
The `OPT_FILENAME()` option will, if set, put an allocated string into the user-provided variable. Consequently, that variable thus needs to be free'd by the caller of `parse_options()`. Some callsites don't though and thus leak memory. Fix those. Signed-off-by: Patrick Steinhardt <ps@pks.im> Signed-off-by: Junio C Hamano <gitster@pobox.com>
306 lines
5.6 KiB
Bash
Executable File
306 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_PASSES_SANITIZE_LEAK=true
|
|
. ./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 merge base" 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
|