Merge branch 'jc/maint-apply-match-beginning'
authorJunio C Hamano <gitster@pobox.com>
Mon, 7 Apr 2008 03:04:29 +0000 (20:04 -0700)
committerJunio C Hamano <gitster@pobox.com>
Mon, 7 Apr 2008 03:04:29 +0000 (20:04 -0700)
* jc/maint-apply-match-beginning:
Fix "git apply" to correctly enforce "match at the beginning"

builtin-apply.c
t/t4104-apply-boundary.sh
index b5f78ac3a78679fdb747380305fb6772c39874e0..abe73a0f8194e95c2a10a27c2007560e6d57f3d5 100644 (file)
@@ -1937,21 +1937,24 @@ static int apply_one_fragment(struct image *img, struct fragment *frag,
        trailing = frag->trailing;
 
        /*
-        * If we don't have any leading/trailing data in the patch,
-        * we want it to match at the beginning/end of the file.
+        * A hunk to change lines at the beginning would begin with
+        * @@ -1,L +N,M @@
         *
-        * But that would break if the patch is generated with
-        * --unified=0; sane people wouldn't do that to cause us
-        * trouble, but we try to please not so sane ones as well.
+        * And a hunk to add to an empty file would begin with
+        * @@ -0,0 +N,M @@
+        *
+        * In other words, a hunk that is (frag->oldpos <= 1) with or
+        * without leading context must match at the beginning.
         */
-       if (unidiff_zero) {
-               match_beginning = (!leading && !frag->oldpos);
-               match_end = 0;
-       }
-       else {
-               match_beginning = !leading && (frag->oldpos == 1);
-               match_end = !trailing;
-       }
+       match_beginning = frag->oldpos <= 1;
+
+       /*
+        * A hunk without trailing lines must match at the end.
+        * However, we simply cannot tell if a hunk must match end
+        * from the lack of trailing lines if the patch was generated
+        * with unidiff without any context.
+        */
+       match_end = !unidiff_zero && !trailing;
 
        pos = frag->newpos ? (frag->newpos - 1) : 0;
        preimage.buf = oldlines;
index 64f34e329867cbef3c122c96a63cfd844b0953af..43943ab8ca181edbdcc6a68d208cf584b5cda86d 100755 (executable)
@@ -112,4 +112,17 @@ do
        '
 done
 
+test_expect_success 'two lines' '
+
+       >file &&
+       git add file &&
+       echo aaa >file &&
+       git diff >patch &&
+       git add file &&
+       echo bbb >file &&
+       git add file &&
+       test_must_fail git apply --check patch
+
+'
+
 test_done