about summary refs log tree commit homepage
path: root/lib/PublicInbox/ViewDiff.pm
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2022-09-10 08:17:16 +0000
committerEric Wong <e@80x24.org>2022-09-10 19:50:46 +0000
commitdc5314822113431d90dd0c65d3a1a22ea31f7c3b (patch)
treeb92df03fa06366635d93876ed6a3a128d0218ed6 /lib/PublicInbox/ViewDiff.pm
parent03673adef5a74f7ebd6be960187e5e8592779900 (diff)
downloadpublic-inbox-dc5314822113431d90dd0c65d3a1a22ea31f7c3b.tar.gz
view: switch a few things to ctx->zmore
Unfortunately, this is actually slower.  However, this
hopefully makes it easier to improve the internals and
make performance improvements down the line.
Diffstat (limited to 'lib/PublicInbox/ViewDiff.pm')
-rw-r--r--lib/PublicInbox/ViewDiff.pm45
1 files changed, 21 insertions, 24 deletions
diff --git a/lib/PublicInbox/ViewDiff.pm b/lib/PublicInbox/ViewDiff.pm
index 076aa1af..36601910 100644
--- a/lib/PublicInbox/ViewDiff.pm
+++ b/lib/PublicInbox/ViewDiff.pm
@@ -156,10 +156,7 @@ sub diff_header ($$$) {
                 warn "BUG? <$$x> had no ^index line";
         }
         $$x =~ s!^diff --git!anchor1($ctx, $pb) // 'diff --git'!ems;
-        my $dst = $ctx->{obuf};
-        $$dst .= qq(<span\nclass="head">);
-        $$dst .= $$x;
-        $$dst .= '</span>';
+        $ctx->zmore(qq(<span\nclass="head">$$x</span>));
         $dctx;
 }
 
@@ -182,9 +179,10 @@ sub diff_before_or_after ($$) {
                 my $ch = $ctx->{changed_href} // '#related';
                 $$x .= qq(<a href="$ch">changed</a>,);
                 $$x .= ascii_html(pop @x); # $4: insertions/deletions
-                $$x .= $lnk->to_html(pop @x); # notes, commit message, etc
+                # notes, commit message, etc
+                $ctx->zmore($$x .= $lnk->to_html(pop @x));
         } else {
-                $ctx->{-linkify}->to_html($$x);
+                $ctx->zmore($ctx->{-linkify}->to_html($$x));
         }
 }
 
@@ -195,8 +193,7 @@ sub flush_diff ($$) {
         my @top = split($EXTRACT_DIFFS, $$cur);
         undef $$cur; # free memory
 
-        my $linkify = $ctx->{-linkify};
-        my $dst = $ctx->{obuf};
+        my $lnk = $ctx->{-linkify};
         my $dctx; # {}, keys: Q, oid_a, oid_b
 
         while (defined(my $x = shift @top)) {
@@ -223,28 +220,28 @@ sub flush_diff ($$) {
                                 if (!defined($dctx)) {
                                         $after .= $s;
                                 } elsif ($s =~ s/\A@@ (\S+) (\S+) @@//) {
-                                        $$dst .= qq(<span\nclass="hunk">);
-                                        $$dst .= diff_hunk($dctx, $1, $2);
-                                        $$dst .= $linkify->to_html($s);
-                                        $$dst .= '</span>';
-                                } elsif ($s =~ /\A\+/) {
-                                        $$dst .= qq(<span\nclass="add">);
-                                        $$dst .= $linkify->to_html($s);
-                                        $$dst .= '</span>';
+                                        $ctx->zmore(qq(<span\nclass="hunk">) .
+                                                diff_hunk($dctx, $1, $2) .
+                                                $lnk->to_html($s) .
+                                                '</span>');
+                                } elsif ($s =~ /\A\+/) { # $s may be huge
+                                        $ctx->zmore(qq(<span\nclass="add">),
+                                                        $lnk->to_html($s),
+                                                        '</span>');
                                 } elsif ($s =~ /\A-- $/sm) { # email sig starts
                                         $dctx = undef;
                                         $after .= $s;
-                                } elsif ($s =~ /\A-/) {
-                                        $$dst .= qq(<span\nclass="del">);
-                                        $$dst .= $linkify->to_html($s);
-                                        $$dst .= '</span>';
-                                } else {
-                                        $$dst .= $linkify->to_html($s);
+                                } elsif ($s =~ /\A-/) { # $s may be huge
+                                        $ctx->zmore(qq(<span\nclass="del">),
+                                                $lnk->to_html($s),
+                                                '</span>');
+                                } else { # $s may be huge
+                                        $ctx->zmore($lnk->to_html($s));
                                 }
                         }
-                        $$dst .= diff_before_or_after($ctx, \$after) if !$dctx;
+                        diff_before_or_after($ctx, \$after) if !$dctx;
                 } else {
-                        $$dst .= diff_before_or_after($ctx, \$x);
+                        diff_before_or_after($ctx, \$x);
                 }
         }
 }