From 2b6580afae0c0449fa536b62c8fbad4408337a3f Mon Sep 17 00:00:00 2001 From: "Eric Wong (Contractor, The Linux Foundation)" Date: Wed, 4 Apr 2018 21:11:47 +0000 Subject: [PATCH] searchidx: ensure duplicated Message-IDs can be linked together 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. --- lib/PublicInbox/SearchIdx.pm | 13 +++++++------ t/psgi_v2.t | 3 +++ 2 files changed, 10 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; diff --git a/t/psgi_v2.t b/t/psgi_v2.t index aa3279cc..bdf23deb 100644 --- a/t/psgi_v2.t +++ b/t/psgi_v2.t @@ -182,6 +182,9 @@ test_psgi(sub { $www->call(@_) }, sub { $res = $cb->(GET('/v2test/reuse@mid/T/')); $raw = $res->content; like($raw, qr/\b4\+ messages\b/, 'thread overview shown with /T/'); + my @over = ($raw =~ m/^\d{4}-\d+-\d+\s+\d+:\d+ (.+)$/gm); + is_deeply(\@over, [ '(GET('/v2test/reuse@mid/t/')); $raw = $res->content; -- 2.44.0