commit f6db314590fc96c0cdbf87367b47da8603e17ae9 from: Neels Hofmeyr date: Fri Oct 30 03:56:10 2020 UTC fix result chunks: add minus above plus failed to shift "empty" positions commit - c672cd5263e14c546a06d2b2132fd05bf20bbca0 commit + f6db314590fc96c0cdbf87367b47da8603e17ae9 blob - 3707ff39d6fbd6d28afc2a01bc56bd367ffec06c blob + 69aea0a6aaf3ddfe78f7567e8a2405ae2d0c81e0 --- lib/diff_main.c +++ lib/diff_main.c @@ -220,6 +220,7 @@ diff_state_add_solved_chunk(struct diff_state *state, struct diff_chunk *new_chunk; enum diff_chunk_type last_t; enum diff_chunk_type new_t; + struct diff_chunk *last; /* Append to solved chunks; make sure that adjacent chunks of same type are combined, and that a minus chunk * never directly follows a plus chunk. */ @@ -277,10 +278,26 @@ diff_state_add_solved_chunk(struct diff_state *state, if (!new_chunk) return NULL; *new_chunk = *chunk; + + /* The new minus chunk indicates to which position on + * the right it corresponds, even though it doesn't add + * any lines on the right. By moving above a plus chunk, + * that position on the right has shifted. */ + last = &result->head[result->len - 1]; + new_chunk->right_start = last->right_start; debug(" - added minus-chunk follows plus-chunk," " put before that plus-chunk\n"); } + + /* That last_t == CHUNK_PLUS indicates to which position on the + * left it corresponds, even though it doesn't add any lines on + * the left. By inserting/extending the prev_last_t == + * CHUNK_MINUS, that position on the left has shifted. */ + last = &result->head[result->len - 1]; + last->left_start = new_chunk->left_start + + new_chunk->left_count; + } else { ARRAYLIST_ADD(new_chunk, *result); if (!new_chunk)