]> Sergey Matveev's repositories - public-inbox.git/commitdiff
content_hash: skip Sender for cross posted messages
authorEric Wong <e@80x24.org>
Sat, 30 Jan 2021 05:41:09 +0000 (23:41 -0600)
committerEric Wong <e@80x24.org>
Sun, 31 Jan 2021 02:11:06 +0000 (02:11 +0000)
This regression was introduced long ago and matches behavior
originally specified in the comments.  It makes a noticeable
improvement with search results using -extindex ("all") and
lei results with multiple inboxes.

Update some style bits at the top of the test case while
we're at it.

Fixes: f0ef0a56a8957d6f ("v2: improve deduplication checks")
lib/PublicInbox/ContentHash.pm
t/content_hash.t

index 838fdd6fcf654907af59ee1c451aebdaaa9b89b2..4dbe7b5049d57290f56d20e6f5a52d50612ed73b 100644 (file)
@@ -68,10 +68,9 @@ sub content_digest ($) {
 
        # Only use Sender: if From is not present
        foreach my $h (qw(From Sender)) {
-               my @v = $eml->header($h);
-               if (@v) {
-                       digest_addr($dig, $h, $_) foreach @v;
-               }
+               my @v = $eml->header($h) or next;
+               digest_addr($dig, $h, $_) foreach @v;
+               last;
        }
        foreach my $h (qw(Subject Date)) {
                my @v = $eml->header($h);
index 3f02b1b34a9a87dba7e794747fe78196a7b7332a..060665f629eedef9c0e45b568adb577d379157a2 100644 (file)
@@ -1,7 +1,8 @@
+#!perl -w
 # Copyright (C) 2018-2021 all contributors <meta@public-inbox.org>
 # License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt>
 use strict;
-use warnings;
+use v5.10.1;
 use Test::More;
 use PublicInbox::ContentHash qw(content_hash);
 use PublicInbox::Eml;
@@ -19,6 +20,17 @@ EOF
 my $orig = content_hash($mime);
 my $reload = content_hash(PublicInbox::Eml->new($mime->as_string));
 is($orig, $reload, 'content_hash matches after serialization');
+{
+       my $s1 = PublicInbox::Eml->new($mime->as_string);
+       $s1->header_set('Sender', 's@example.com');
+       is(content_hash($s1), $orig, "Sender ignored when 'From' present");
+       my $s2 = PublicInbox::Eml->new($s1->as_string);
+       $s1->header_set('Sender', 'sender@example.com');
+       is(content_hash($s2), $orig, "Sender really ignored 'From'");
+       $_->header_set('From') for ($s1, $s2);
+       isnt(content_hash($s1), content_hash($s2),
+               'sender accounted when From missing');
+}
 
 foreach my $h (qw(From To Cc)) {
        my $n = q("Quoted N'Ame" <foo@EXAMPLE.com>);