about summary refs log tree commit homepage
path: root/lib
diff options
context:
space:
mode:
authorEric Wong <e@yhbt.net>2020-05-07 21:05:45 +0000
committerEric Wong <e@yhbt.net>2020-05-09 08:59:10 +0000
commit453dee4881a9c764b09d33f3a827879f2cd3669d (patch)
treee1c5d2fcb1b5e4a7571e9eaf59d6ce6660f3e200 /lib
parent8d1b87f498ea47bb752ea24900372df192d322fb (diff)
downloadpublic-inbox-453dee4881a9c764b09d33f3a827879f2cd3669d.tar.gz
This doesn't make any difference for most multipart
messages (or any single part messages).  However,
this starts having space savings when parts start
nesting.

It also slightly simplifies callers.
Diffstat (limited to 'lib')
-rw-r--r--lib/PublicInbox/MsgIter.pm6
-rw-r--r--lib/PublicInbox/SearchIdx.pm2
-rw-r--r--lib/PublicInbox/View.pm18
-rw-r--r--lib/PublicInbox/WwwAttach.pm4
4 files changed, 16 insertions, 14 deletions
diff --git a/lib/PublicInbox/MsgIter.pm b/lib/PublicInbox/MsgIter.pm
index cd5a5d99..7c28d019 100644
--- a/lib/PublicInbox/MsgIter.pm
+++ b/lib/PublicInbox/MsgIter.pm
@@ -20,12 +20,14 @@ sub em_each_part ($$;$$) {
                 my $i = 0;
                 @parts = map { [ $_, 1, ++$i ] } @parts;
                 while (my $p = shift @parts) {
-                        my ($part, $depth, @idx) = @$p;
+                        my ($part, $depth, $idx) = @$p;
                         my @sub = $part->subparts;
                         if (@sub) {
                                 $depth++;
                                 $i = 0;
-                                @sub = map { [ $_, $depth, @idx, ++$i ] } @sub;
+                                @sub = map {
+                                        [ $_, $depth, "$idx.".(++$i) ]
+                                } @sub;
                                 @parts = (@sub, @parts);
                         } else {
                                 $cb->($p, $cb_arg);
diff --git a/lib/PublicInbox/SearchIdx.pm b/lib/PublicInbox/SearchIdx.pm
index 998341a7..f357a8fa 100644
--- a/lib/PublicInbox/SearchIdx.pm
+++ b/lib/PublicInbox/SearchIdx.pm
@@ -277,7 +277,7 @@ sub index_diff ($$$) {
 }
 
 sub index_xapian { # msg_iter callback
-        my $part = $_[0]->[0]; # ignore $depth and @idx
+        my $part = $_[0]->[0]; # ignore $depth and $idx
         my ($self, $doc) = @{$_[1]};
         my $ct = $part->content_type || 'text/plain';
         my $fn = $part->filename;
diff --git a/lib/PublicInbox/View.pm b/lib/PublicInbox/View.pm
index e42fb362..3328c865 100644
--- a/lib/PublicInbox/View.pm
+++ b/lib/PublicInbox/View.pm
@@ -482,9 +482,8 @@ sub multipart_text_as_html {
 
 sub attach_link ($$$$;$) {
         my ($ctx, $ct, $p, $fn, $err) = @_;
-        my ($part, $depth, @idx) = @$p;
-        my $nl = $idx[-1] > 1 ? "\n" : '';
-        my $idx = join('.', @idx);
+        my ($part, $depth, $idx) = @$p;
+        my $nl = substr($idx, -2) eq '.1' ? '' : "\n"; # like join("\n", ...)
         my $size = bytes::length($part->body);
 
         # hide attributes normally, unless we want to aid users in
@@ -519,8 +518,8 @@ sub add_text_body { # callback for each_part
         my ($p, $ctx) = @_;
         my $upfx = $ctx->{mhref};
         my $ibx = $ctx->{-inbox};
-        # $p - from each_part: [ Email::MIME-like, depth, @idx ]
-        my ($part, $depth, @idx) = @$p;
+        # $p - from each_part: [ Email::MIME-like, depth, $idx ]
+        my ($part, $depth, $idx) = @$p;
         my $ct = $part->content_type || 'text/plain';
         my $fn = $part->filename;
         my ($s, $err) = msg_part_text($part, $ct);
@@ -537,13 +536,14 @@ sub add_text_body { # callback for each_part
         # headers for solver unless some coderepo are configured:
         my $diff;
         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);
+                # diffstat anchors do not link across attachments or messages,
+                # -apfx is just a stable prefix for making diffstat anchors
+                # linkable to the first diff hunk w/o crossing attachments
+                $idx =~ tr!.!/!; # compatibility with previous versions
+                $ctx->{-apfx} = $upfx . $idx;
 
                 # 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/WwwAttach.pm b/lib/PublicInbox/WwwAttach.pm
index 774b38ae..b1009907 100644
--- a/lib/PublicInbox/WwwAttach.pm
+++ b/lib/PublicInbox/WwwAttach.pm
@@ -11,9 +11,9 @@ use PublicInbox::MIME;
 use PublicInbox::MsgIter;
 
 sub get_attach_i { # ->each_part callback
-        my ($part, $depth, @idx) = @{$_[0]};
+        my ($part, $depth, $idx) = @{$_[0]};
         my $res = $_[1];
-        return if join('.', @idx) ne $res->[3]; # $idx
+        return if $idx ne $res->[3]; # [0-9]+(?:\.[0-9]+)+
         $res->[0] = 200;
         my $ct = $part->content_type;
         $ct = parse_content_type($ct) if $ct;