lib/PublicInbox/Admin.pm | 7 +++---- lib/PublicInbox/Eml.pm | 19 +++++++++++++++++++ lib/PublicInbox/InboxWritable.pm | 24 +----------------------- lib/PublicInbox/LeiToMail.pm | 1 + lib/PublicInbox/Watch.pm | 14 ++++++-------- diff --git a/lib/PublicInbox/Admin.pm b/lib/PublicInbox/Admin.pm index f96397ea7534e7d985892d577dad657b3025288b..3b38a5a337d7f1dae23ce1165e320a6d69ba0670 100644 --- a/lib/PublicInbox/Admin.pm +++ b/lib/PublicInbox/Admin.pm @@ -10,6 +10,7 @@ our @EXPORT_OK = qw(setup_signals); use PublicInbox::Config; use PublicInbox::Inbox; use PublicInbox::Spawn qw(popen_rd); +use PublicInbox::Eml; *rel2abs_collapsed = \&PublicInbox::Config::rel2abs_collapsed; sub setup_signals { @@ -241,12 +242,10 @@ $pr->("indexing $ibx->{inboxdir} ...\n"); } local %SIG = %SIG; setup_signals(\&index_terminate, $ibx); - my $warn_cb = $SIG{__WARN__} // \&CORE::warn; my $idx = { current_info => $ibx->{inboxdir} }; - my $warn_ignore = PublicInbox::InboxWritable->can('warn_ignore'); local $SIG{__WARN__} = sub { - return if $warn_ignore->(@_); - $warn_cb->($idx->{current_info}, ': ', @_); + return if PublicInbox::Eml::warn_ignore(@_); + warn($idx->{current_info}, ': ', @_); }; if (ref($ibx) && $ibx->version == 2) { eval { require PublicInbox::V2Writable }; diff --git a/lib/PublicInbox/Eml.pm b/lib/PublicInbox/Eml.pm index bd27f19b0eba0322729fea031d55577b0f1b0dd4..f7f62e7b26c36be34b26493acc2afad49d6bb470 100644 --- a/lib/PublicInbox/Eml.pm +++ b/lib/PublicInbox/Eml.pm @@ -477,6 +477,25 @@ } sub crlf { $_[0]->{crlf} // "\n" } +# 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 / + # Encode::Unicode::UTF7 + || $s =~ /^Bad UTF7 data escape at / +} + +# this expects to be RHS in this assignment: "local $SIG{__WARN__} = ..." +sub warn_ignore_cb { + my $cb = $SIG{__WARN__} // \&CORE::warn; + sub { $cb->(@_) unless warn_ignore(@_) } +} + sub willneed { re_memo($_) for @_ } willneed(qw(From To Cc Date Subject Content-Type In-Reply-To References diff --git a/lib/PublicInbox/InboxWritable.pm b/lib/PublicInbox/InboxWritable.pm index 982ad6e59d6afc43c265c0b4e454878985238094..3a4012cd6ac4dcc8f6cb5be9c5f2a14dfe741146 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 warn_ignore_cb); +our @EXPORT_OK = qw(eml_from_path); use constant { PERM_UMASK => 0, @@ -275,28 +275,6 @@ } 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 / - # Encode::Unicode::UTF7 - || $s =~ /^Bad UTF7 data escape at / -} - -# this expects to be RHS in this assignment: "local $SIG{__WARN__} = ..." -sub warn_ignore_cb { - my $cb = $SIG{__WARN__} // \&CORE::warn; - sub { - return if warn_ignore(@_); - $cb->(@_); - } } # v2+ only, XXX: maybe we can just rely on ->max_git_epoch and remove diff --git a/lib/PublicInbox/LeiToMail.pm b/lib/PublicInbox/LeiToMail.pm index 5a6f18fb4491205e003c763bee2b9fdc3e6bfd3a..1f815e4079e9d7e9419194baa1f9b74482aa7408 100644 --- a/lib/PublicInbox/LeiToMail.pm +++ b/lib/PublicInbox/LeiToMail.pm @@ -472,6 +472,7 @@ $lei->{1} = $zpipe->[1]; close $zpipe->[0]; } $self->{wcb} = $self->write_cb($lei); + $SIG{__WARN__} = PublicInbox::Eml::warn_ignore_cb(); $self->SUPER::ipc_atfork_child; } diff --git a/lib/PublicInbox/Watch.pm b/lib/PublicInbox/Watch.pm index 2b44ba430cfb957692da367a0550431f1809ebc6..185e5da8bd16842ececa54dbfd87855a2758faea 100644 --- a/lib/PublicInbox/Watch.pm +++ b/lib/PublicInbox/Watch.pm @@ -7,7 +7,7 @@ package PublicInbox::Watch; use strict; use v5.10.1; use PublicInbox::Eml; -use PublicInbox::InboxWritable qw(eml_from_path warn_ignore_cb); +use PublicInbox::InboxWritable qw(eml_from_path); use PublicInbox::Filter::Base qw(REJECT); use PublicInbox::Spamcheck; use PublicInbox::Sigfd; @@ -174,7 +174,7 @@ my ($self, $path) = @_; # 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(); + local $SIG{__WARN__} = PublicInbox::Eml::warn_ignore_cb(); $self->{pi_cfg}->each_inbox(\&remove_eml_i, $self, $eml, $path); } @@ -414,13 +414,11 @@ my $eml = PublicInbox::Eml->new($$raw); import_eml($self, $ibx, $eml); } } elsif ($inboxes eq 'watchspam') { - # we don't remove unseen messages - if ($flags =~ /\\Seen\b/) { - local $SIG{__WARN__} = warn_ignore_cb(); - my $eml = PublicInbox::Eml->new($raw); - $self->{pi_cfg}->each_inbox(\&remove_eml_i, + return if $flags !~ /\\Seen\b/; # don't remove unseen messages + local $SIG{__WARN__} = PublicInbox::Eml::warn_ignore_cb(); + my $eml = PublicInbox::Eml->new($raw); + $self->{pi_cfg}->each_inbox(\&remove_eml_i, $self, $eml, "$url UID:$uid"); - } } else { die "BUG: destination unknown $inboxes"; }