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 <[email protected]>
---
 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 [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to