]> Sergey Matveev's repositories - public-inbox.git/commitdiff
viewdiff: stricter highlighting and linkification check
authorEric Wong <e@yhbt.net>
Wed, 6 May 2020 10:40:54 +0000 (10:40 +0000)
committerEric Wong <e@yhbt.net>
Thu, 7 May 2020 19:09:43 +0000 (19:09 +0000)
Sometimes senders draw ASCII tables and such which we
get fooled into attempting highlighting and diffstat
anchoring.

We now require 3 consecutive diff header lines:

/^--- /, /^\Q+++\E /, and /^@@ /

to enable diff highlighting (whether generated with git or not).
The presence of a line matching /^diff / is not sufficient or
even useful to us for highlighting diffs, since that could just
be part of a line-wrapped sentence.

However, we'll now check for the presence of a line matching
/^diff --git / before enabling diffstat anchors.  Otherwise
cover letters for a patch series may fool us into creating
anchors for diffstats.

lib/PublicInbox/View.pm
lib/PublicInbox/ViewDiff.pm

index 5144a13046081eaefe53a39686341427a38faeb4..f7a8ae3289337279c68c1e48e452eb9049be857f 100644 (file)
@@ -536,11 +536,14 @@ sub add_text_body { # callback for msg_iter
        # always support diff-highlighting, but we can't linkify hunk
        # headers for solver unless some coderepo are configured:
        my $diff;
-       if ($s =~ /^(?:diff|---|\+{3}) /ms) {
+       if ($s =~ /^--- [^\n]+\n\+{3} [^\n]+\n@@ /ms) {
                # diffstat anchors do not link across attachments or messages:
                $idx[0] = $upfx . $idx[0] if $upfx ne '';
                $ctx->{-apfx} = join('/', @idx);
-               $ctx->{-anchors} = {}; # attr => filename
+
+               # do attr => filename mappings for diffstats in git diffs:
+               $ctx->{-anchors} = {} if $s =~ /^diff --git /sm;
+
                $diff = 1;
                delete $ctx->{-long_path};
                my $spfx;
index 34df8ad447c53a78460eb04c479f97be7c033262..6fe9a0d7610e5a345ede4c74abd362514502ce61 100644 (file)
@@ -165,10 +165,12 @@ sub diff_before_or_after ($$) {
        my ($ctx, $x) = @_;
        my $linkify = $ctx->{-linkify};
        my $dst = $ctx->{obuf};
+       my $anchors = exists($ctx->{-anchors}) ? 1 : 0;
        for my $y (split(/(^---\n)/sm, $$x)) {
                if ($y =~ /\A---\n\z/s) {
                        $$dst .= "---\n"; # all HTML is "\r\n" => "\n"
-               } elsif ($y =~ /^ [0-9]+ files? changed, /sm) {
+                       $anchors |= 2;
+               } elsif ($anchors == 3 && $y =~ /^ [0-9]+ files? changed, /sm) {
                        # ok, looks like a diffstat, go line-by-line:
                        for my $l (split(/^/m, $y)) {
                                if ($l =~ /^ (.+)( +\| .*\z)/s) {