mirror of
https://github.com/git/git
synced 2024-08-24 18:26:02 +00:00
![Junio C Hamano](/assets/img/avatar_default.png)
An earlier commit4be6096
(apply --unidiff-zero: loosen sanity checks for --unidiff=0 patches, 2006-09-17) made match_beginning and match_end computed incorrectly. If a hunk inserts at the beginning, old position recorded at the hunk is line 0, and if a hunk changes at the beginning, it is line 1. The new test added to t4104 exposes that the old code did not insist on matching at the beginning for a patch to add a line to an empty file. An even older65aadb9
(apply: force matching at the beginning., 2006-05-24) was equally wrong in that it tried to take hints from the number of leading context lines, to decide if the hunk must match at the beginning, but we can just look at the line number in the hunk to decide. Signed-off-by: Junio C Hamano <gitster@pobox.com>
129 lines
2.4 KiB
Bash
Executable file
129 lines
2.4 KiB
Bash
Executable file
#!/bin/sh
|
|
#
|
|
# Copyright (c) 2005 Junio C Hamano
|
|
#
|
|
|
|
test_description='git apply boundary tests
|
|
|
|
'
|
|
. ./test-lib.sh
|
|
|
|
L="c d e f g h i j k l m n o p q r s t u v w x"
|
|
|
|
test_expect_success setup '
|
|
for i in b '"$L"' y
|
|
do
|
|
echo $i
|
|
done >victim &&
|
|
cat victim >original &&
|
|
git update-index --add victim &&
|
|
|
|
: add to the head
|
|
for i in a b '"$L"' y
|
|
do
|
|
echo $i
|
|
done >victim &&
|
|
cat victim >add-a-expect &&
|
|
git diff victim >add-a-patch.with &&
|
|
git diff --unified=0 >add-a-patch.without &&
|
|
|
|
: modify at the head
|
|
for i in a '"$L"' y
|
|
do
|
|
echo $i
|
|
done >victim &&
|
|
cat victim >mod-a-expect &&
|
|
git diff victim >mod-a-patch.with &&
|
|
git diff --unified=0 >mod-a-patch.without &&
|
|
|
|
: remove from the head
|
|
for i in '"$L"' y
|
|
do
|
|
echo $i
|
|
done >victim &&
|
|
cat victim >del-a-expect &&
|
|
git diff victim >del-a-patch.with
|
|
git diff --unified=0 >del-a-patch.without &&
|
|
|
|
: add to the tail
|
|
for i in b '"$L"' y z
|
|
do
|
|
echo $i
|
|
done >victim &&
|
|
cat victim >add-z-expect &&
|
|
git diff victim >add-z-patch.with &&
|
|
git diff --unified=0 >add-z-patch.without &&
|
|
|
|
: modify at the tail
|
|
for i in a '"$L"' y
|
|
do
|
|
echo $i
|
|
done >victim &&
|
|
cat victim >mod-z-expect &&
|
|
git diff victim >mod-z-patch.with &&
|
|
git diff --unified=0 >mod-z-patch.without &&
|
|
|
|
: remove from the tail
|
|
for i in b '"$L"'
|
|
do
|
|
echo $i
|
|
done >victim &&
|
|
cat victim >del-z-expect &&
|
|
git diff victim >del-z-patch.with
|
|
git diff --unified=0 >del-z-patch.without &&
|
|
|
|
: done
|
|
'
|
|
|
|
for with in with without
|
|
do
|
|
case "$with" in
|
|
with) u= ;;
|
|
without) u='--unidiff-zero ' ;;
|
|
esac
|
|
for kind in add-a add-z mod-a mod-z del-a del-z
|
|
do
|
|
test_expect_success "apply $kind-patch $with context" '
|
|
cat original >victim &&
|
|
git update-index victim &&
|
|
git apply --index '"$u$kind-patch.$with"' || {
|
|
cat '"$kind-patch.$with"'
|
|
(exit 1)
|
|
} &&
|
|
git diff '"$kind"'-expect victim
|
|
'
|
|
done
|
|
done
|
|
|
|
for kind in add-a add-z mod-a mod-z del-a del-z
|
|
do
|
|
rm -f $kind-ng.without
|
|
sed -e "s/^diff --git /diff /" \
|
|
-e '/^index /d' \
|
|
<$kind-patch.without >$kind-ng.without
|
|
test_expect_success "apply non-git $kind-patch without context" '
|
|
cat original >victim &&
|
|
git update-index victim &&
|
|
git apply --unidiff-zero --index '"$kind-ng.without"' || {
|
|
cat '"$kind-ng.without"'
|
|
(exit 1)
|
|
} &&
|
|
git diff '"$kind"'-expect victim
|
|
'
|
|
done
|
|
|
|
test_expect_success 'two lines' '
|
|
|
|
>file &&
|
|
git add file &&
|
|
echo aaa >file &&
|
|
git diff >patch &&
|
|
git add file &&
|
|
echo bbb >file &&
|
|
git add file &&
|
|
test_must_fail git apply --check patch
|
|
|
|
'
|
|
|
|
test_done
|