Skip to content

Commit

Permalink
builtin-apply: do not declare patch is creation when we do not know it
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Junio C Hamano committed May 17, 2008
1 parent 5c47f4c commit 032bea5
Show file tree
Hide file tree
Showing 2 changed files with 61 additions and 15 deletions.
15 changes: 0 additions & 15 deletions builtin-apply.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
61 changes: 61 additions & 0 deletions t/t4126-apply-empty.sh
Original file line number Diff line number Diff line change
@@ -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

0 comments on commit 032bea5

Please sign in to comment.