Skip to content

Commit

Permalink
apply: treat EOF as proper context.
Browse files Browse the repository at this point in the history
Catalin noticed that we do not treat end-of-file condition shown
in the patch text as the patch context.  This causes a patch
that appends at the end of the file to cleanly apply even if
something else has been appended to the file.  If this happened
in the middle, we would refuse by saying that the file has
conflicting modifications.

Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
  • Loading branch information
Linus Torvalds authored and Junio C Hamano committed May 24, 2006
1 parent 36f5b1f commit 1bf1a85
Showing 1 changed file with 14 additions and 0 deletions.
14 changes: 14 additions & 0 deletions apply.c
Original file line number Diff line number Diff line change
Expand Up @@ -1333,6 +1333,7 @@ static int apply_line(char *output, const char *patch, int plen)

static int apply_one_fragment(struct buffer_desc *desc, struct fragment *frag)
{
int match_end;
char *buf = desc->buffer;
const char *patch = frag->patch;
int offset, size = frag->size;
Expand Down Expand Up @@ -1395,10 +1396,19 @@ static int apply_one_fragment(struct buffer_desc *desc, struct fragment *frag)
newlines = new;
leading = frag->leading;
trailing = frag->trailing;

/*
* If we don't have any trailing data in the patch,
* we want it to match at the end of the file.
*/
match_end = !trailing;

lines = 0;
pos = frag->newpos;
for (;;) {
offset = find_offset(buf, desc->size, oldlines, oldsize, pos, &lines);
if (match_end && offset + oldsize != desc->size)
offset = -1;
if (offset >= 0) {
int diff = newsize - oldsize;
unsigned long size = desc->size + diff;
Expand Down Expand Up @@ -1428,6 +1438,10 @@ static int apply_one_fragment(struct buffer_desc *desc, struct fragment *frag)
/* Am I at my context limits? */
if ((leading <= p_context) && (trailing <= p_context))
break;
if (match_end) {
match_end = 0;
continue;
}
/* Reduce the number of context lines
* Reduce both leading and trailing if they are equal
* otherwise just reduce the larger context.
Expand Down

0 comments on commit 1bf1a85

Please sign in to comment.