apply: treat EOF as proper context.
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>
This commit is contained in:
parent
36f5b1f0c8
commit
1bf1a859ae
14
apply.c
14
apply.c
@ -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)
|
static int apply_one_fragment(struct buffer_desc *desc, struct fragment *frag)
|
||||||
{
|
{
|
||||||
|
int match_end;
|
||||||
char *buf = desc->buffer;
|
char *buf = desc->buffer;
|
||||||
const char *patch = frag->patch;
|
const char *patch = frag->patch;
|
||||||
int offset, size = frag->size;
|
int offset, size = frag->size;
|
||||||
@ -1395,10 +1396,19 @@ static int apply_one_fragment(struct buffer_desc *desc, struct fragment *frag)
|
|||||||
newlines = new;
|
newlines = new;
|
||||||
leading = frag->leading;
|
leading = frag->leading;
|
||||||
trailing = frag->trailing;
|
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;
|
lines = 0;
|
||||||
pos = frag->newpos;
|
pos = frag->newpos;
|
||||||
for (;;) {
|
for (;;) {
|
||||||
offset = find_offset(buf, desc->size, oldlines, oldsize, pos, &lines);
|
offset = find_offset(buf, desc->size, oldlines, oldsize, pos, &lines);
|
||||||
|
if (match_end && offset + oldsize != desc->size)
|
||||||
|
offset = -1;
|
||||||
if (offset >= 0) {
|
if (offset >= 0) {
|
||||||
int diff = newsize - oldsize;
|
int diff = newsize - oldsize;
|
||||||
unsigned long size = desc->size + diff;
|
unsigned long size = desc->size + diff;
|
||||||
@ -1428,6 +1438,10 @@ static int apply_one_fragment(struct buffer_desc *desc, struct fragment *frag)
|
|||||||
/* Am I at my context limits? */
|
/* Am I at my context limits? */
|
||||||
if ((leading <= p_context) && (trailing <= p_context))
|
if ((leading <= p_context) && (trailing <= p_context))
|
||||||
break;
|
break;
|
||||||
|
if (match_end) {
|
||||||
|
match_end = 0;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
/* Reduce the number of context lines
|
/* Reduce the number of context lines
|
||||||
* Reduce both leading and trailing if they are equal
|
* Reduce both leading and trailing if they are equal
|
||||||
* otherwise just reduce the larger context.
|
* otherwise just reduce the larger context.
|
||||||
|
Loading…
Reference in New Issue
Block a user