When there is no leading context, the patch must match at the
beginning of preimage; otherwise there is a "patch adds these
lines while the other lines were added to the original file"
conflict.
This is the opposite of match_end fix earlier in this series.
Unlike matching at the end case, we can additionally check the
preimage line number recorded in the patch, so the change is not
symmetrical with the earlier one.
Signed-off-by: Junio C Hamano <junkio@cox.net>
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_beginning, match_end;
char *buf = desc->buffer;
const char *patch = frag->patch;
int offset, size = frag->size;
char *buf = desc->buffer;
const char *patch = frag->patch;
int offset, size = frag->size;
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.
+ * If we don't have any leading/trailing data in the patch,
+ * we want it to match at the beginning/end of the file.
+ match_beginning = !leading && (frag->oldpos == 1);
match_end = !trailing;
lines = 0;
match_end = !trailing;
lines = 0;
offset = find_offset(buf, desc->size, oldlines, oldsize, pos, &lines);
if (match_end && offset + oldsize != desc->size)
offset = -1;
offset = find_offset(buf, desc->size, oldlines, oldsize, pos, &lines);
if (match_end && offset + oldsize != desc->size)
offset = -1;
+ if (match_beginning && offset)
+ offset = -1;
if (offset >= 0) {
int diff = newsize - oldsize;
unsigned long size = desc->size + diff;
if (offset >= 0) {
int diff = newsize - oldsize;
unsigned long size = desc->size + diff;
/* Am I at my context limits? */
if ((leading <= p_context) && (trailing <= p_context))
break;
/* Am I at my context limits? */
if ((leading <= p_context) && (trailing <= p_context))
break;
- if (match_end) {
- match_end = 0;
+ if (match_beginning || match_end) {
+ match_beginning = match_end = 0;
continue;
}
/* Reduce the number of context lines
continue;
}
/* Reduce the number of context lines
-test_expect_failure apply \
+test_expect_failure 'apply at the end' \
'git-apply --index test-patch'
'git-apply --index test-patch'
+cat >test-patch <<\EOF
+diff a/file b/file
+--- a/file
++++ b/file
+@@ -1,2 +1,3 @@
++a
+ b
+ c
+EOF
+
+echo >file 'a
+b
+c'
+git-update-index file
+
+test_expect_failure 'apply at the beginning' \
+ 'git-apply --index test-patch'
+