diff options
author | Junio C Hamano <gitster@pobox.com> | 2008-04-06 20:04:29 -0700 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2008-04-06 20:04:29 -0700 |
commit | a1c0dca43a3513574e5bebb38989671960cdaf35 (patch) | |
tree | f67bb600dd5da2c3038dff2948a70f267cf237b2 | |
parent | aba201c6e8d9934157b9ba39b8e6b54c2fa7b6e1 (diff) | |
parent | ee5a317e0130ab2db59db97c644576335530512d (diff) | |
download | git-a1c0dca43a3513574e5bebb38989671960cdaf35.tar.gz git-a1c0dca43a3513574e5bebb38989671960cdaf35.tar.xz |
Merge branch 'jc/maint-apply-match-beginning'
* jc/maint-apply-match-beginning:
Fix "git apply" to correctly enforce "match at the beginning"
-rw-r--r-- | builtin-apply.c | 29 | ||||
-rwxr-xr-x | t/t4104-apply-boundary.sh | 13 |
2 files changed, 29 insertions, 13 deletions
diff --git a/builtin-apply.c b/builtin-apply.c index b5f78ac3a..abe73a0f8 100644 --- a/builtin-apply.c +++ b/builtin-apply.c @@ -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; diff --git a/t/t4104-apply-boundary.sh b/t/t4104-apply-boundary.sh index 64f34e329..43943ab8c 100755 --- a/t/t4104-apply-boundary.sh +++ b/t/t4104-apply-boundary.sh @@ -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 |