The old check was ineffective since we process the spam folder
config before ham inboxes; and would only fail when attempting
to treat the scalar "watchspam" string as an array ref.
---
 lib/PublicInbox/WatchMaildir.pm | 17 +++++++----------
 t/watch_maildir.t               | 15 +++++++++++++++
 2 files changed, 22 insertions(+), 10 deletions(-)

diff --git a/lib/PublicInbox/WatchMaildir.pm b/lib/PublicInbox/WatchMaildir.pm
index 496199c90f5..c1f3c5c258f 100644
--- a/lib/PublicInbox/WatchMaildir.pm
+++ b/lib/PublicInbox/WatchMaildir.pm
@@ -52,15 +52,6 @@ sub new {
                        if (is_maildir($dir)) {
                                # skip "new", no MUA has seen it, yet.
                                my $cur = "$dir/cur";
-                               my $old = $mdmap{$cur};
-                               if (ref($old)) {
-                                       foreach my $ibx (@$old) {
-                                               warn <<"";
-"$cur already watched for `$ibx->{name}'
-
-                                       }
-                                       die;
-                               }
                                push @mdir, $cur;
                                $uniq{$cur}++;
                                $mdmap{$cur} = 'watchspam';
@@ -84,9 +75,15 @@ sub new {
                        compile_watchheaders($ibx);
                        my $new = "$watch/new";
                        my $cur = "$watch/cur";
+                       my $ws = $mdmap{$cur};
+                       if ($ws && !ref($ws) && $ws eq 'watchspam') {
+                               warn <<EOF;
+E: $cur is a spam folder and cannot be used for `$ibx->{name}' input
+EOF
+                               return; # onto next inbox
+                       }
                        push @mdir, $new unless $uniq{$new}++;
                        push @mdir, $cur unless $uniq{$cur}++;
-
                        push @{$mdmap{$new} ||= []}, $ibx;
                        push @{$mdmap{$cur} ||= []}, $ibx;
                } else {
diff --git a/t/watch_maildir.t b/t/watch_maildir.t
index 66955072cd5..33a3458bd4d 100644
--- a/t/watch_maildir.t
+++ b/t/watch_maildir.t
@@ -32,6 +32,21 @@ ok(POSIX::mkfifo("$maildir/cur/fifo", 0777),
        'create FIFO to ensure we do not get stuck on it :P');
 my $sem = PublicInbox::Emergency->new($spamdir); # create dirs
 
+{
+       my @w;
+       local $SIG{__WARN__} = sub { push @w, @_ };
+       my $config = PublicInbox::Config->new(\<<EOF);
+$cfgpfx.address=$addr
+$cfgpfx.inboxdir=$git_dir
+$cfgpfx.watch=maildir:$spamdir
+publicinboxlearn.watchspam=maildir:$spamdir
+EOF
+       my $wm = PublicInbox::WatchMaildir->new($config);
+       is(scalar grep(/is a spam folder/, @w), 1, 'got warning about spam');
+       is_deeply($wm->{mdmap}, { "$spamdir/cur" => 'watchspam' },
+               'only got the spam folder to watch');
+}
+
 my $config = PublicInbox::Config->new(\<<EOF);
 $cfgpfx.address=$addr
 $cfgpfx.inboxdir=$git_dir
--
unsubscribe: one-click, see List-Unsubscribe header
archive: https://public-inbox.org/meta/

Reply via email to