Andrew's git
/
gitweb.git
/ diff
summary
|
log
|
commit
| diff |
tree
commit
grep
author
committer
pickaxe
?
re
git-apply: fix apply of a new file
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).
apply.c
patch
|
blob
|
history
raw
|
patch
|
inline
| side by side (parent:
6e7c92a
)
diff --git
a/apply.c
b/apply.c
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;
{
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)
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;
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;
/* Parse the thing.. */
line += len;
@@
-928,6
+939,7
@@
static int apply_fragments(struct buffer_desc *desc, struct patch *patch)
return error("patch failed: %s:%d", patch->old_name, frag->oldpos);
frag = frag->next;
}
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)
}
static int apply_data(struct patch *patch, struct stat *st)
@@
-936,13
+948,16
@@
static int apply_data(struct patch *patch, struct stat *st)
unsigned long size, alloc;
struct buffer_desc desc;
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;
desc.size = size;
desc.alloc = alloc;