diff options
author | Johannes Schindelin <johannes.schindelin@gmx.de> | 2019-12-06 13:08:25 +0000 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2019-12-06 08:57:34 -0800 |
commit | b4bbbbd5a247e0e75d079bca591b657ec9084a46 (patch) | |
tree | c575eff7b820e1524541268242d8b9965050831b | |
parent | git add -p: use non-zero exit code when the diff generation failed (diff) | |
download | tgif-b4bbbbd5a247e0e75d079bca591b657ec9084a46.tar.xz |
apply --allow-overlap: fix a corner case
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>
-rw-r--r-- | apply.c | 10 |
1 files changed, 10 insertions, 0 deletions
@@ -2662,6 +2662,16 @@ static int find_pos(struct apply_state *state, 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 * wander around and wait for a match at the specified end. |