# Extends read-only Inbox for writing
package PublicInbox::InboxWritable;
use strict;
-use warnings;
-use base qw(PublicInbox::Inbox);
+use v5.10.1;
+use parent qw(PublicInbox::Inbox Exporter);
use PublicInbox::Import;
use PublicInbox::Filter::Base qw(REJECT);
+use Errno qw(ENOENT);
+our @EXPORT_OK = qw(eml_from_path warn_ignore_cb);
use constant {
PERM_UMASK => 0,
(is_maildir_basename($p[-1]) && -f $path) ? 1 : 0;
}
-sub mime_from_path ($) {
+sub eml_from_path ($) {
my ($path) = @_;
if (open my $fh, '<', $path) {
- local $/;
- my $str = <$fh>;
- $str or return;
- return PublicInbox::Eml->new(\$str);
- } elsif ($!{ENOENT}) {
- # common with Maildir
- return;
- } else {
- warn "failed to open $path: $!\n";
- return;
+ my $str = do { local $/; <$fh> } or return;
+ PublicInbox::Eml->new(\$str);
+ } else { # ENOENT is common with Maildir
+ warn "failed to open $path: $!\n" if $! != ENOENT;
+ undef;
}
}
opendir my $dh, "$dir/$sub" or die "opendir $dir/$sub: $!\n";
while (defined(my $fn = readdir($dh))) {
next unless is_maildir_basename($fn);
- my $mime = mime_from_path("$dir/$fn") or next;
+ my $mime = eml_from_path("$dir/$fn") or next;
if (my $filter = $self->filter($im)) {
my $ret = $filter->scrub($mime) or return;
delete @{$_[0]}{qw(over mm git search)};
}
+# warnings to ignore when handling spam mailboxes and maybe other places
+sub warn_ignore {
+ my $s = "@_";
+ # Email::Address::XS warnings
+ $s =~ /^Argument contains empty address at /
+ || $s =~ /^Element at index [0-9]+ contains /
+ # PublicInbox::MsgTime
+ || $s =~ /^bogus TZ offset: .+?, ignoring and assuming \+0000/
+ || $s =~ /^bad Date: .+? in /
+}
+
+# this expects to be RHS in this assignment: "local $SIG{__WARN__} = ..."
+sub warn_ignore_cb {
+ my $cb = $SIG{__WARN__} // sub { print STDERR @_ };
+ sub {
+ return if warn_ignore(@_);
+ $cb->(@_);
+ }
+}
+
1;