about summary refs log tree commit homepage
diff options
context:
space:
mode:
-rw-r--r--lib/PublicInbox/InboxWritable.pm22
-rw-r--r--lib/PublicInbox/WatchMaildir.pm12
2 files changed, 26 insertions, 8 deletions
diff --git a/lib/PublicInbox/InboxWritable.pm b/lib/PublicInbox/InboxWritable.pm
index 7fb5a150..752f1997 100644
--- a/lib/PublicInbox/InboxWritable.pm
+++ b/lib/PublicInbox/InboxWritable.pm
@@ -9,7 +9,7 @@ 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);
+our @EXPORT_OK = qw(eml_from_path warn_ignore_cb);
 
 use constant {
         PERM_UMASK => 0,
@@ -278,4 +278,24 @@ sub cleanup ($) {
         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;
diff --git a/lib/PublicInbox/WatchMaildir.pm b/lib/PublicInbox/WatchMaildir.pm
index 7d4139a5..142118bd 100644
--- a/lib/PublicInbox/WatchMaildir.pm
+++ b/lib/PublicInbox/WatchMaildir.pm
@@ -7,7 +7,7 @@ package PublicInbox::WatchMaildir;
 use strict;
 use warnings;
 use PublicInbox::Eml;
-use PublicInbox::InboxWritable qw(eml_from_path);
+use PublicInbox::InboxWritable qw(eml_from_path warn_ignore_cb);
 use PublicInbox::Filter::Base qw(REJECT);
 use PublicInbox::Spamcheck;
 use PublicInbox::Sigfd;
@@ -154,6 +154,7 @@ sub _remove_spam {
         # path must be marked as (S)een
         $path =~ /:2,[A-R]*S[T-Za-z]*\z/ or return;
         my $eml = eml_from_path($path) or return;
+        local $SIG{__WARN__} = warn_ignore_cb();
         $self->{config}->each_inbox(\&remove_eml_i, [ $self, $eml, $path ]);
 }
 
@@ -197,10 +198,7 @@ sub _try_path {
                 return;
         }
         my $warn_cb = $SIG{__WARN__} || sub { print STDERR @_ };
-        local $SIG{__WARN__} = sub {
-                $warn_cb->("path: $path\n");
-                $warn_cb->(@_);
-        };
+        local $SIG{__WARN__} = sub { $warn_cb->("path: $path\n", @_) };
         if (!ref($inboxes) && $inboxes eq 'watchspam') {
                 return _remove_spam($self, $path);
         }
@@ -393,6 +391,7 @@ sub imap_import_msg ($$$$) {
                         my $x = import_eml($self, $ibx, $eml);
                 }
         } elsif ($inboxes eq 'watchspam') {
+                local $SIG{__WARN__} = warn_ignore_cb();
                 my $eml = PublicInbox::Eml->new($raw);
                 my $arg = [ $self, $eml, "$url UID:$uid" ];
                 $self->{config}->each_inbox(\&remove_eml_i, $arg);
@@ -445,8 +444,7 @@ sub imap_fetch_all ($$$) {
         my $warn_cb = $SIG{__WARN__} || sub { print STDERR @_ };
         local $SIG{__WARN__} = sub {
                 $batch //= '?';
-                $warn_cb->("$url UID:$batch\n");
-                $warn_cb->(@_);
+                $warn_cb->("$url UID:$batch\n", @_);
         };
         my $err;
         do {