summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: 6e7c92a)
raw | patch | inline | side by side (parent: 6e7c92a)
author | Linus Torvalds <torvalds@ppc970.osdl.org> | |
Sun, 5 Jun 2005 19:43:56 +0000 (12:43 -0700) | ||
committer | Linus Torvalds <torvalds@ppc970.osdl.org> | |
Sun, 5 Jun 2005 19:43:56 +0000 (12:43 -0700) |
(And fix name handling for when we have an implied
create or delete event from a traditional diff).
create or delete event from a traditional diff).
apply.c | patch | blob | history |
index 195acdbc2125cc3fccd01263051e66a6f73b91a5..4f3ac90c94761ee3e49b22f66650e88a2b872781 100644 (file)
--- a/apply.c
+++ b/apply.c
@@ -606,7 +606,7 @@ static int parse_fragment(char *line, unsigned long size, struct patch *patch, s
{
int added, deleted;
int len = linelen(line, size), offset;
- unsigned long pos[4], oldlines, newlines;
+ unsigned long oldlines, newlines;
offset = parse_fragment_header(line, len, fragment);
if (offset < 0)
@@ -614,10 +614,21 @@ static int parse_fragment(char *line, unsigned long size, struct patch *patch, s
oldlines = fragment->oldlines;
newlines = fragment->newlines;
- if (patch->is_new < 0 && (pos[0] || oldlines))
- patch->is_new = 0;
- if (patch->is_delete < 0 && (pos[1] || newlines))
- patch->is_delete = 0;
+ if (patch->is_new < 0) {
+ patch->is_new = !oldlines;
+ if (!oldlines)
+ patch->old_name = NULL;
+ }
+ if (patch->is_delete < 0) {
+ patch->is_delete = !newlines;
+ if (!newlines)
+ patch->new_name = NULL;
+ }
+
+ if (patch->is_new != !oldlines)
+ return error("new file depends on old contents");
+ if (patch->is_delete != !newlines)
+ return error("deleted file still has contents");
/* Parse the thing.. */
line += len;
return error("patch failed: %s:%d", patch->old_name, frag->oldpos);
frag = frag->next;
}
+ return 0;
}
static int apply_data(struct patch *patch, struct stat *st)
unsigned long size, alloc;
struct buffer_desc desc;
- if (!patch->old_name || !patch->fragments)
- return 0;
- size = st->st_size;
- alloc = size + 8192;
- buf = xmalloc(alloc);
- if (read_old_data(st, patch->old_name, buf, alloc) != size)
- return error("read of %s failed", patch->old_name);
+ size = 0;
+ alloc = 0;
+ buf = NULL;
+ if (patch->old_name) {
+ size = st->st_size;
+ alloc = size + 8192;
+ buf = xmalloc(alloc);
+ if (read_old_data(st, patch->old_name, buf, alloc) != size)
+ return error("read of %s failed", patch->old_name);
+ }
desc.size = size;
desc.alloc = alloc;