builtin-apply: do not declare patch is creation when we do not know it
authorJunio C Hamano <gitster@pobox.com>
Sat, 17 May 2008 09:02:44 +0000 (02:02 -0700)
committerJunio C Hamano <gitster@pobox.com>
Sat, 17 May 2008 09:57:33 +0000 (02:57 -0700)
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>
builtin-apply.c
t/t4126-apply-empty.sh [new file with mode: 0755]
index 10b1f88a3c05656af73ede98f9b5544a4e947731..1540f28ab4acc7794796389237bcfeee1075b932 100644 (file)
@@ -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);
diff --git a/t/t4126-apply-empty.sh b/t/t4126-apply-empty.sh
new file mode 100755 (executable)
index 0000000..0cfd47c
--- /dev/null
@@ -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