about summary refs log tree commit homepage
path: root/lib/PublicInbox/LeiStore.pm
diff options
context:
space:
mode:
Diffstat (limited to 'lib/PublicInbox/LeiStore.pm')
-rw-r--r--lib/PublicInbox/LeiStore.pm20
1 files changed, 16 insertions, 4 deletions
diff --git a/lib/PublicInbox/LeiStore.pm b/lib/PublicInbox/LeiStore.pm
index 43fddf6d..c8b9d75e 100644
--- a/lib/PublicInbox/LeiStore.pm
+++ b/lib/PublicInbox/LeiStore.pm
@@ -15,8 +15,8 @@ use PublicInbox::ExtSearchIdx;
 use PublicInbox::Import;
 use PublicInbox::InboxWritable;
 use PublicInbox::V2Writable;
-use PublicInbox::ContentHash qw(content_hash);
-use PublicInbox::MID qw(mids);
+use PublicInbox::ContentHash qw(content_hash content_digest);
+use PublicInbox::MID qw(mids mids_in);
 use PublicInbox::LeiSearch;
 use List::Util qw(max);
 
@@ -107,14 +107,26 @@ sub eidx_init {
         $eidx;
 }
 
+# when a message has no Message-IDs at all, this is needed for
+# unsent Draft messages, at least
+sub _fake_mid_for ($$) {
+        my ($eml, $dig) = @_;
+        my $mids = mids_in($eml, qw(X-Alt-Message-ID Resent-Message-ID));
+        $eml->{-lei_fake_mid} =
+                $mids->[0] // PublicInbox::Import::digest2mid($dig, $eml);
+}
+
 sub _docids_for ($$) {
         my ($self, $eml) = @_;
         my %docids;
-        my $chash = content_hash($eml);
+        my $dig = content_digest($eml);
+        my $chash = $dig->clone->digest;
         my $eidx = eidx_init($self);
         my $oidx = $eidx->{oidx};
         my $im = $self->{im};
-        for my $mid (@{mids($eml)}) {
+        my $mids = mids($eml);
+        $mids->[0] //= _fake_mid_for($eml, $dig);
+        for my $mid (@$mids) {
                 my ($id, $prev);
                 while (my $cur = $oidx->next_by_mid($mid, \$id, \$prev)) {
                         my $oid = $cur->{blob};