about summary refs log tree commit homepage
path: root/lib
diff options
context:
space:
mode:
authorEric Wong (Contractor, The Linux Foundation) <e@80x24.org>2018-04-04 21:11:47 +0000
committerEric Wong (Contractor, The Linux Foundation) <e@80x24.org>2018-04-04 21:12:55 +0000
commit2b6580afae0c0449fa536b62c8fbad4408337a3f (patch)
tree161b39df148e553e67e12303440f95c43a0114a5 /lib
parentb8c41362f2a5c8fcc6b1846a79c72bfa77565297 (diff)
downloadpublic-inbox-2b6580afae0c0449fa536b62c8fbad4408337a3f.tar.gz
This allows us to emulate the display of thread-aware MUAs when
multiple messages share the same Message-ID.  This also is a
place where "public-inbox-index --reindex" is useful to fix
existing messages and no schema version bump is necessary.
Diffstat (limited to 'lib')
-rw-r--r--lib/PublicInbox/SearchIdx.pm13
1 files changed, 7 insertions, 6 deletions
diff --git a/lib/PublicInbox/SearchIdx.pm b/lib/PublicInbox/SearchIdx.pm
index 3412a615..06bce70a 100644
--- a/lib/PublicInbox/SearchIdx.pm
+++ b/lib/PublicInbox/SearchIdx.pm
@@ -334,7 +334,7 @@ sub add_message {
                 });
 
                 # populates smsg->references for smsg->to_doc_data
-                my $refs = parse_references($smsg);
+                my $refs = parse_references($smsg, $mid0, $mids);
                 my $data = $smsg->to_doc_data($oid, $mid0);
                 foreach my $mid (@$mids) {
                         $tg->index_text($mid, 1, 'XM');
@@ -463,22 +463,23 @@ sub term_generator { # write-only
         $self->{term_generator} = $tg;
 }
 
-sub parse_references ($) {
-        my ($smsg) = @_;
+sub parse_references ($$$) {
+        my ($smsg, $mid0, $mids) = @_;
         my $mime = $smsg->{mime};
         my $hdr = $mime->header_obj;
         my $refs = references($hdr);
+        push(@$refs, @$mids) if scalar(@$mids) > 1;
         return $refs if scalar(@$refs) == 0;
 
-        # prevent circular references via References here:
-        my %mids = map { $_ => 1 } @{mids($hdr)};
+        # prevent circular references here:
+        my %seen = ( $mid0 => 1 );
         my @keep;
         foreach my $ref (@$refs) {
                 if (length($ref) > PublicInbox::MID::MAX_MID_SIZE) {
                         warn "References: <$ref> too long, ignoring\n";
                         next;
                 }
-                next if $mids{$ref};
+                next if $seen{$ref}++;
                 push @keep, $ref;
         }
         $smsg->{references} = '<'.join('> <', @keep).'>' if @keep;