about summary refs log tree commit homepage
diff options
context:
space:
mode:
authorEric Wong <e@yhbt.net>2020-05-06 10:40:54 +0000
committerEric Wong <e@yhbt.net>2020-05-07 19:09:43 +0000
commitc2bc9ebcb770a27823d8e989707f434826333b0e (patch)
tree4186ab7ca6cae110e1262acd95c8d7eeb9b287da
parent65b37aeb8392a62e9aa8ceac08227c77c6fa6b8b (diff)
downloadpublic-inbox-c2bc9ebcb770a27823d8e989707f434826333b0e.tar.gz
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.
-rw-r--r--lib/PublicInbox/View.pm7
-rw-r--r--lib/PublicInbox/ViewDiff.pm4
2 files changed, 8 insertions, 3 deletions
diff --git a/lib/PublicInbox/View.pm b/lib/PublicInbox/View.pm
index 5144a130..f7a8ae32 100644
--- a/lib/PublicInbox/View.pm
+++ b/lib/PublicInbox/View.pm
@@ -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;
diff --git a/lib/PublicInbox/ViewDiff.pm b/lib/PublicInbox/ViewDiff.pm
index 34df8ad4..6fe9a0d7 100644
--- a/lib/PublicInbox/ViewDiff.pm
+++ b/lib/PublicInbox/ViewDiff.pm
@@ -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) {