From: Phillip Wood Date: Tue, 04 Sep 2018 13:52:58 GMT Subject: [PATCH] diff: fix --color-moved-ws=allow-indentation-change Message-ID: <20180904135258.31300-1-phillip.wood@talktalk.net> From: Phillip Wood If there is more than one potential moved block and the longest block is not the first element of the array of potential blocks then the block is cut short. With --color-moved=blocks this can leave moved lines unpainted if the shortened block does not meet the block length requirement. With --color-moved=zebra then in addition to the unpainted lines the moved color can change in the middle of a single block. Fix this by freeing the whitespace delta of the match we're discarding rather than the one we're keeping. Signed-off-by: Phillip Wood --- While I was working on this I spotted a couple of other issues I don't have time to fix myself at the moment, so I thought I mention them in case someone else wants to pick them up 1) I think there is a potential memory leak at the end of mark_color_as_moved(). If pmb_nr > 0 then the whitespace deltas need freeing before freeing pmb itself. 2) The documentation could be improved to explain that allow-indentation-change does not work with indentation that contains a mix of tabs and spaces and the motivation for that (python?) [I've got some code to add an option that supports that which I'll post when I've written some tests after 2.19 is released] diff.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/diff.c b/diff.c index 145cfbae5..4e8f725bb 100644 --- a/diff.c +++ b/diff.c @@ -968,8 +968,13 @@ static void pmb_advance_or_null_multi_match(struct diff_options *o, /* Carry the white space delta forward */ pmb[i]->next_line->wsd = pmb[i]->wsd; pmb[i] = pmb[i]->next_line; - } else + } else { + if (pmb[i]->wsd) { + free(pmb[i]->wsd->string); + FREE_AND_NULL(pmb[i]->wsd); + } pmb[i] = NULL; + } } } @@ -990,10 +995,6 @@ static int shrink_potential_moved_blocks(struct moved_entry **pmb, if (lp < pmb_nr && rp > -1 && lp < rp) { pmb[lp] = pmb[rp]; - if (pmb[rp]->wsd) { - free(pmb[rp]->wsd->string); - FREE_AND_NULL(pmb[rp]->wsd); - } pmb[rp] = NULL; rp--; lp++; -- 2.18.0