MboxReader is a more appropriate place for it than LeiStore.
return fail($self, "--$opt_key unset for $err");
}
require PublicInbox::MboxLock if $files;
+ require PublicInbox::MboxReader;
return 1 if $fmt eq 'eml';
# XXX: should this handle {gz,bz2,xz}? that's currently in LeiToMail
- require PublicInbox::MboxReader;
PublicInbox::MboxReader->can($fmt) or
return fail($self, "--$opt_key=$fmt unrecognized");
1;
sub mbox_cb {
my ($eml, $self) = @_;
- my @kw = PublicInbox::LeiStore::mbox_keywords($eml);
+ my $kw = PublicInbox::MboxReader::mbox_keywords($eml);
$eml->header_set($_) for qw(Status X-Status);
- $self->{wcb}->(undef, { kw => \@kw }, $eml);
+ $self->{wcb}->(undef, { kw => $kw }, $eml);
}
sub net_cb { # callback for ->imap_each, ->nntp_each
sub _import_eml { # MboxReader callback
my ($eml, $sto, $set_kw) = @_;
- $sto->ipc_do('set_eml', $eml, $set_kw ? $sto->mbox_keywords($eml) : ());
+ $sto->ipc_do('set_eml', $eml, $set_kw ?
+ @{PublicInbox::MboxReader::mbox_keywords($eml)} : ());
}
sub import_done_wait { # dwaitpid callback
\@docids;
}
-# cf: https://doc.dovecot.org/configuration_manual/mail_location/mbox/
-my %status2kw = (F => 'flagged', A => 'answered', R => 'seen', T => 'draft');
-# O (old/non-recent), and D (deleted) aren't in JMAP,
-# so probably won't be supported by us.
-sub mbox_keywords {
- my $eml = $_[-1];
- my $s = "@{[$eml->header_raw('X-Status'),$eml->header_raw('Status')]}";
- my %kw;
- $s =~ s/([FART])/$kw{$status2kw{$1}} = 1/sge;
- sort(keys %kw);
-}
-
# TODO: move this to MdirReader, maybe...
# cf: https://cr.yp.to/proto/maildir.html
my %c2kw = ('D' => 'draft', F => 'flagged', R => 'answered', S => 'seen');
sub _mbox_augment_kw_maybe {
my ($eml, $lei, $lse, $augment) = @_;
- my @kw = PublicInbox::LeiStore::mbox_keywords($eml);
- update_kw_maybe($lei, $lse, $eml, \@kw);
+ my $kw = PublicInbox::MboxReader::mbox_keywords($eml);
+ update_kw_maybe($lei, $lse, $eml, $kw);
_augment($eml, $lei) if $augment;
}
my $from_strict =
qr/^From \S+ +\S+ \S+ +\S+ [^\n:]+:[^\n:]+:[^\n:]+ [^\n:]+\n/sm;
+# cf: https://doc.dovecot.org/configuration_manual/mail_location/mbox/
+my %status2kw = (F => 'flagged', A => 'answered', R => 'seen', T => 'draft');
+# O (old/non-recent), and D (deleted) aren't in JMAP,
+# so probably won't be supported by us.
+sub mbox_keywords {
+ my $eml = $_[-1];
+ my $s = "@{[$eml->header_raw('X-Status'),$eml->header_raw('Status')]}";
+ my %kw;
+ $s =~ s/([FART])/$kw{$status2kw{$1}} = 1/sge;
+ [ sort(keys %kw) ];
+}
+
sub _mbox_from {
my ($mbfh, $from_re, $eml_cb, @arg) = @_;
my $buf = '';
my $eml = eml_load('t/data/0001.patch');
is($sto->add_eml($eml), undef, 'idempotent');
$sto->done;
-is_deeply([$sto->mbox_keywords($eml)], [], 'no keywords');
-$eml->header_set('Status', 'RO');
-is_deeply([$sto->mbox_keywords($eml)], ['seen'], 'seen extracted');
-$eml->header_set('X-Status', 'A');
-is_deeply([$sto->mbox_keywords($eml)], [qw(answered seen)],
- 'seen+answered extracted');
-$eml->header_set($_) for qw(Status X-Status);
-
is_deeply([$sto->maildir_keywords('/foo:2,')], [], 'Maildir no keywords');
is_deeply([$sto->maildir_keywords('/foo:2,S')], ['seen'], 'Maildir seen');
is_deeply([$sto->maildir_keywords('/foo:2,RS')], ['answered', 'seen'],
(("b: ".('b' x 72)."\n") x 1000) .
"From hell\n",
);
+{
+ my $eml = PublicInbox::Eml->new($raw{small});
+ my $mbox_keywords = PublicInbox::MboxReader->can('mbox_keywords');
+ is_deeply($mbox_keywords->($eml), [], 'no keywords');
+ $eml->header_set('Status', 'RO');
+ is_deeply($mbox_keywords->($eml), ['seen'], 'seen extracted');
+ $eml->header_set('X-Status', 'A');
+ is_deeply($mbox_keywords->($eml), [qw(answered seen)],
+ 'seen+answered extracted');
+}
if ($ENV{TEST_EXTRA}) {
for my $fn (glob('t/*.eml'), glob('t/*/*.{patch,eml}')) {