mirror of
https://github.com/git/git
synced 2024-08-23 18:00:25 +00:00
158 lines
3.8 KiB
Bash
Executable file
158 lines
3.8 KiB
Bash
Executable file
#!/bin/sh
|
|
|
|
test_description='git apply --3way'
|
|
|
|
. ./test-lib.sh
|
|
|
|
create_file () {
|
|
for i
|
|
do
|
|
echo "$i"
|
|
done
|
|
}
|
|
|
|
sanitize_conflicted_diff () {
|
|
sed -e '
|
|
/^index /d
|
|
s/^\(+[<>][<>][<>][<>]*\) .*/\1/
|
|
'
|
|
}
|
|
|
|
test_expect_success setup '
|
|
test_tick &&
|
|
create_file >one 1 2 3 4 5 6 7 &&
|
|
cat one >two &&
|
|
git add one two &&
|
|
git commit -m initial &&
|
|
|
|
git branch side &&
|
|
|
|
test_tick &&
|
|
create_file >one 1 two 3 4 5 six 7 &&
|
|
create_file >two 1 two 3 4 5 6 7 &&
|
|
git commit -a -m master &&
|
|
|
|
git checkout side &&
|
|
create_file >one 1 2 3 4 five 6 7 &&
|
|
create_file >two 1 2 3 4 five 6 7 &&
|
|
git commit -a -m side &&
|
|
|
|
git checkout master
|
|
'
|
|
|
|
test_expect_success 'apply without --3way' '
|
|
git diff side^ side >P.diff &&
|
|
|
|
# should fail to apply
|
|
git reset --hard &&
|
|
git checkout master^0 &&
|
|
test_must_fail git apply --index P.diff &&
|
|
# should leave things intact
|
|
git diff-files --exit-code &&
|
|
git diff-index --exit-code --cached HEAD
|
|
'
|
|
|
|
test_expect_success 'apply with --3way' '
|
|
# Merging side should be similar to applying this patch
|
|
git diff ...side >P.diff &&
|
|
|
|
# The corresponding conflicted merge
|
|
git reset --hard &&
|
|
git checkout master^0 &&
|
|
test_must_fail git merge --no-commit side &&
|
|
git ls-files -s >expect.ls &&
|
|
git diff HEAD | sanitize_conflicted_diff >expect.diff &&
|
|
|
|
# should fail to apply
|
|
git reset --hard &&
|
|
git checkout master^0 &&
|
|
test_must_fail git apply --index --3way P.diff &&
|
|
git ls-files -s >actual.ls &&
|
|
git diff HEAD | sanitize_conflicted_diff >actual.diff &&
|
|
|
|
# The result should resemble the corresponding merge
|
|
test_cmp expect.ls actual.ls &&
|
|
test_cmp expect.diff actual.diff
|
|
'
|
|
|
|
test_expect_success 'apply with --3way with rerere enabled' '
|
|
git config rerere.enabled true &&
|
|
|
|
# Merging side should be similar to applying this patch
|
|
git diff ...side >P.diff &&
|
|
|
|
# The corresponding conflicted merge
|
|
git reset --hard &&
|
|
git checkout master^0 &&
|
|
test_must_fail git merge --no-commit side &&
|
|
|
|
# Manually resolve and record the resolution
|
|
create_file 1 two 3 4 five six 7 >one &&
|
|
git rerere &&
|
|
cat one >expect &&
|
|
|
|
# should fail to apply
|
|
git reset --hard &&
|
|
git checkout master^0 &&
|
|
test_must_fail git apply --index --3way P.diff &&
|
|
|
|
# but rerere should have replayed the recorded resolution
|
|
test_cmp expect one
|
|
'
|
|
|
|
test_expect_success 'apply -3 with add/add conflict setup' '
|
|
git reset --hard &&
|
|
|
|
git checkout -b adder &&
|
|
create_file 1 2 3 4 5 6 7 >three &&
|
|
create_file 1 2 3 4 5 6 7 >four &&
|
|
git add three four &&
|
|
git commit -m "add three and four" &&
|
|
|
|
git checkout -b another adder^ &&
|
|
create_file 1 2 3 4 5 6 7 >three &&
|
|
create_file 1 2 3 four 5 6 7 >four &&
|
|
git add three four &&
|
|
git commit -m "add three and four" &&
|
|
|
|
# Merging another should be similar to applying this patch
|
|
git diff adder...another >P.diff &&
|
|
|
|
git checkout adder^0 &&
|
|
test_must_fail git merge --no-commit another &&
|
|
git ls-files -s >expect.ls &&
|
|
git diff HEAD | sanitize_conflicted_diff >expect.diff
|
|
'
|
|
|
|
test_expect_success 'apply -3 with add/add conflict' '
|
|
# should fail to apply ...
|
|
git reset --hard &&
|
|
git checkout adder^0 &&
|
|
test_must_fail git apply --index --3way P.diff &&
|
|
# ... and leave conflicts in the index and in the working tree
|
|
git ls-files -s >actual.ls &&
|
|
git diff HEAD | sanitize_conflicted_diff >actual.diff &&
|
|
|
|
# The result should resemble the corresponding merge
|
|
test_cmp expect.ls actual.ls &&
|
|
test_cmp expect.diff actual.diff
|
|
'
|
|
|
|
test_expect_success 'apply -3 with add/add conflict (dirty working tree)' '
|
|
# should fail to apply ...
|
|
git reset --hard &&
|
|
git checkout adder^0 &&
|
|
echo >>four &&
|
|
cat four >four.save &&
|
|
cat three >three.save &&
|
|
git ls-files -s >expect.ls &&
|
|
test_must_fail git apply --index --3way P.diff &&
|
|
# ... and should not touch anything
|
|
git ls-files -s >actual.ls &&
|
|
test_cmp expect.ls actual.ls &&
|
|
test_cmp four.save four &&
|
|
test_cmp three.save three
|
|
'
|
|
|
|
test_done
|