Currently the diff-highlight script does not try to highlight hunks that have different numbers of removed/added lines. But we can be a little smarter than that, without introducing much magic and complexity. In the case of unevenly-sized hunks, we could still highlight the first few (lexicographical) add/remove pairs. It is not uncommon for hunks to have common "prefixes", and in such a case this change is very useful for spotting differences. Signed-off-by: Patrick Palka <patrick@xxxxxxxxxxxx> --- contrib/diff-highlight/diff-highlight | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/contrib/diff-highlight/diff-highlight b/contrib/diff-highlight/diff-highlight index ffefc31..0dfbebd 100755 --- a/contrib/diff-highlight/diff-highlight +++ b/contrib/diff-highlight/diff-highlight @@ -88,22 +88,30 @@ sub show_hunk { return; } - # If we have mismatched numbers of lines on each side, we could try to - # be clever and match up similar lines. But for now we are simple and - # stupid, and only handle multi-line hunks that remove and add the same - # number of lines. - if (@$a != @$b) { - print @$a, @$b; - return; - } + # We match up the first MIN(a, b) lines on each side. + my $c = @$a < @$b ? @$a : @$b; + # Highlight each pair, and print each removed line of that pair. my @queue; - for (my $i = 0; $i < @$a; $i++) { + for (my $i = 0; $i < $c; $i++) { my ($rm, $add) = highlight_pair($a->[$i], $b->[$i]); print $rm; push @queue, $add; } + + # Print the remaining unmatched removed lines of the hunk. + for (my $i = $c; $i < @$a; $i++) { + print $a->[$i]; + } + + # Print the added lines of each highlighted pair. print @queue; + + # Print the remaining unmatched added lines of the hunk. + for (my $i = $c; $i < @$b; $i++) { + print $b->[$i]; + } + } sub highlight_pair { -- 2.4.3.413.ga5fe668 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html