]> git.ipfire.org Git - thirdparty/git.git/commitdiff
apply --allow-overlap: fix a corner case
authorJohannes Schindelin <johannes.schindelin@gmx.de>
Fri, 6 Dec 2019 13:08:25 +0000 (13:08 +0000)
committerJunio C Hamano <gitster@pobox.com>
Fri, 6 Dec 2019 16:57:34 +0000 (08:57 -0800)
Yes, yes, this is supposed to be only a band-aid option for `git add -p`
not Doing The Right Thing. But as long as we carry the `--allow-overlap`
option, we might just as well get it right.

This fixes the case where one hunk inserts a line before the first line,
and is followed by a hunk whose context overlaps with the first one's
and which appends a line at the end.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
apply.c

diff --git a/apply.c b/apply.c
index f8a046a6a5acbd36d14ca85b39e43b19c1d8e9c5..720a631eaa05a1d15d863c659b0031cb4ccea9b7 100644 (file)
--- a/apply.c
+++ b/apply.c
@@ -2661,6 +2661,16 @@ static int find_pos(struct apply_state *state,
        unsigned long backwards, forwards, current;
        int backwards_lno, forwards_lno, current_lno;
 
+       /*
+        * When running with --allow-overlap, it is possible that a hunk is
+        * seen that pretends to start at the beginning (but no longer does),
+        * and that *still* needs to match the end. So trust `match_end` more
+        * than `match_beginning`.
+        */
+       if (state->allow_overlap && match_beginning && match_end &&
+           img->nr - preimage->nr != 0)
+               match_beginning = 0;
+
        /*
         * If match_beginning or match_end is specified, there is no
         * point starting from a wrong line that will never match and