]> Sergey Matveev's repositories - public-inbox.git/blobdiff - lib/PublicInbox/WatchMaildir.pm
watch: quiet some warnings on spam mailboxes
[public-inbox.git] / lib / PublicInbox / WatchMaildir.pm
index 7547f6e4761f20008486d2642fd458a186917885..142118bd759018865a0af452e22b49b033dc2759 100644 (file)
@@ -7,7 +7,7 @@ package PublicInbox::WatchMaildir;
 use strict;
 use warnings;
 use PublicInbox::Eml;
-use PublicInbox::InboxWritable;
+use PublicInbox::InboxWritable qw(eml_from_path warn_ignore_cb);
 use PublicInbox::Filter::Base qw(REJECT);
 use PublicInbox::Spamcheck;
 use PublicInbox::Sigfd;
@@ -15,7 +15,6 @@ use PublicInbox::DS qw(now);
 use PublicInbox::MID qw(mids);
 use PublicInbox::ContentHash qw(content_hash);
 use POSIX qw(_exit);
-*mime_from_path = \&PublicInbox::InboxWritable::mime_from_path;
 
 sub compile_watchheaders ($) {
        my ($ibx) = @_;
@@ -124,8 +123,10 @@ sub new {
 sub _done_for_now {
        my ($self) = @_;
        local $PublicInbox::DS::in_loop = 0; # waitpid() synchronously
-       for (values %{$self->{importers}}) {
-               $_->done if $_; # $_ may be undef during cleanup
+       for my $im (values %{$self->{importers}}) {
+               next if !$im; # $im may be undef during cleanup
+               eval { $im->done };
+               warn "$im->{ibx}->{name} ->done: $@\n" if $@;
        }
 }
 
@@ -137,43 +138,51 @@ sub remove_eml_i { # each_inbox callback
                $im->remove($eml, 'spam');
                if (my $scrub = $ibx->filter($im)) {
                        my $scrubbed = $scrub->scrub($eml, 1);
-                       $scrubbed or return;
-                       $scrubbed == REJECT() and return;
-                       $im->remove($scrubbed, 'spam');
+                       if ($scrubbed && $scrubbed != REJECT) {
+                               $im->remove($scrubbed, 'spam');
+                       }
                }
        };
-       warn "error removing spam at: $loc from $ibx->{name}: $@\n" if $@;
+       if ($@) {
+               warn "error removing spam at: $loc from $ibx->{name}: $@\n";
+               _done_for_now($self);
+       }
 }
 
 sub _remove_spam {
        my ($self, $path) = @_;
        # path must be marked as (S)een
        $path =~ /:2,[A-R]*S[T-Za-z]*\z/ or return;
-       my $eml = mime_from_path($path) 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 ]);
 }
 
 sub import_eml ($$$) {
        my ($self, $ibx, $eml) = @_;
-       my $im = _importer_for($self, $ibx);
 
        # any header match means it's eligible for the inbox:
        if (my $watch_hdrs = $ibx->{-watchheaders}) {
                my $ok;
-               my $hdr = $eml->header_obj;
                for my $wh (@$watch_hdrs) {
-                       my @v = $hdr->header_raw($wh->[0]);
+                       my @v = $eml->header_raw($wh->[0]);
                        $ok = grep(/$wh->[1]/, @v) and last;
                }
                return unless $ok;
        }
-
-       if (my $scrub = $ibx->filter($im)) {
-               my $ret = $scrub->scrub($eml) or return;
-               $ret == REJECT() and return;
-               $eml = $ret;
+       eval {
+               my $im = _importer_for($self, $ibx);
+               if (my $scrub = $ibx->filter($im)) {
+                       my $scrubbed = $scrub->scrub($eml) or return;
+                       $scrubbed == REJECT and return;
+                       $eml = $scrubbed;
+               }
+               $im->add($eml, $self->{spamcheck});
+       };
+       if ($@) {
+               warn "$ibx->{name} add failed: $@\n";
+               _done_for_now($self);
        }
-       $im->add($eml, $self->{spamcheck});
 }
 
 sub _try_path {
@@ -189,15 +198,12 @@ 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);
        }
        foreach my $ibx (@$inboxes) {
-               my $eml = mime_from_path($path) or next;
+               my $eml = eml_from_path($path) or next;
                import_eml($self, $ibx, $eml);
        }
 }
@@ -385,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);
@@ -437,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 {