lib/PublicInbox/WatchMaildir.pm | 13 +++++++++---- t/watch_maildir.t | 9 +++++++++ diff --git a/lib/PublicInbox/WatchMaildir.pm b/lib/PublicInbox/WatchMaildir.pm index 8d8e817ad767d9097b438c84ae336ea503e12a4b..84080ba958f0dfd629743834761a87f82f6cbc9e 100644 --- a/lib/PublicInbox/WatchMaildir.pm +++ b/lib/PublicInbox/WatchMaildir.pm @@ -28,8 +28,7 @@ # indefinitely... foreach my $pfx (qw(publicinboxwatch publicinboxlearn)) { my $k = "$pfx.watchspam"; if (my $dir = $config->{$k}) { - if ($dir =~ s/\Amaildir://) { - $dir =~ s!/+\z!!; + if (is_maildir($dir)) { # skip "new", no MUA has seen it, yet. my $cur = "$dir/cur"; my $old = $mdmap{$cur}; @@ -60,8 +59,7 @@ # need to make all inboxes writable for spam removal: my $ibx = $_[0] = PublicInbox::InboxWritable->new($_[0]); my $watch = $ibx->{watch} or return; - if ($watch =~ s/\Amaildir://) { - $watch =~ s!/+\z!!; + if (is_maildir($watch)) { if (my $wm = $ibx->{watchheader}) { my ($k, $v) = split(/:/, $wm, 2); $ibx->{-watchheader} = [ $k, qr/\Q$v\E/ ]; @@ -276,6 +274,13 @@ } warn $mime->header('Message-ID')." failed spam check\n"; undef; } +} + +sub is_maildir { + $_[0] =~ s!\Amaildir:!! or return; + $_[0] =~ tr!/!/!s; + $_[0] =~ s!/\z!!; + $_[0]; } 1; diff --git a/t/watch_maildir.t b/t/watch_maildir.t index 7178f29efe029e4815a30d2098790b9a0d07b08a..b85ddc580a69b6f6a1121941fb4d23be3156bc96 100644 --- a/t/watch_maildir.t +++ b/t/watch_maildir.t @@ -124,4 +124,13 @@ my $mref = $git->cat_file('refs/heads/master:'.$list[0]); like($$mref, qr/something\n\z/s, 'message scrubbed on import'); } +sub is_maildir { + my ($dir) = @_; + PublicInbox::WatchMaildir::is_maildir($dir); +} + +is(is_maildir('maildir:/hello//world'), '/hello/world', 'extra slash gone'); +is(is_maildir('maildir:/hello/world/'), '/hello/world', 'trailing slash gone'); +is(is_maildir('faildir:/hello/world/'), undef, 'non-maildir rejected'); + done_testing;