builtin-apply: do not declare patch is creation when we do not know it
When we see no context nor deleted line in the patch, we used to declare that the patch creates a new file. But some people create an empty file and then apply a patch to it. Similarly, a patch that delete everything is not a deletion patch either. This commit corrects these two issues. Together with the previous commit, it allows a diff between an empty file and a line-ful file to be treated as both creation patch and "add stuff to an existing empty file", depending on the context. A new test t4126 demonstrates the fix. Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
5c47f4c6e7
commit
032bea55a3
@ -1143,21 +1143,6 @@ static int parse_single_patch(char *line, unsigned long size, struct patch *patc
|
||||
if (patch->is_delete < 0 &&
|
||||
(newlines || (patch->fragments && patch->fragments->next)))
|
||||
patch->is_delete = 0;
|
||||
if (!unidiff_zero || context) {
|
||||
/* If the user says the patch is not generated with
|
||||
* --unified=0, or if we have seen context lines,
|
||||
* then not having oldlines means the patch is creation,
|
||||
* and not having newlines means the patch is deletion.
|
||||
*/
|
||||
if (patch->is_new < 0 && !oldlines) {
|
||||
patch->is_new = 1;
|
||||
patch->old_name = NULL;
|
||||
}
|
||||
if (patch->is_delete < 0 && !newlines) {
|
||||
patch->is_delete = 1;
|
||||
patch->new_name = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
if (0 < patch->is_new && oldlines)
|
||||
die("new file %s depends on old contents", patch->new_name);
|
||||
|
61
t/t4126-apply-empty.sh
Executable file
61
t/t4126-apply-empty.sh
Executable file
@ -0,0 +1,61 @@
|
||||
#!/bin/sh
|
||||
|
||||
test_description='apply empty'
|
||||
|
||||
. ./test-lib.sh
|
||||
|
||||
test_expect_success setup '
|
||||
>empty &&
|
||||
git add empty &&
|
||||
test_tick &&
|
||||
git commit -m initial &&
|
||||
for i in a b c d e
|
||||
do
|
||||
echo $i
|
||||
done >empty &&
|
||||
cat empty >expect &&
|
||||
git diff |
|
||||
sed -e "/^diff --git/d" \
|
||||
-e "/^index /d" \
|
||||
-e "s|a/empty|empty.orig|" \
|
||||
-e "s|b/empty|empty|" >patch0 &&
|
||||
sed -e "s|empty|missing|" patch0 >patch1 &&
|
||||
>empty &&
|
||||
git update-index --refresh
|
||||
'
|
||||
|
||||
test_expect_success 'apply empty' '
|
||||
git reset --hard &&
|
||||
>empty &&
|
||||
rm -f missing &&
|
||||
git apply patch0 &&
|
||||
test_cmp expect empty
|
||||
'
|
||||
|
||||
test_expect_success 'apply --index empty' '
|
||||
git reset --hard &&
|
||||
>empty &&
|
||||
rm -f missing &&
|
||||
git apply --index patch0 &&
|
||||
test_cmp expect empty &&
|
||||
git diff --exit-code
|
||||
'
|
||||
|
||||
test_expect_success 'apply create' '
|
||||
git reset --hard &&
|
||||
>empty &&
|
||||
rm -f missing &&
|
||||
git apply patch1 &&
|
||||
test_cmp expect missing
|
||||
'
|
||||
|
||||
test_expect_success 'apply --index create' '
|
||||
git reset --hard &&
|
||||
>empty &&
|
||||
rm -f missing &&
|
||||
git apply --index patch1 &&
|
||||
test_cmp expect missing &&
|
||||
git diff --exit-code
|
||||
'
|
||||
|
||||
test_done
|
Loading…
Reference in New Issue
Block a user