about summary refs log tree commit homepage
path: root/lib/PublicInbox
diff options
context:
space:
mode:
authorEric Wong <e@yhbt.net>2020-06-27 10:03:51 +0000
committerEric Wong <e@yhbt.net>2020-06-28 22:27:27 +0000
commit204e451851dfe510e16cc03e4a6ea6242c4e9076 (patch)
tree344ad4b7e66ab02188071dcd5d09a7cd96f89b51 /lib/PublicInbox
parent62e3ea11522242c651ea4991712f040ab460223d (diff)
downloadpublic-inbox-204e451851dfe510e16cc03e4a6ea6242c4e9076.tar.gz
Since we store all watched directory names as keys in %mdmap,
there should be no need to keep an array of those directories
around.

t/watch_maildir*.t required changes to remove trained spam.
Once we've trained something as spam, there shouldn't be
a need to rescan it.
Diffstat (limited to 'lib/PublicInbox')
-rw-r--r--lib/PublicInbox/WatchMaildir.pm22
1 files changed, 8 insertions, 14 deletions
diff --git a/lib/PublicInbox/WatchMaildir.pm b/lib/PublicInbox/WatchMaildir.pm
index 621d41bd..8d2dc432 100644
--- a/lib/PublicInbox/WatchMaildir.pm
+++ b/lib/PublicInbox/WatchMaildir.pm
@@ -40,8 +40,7 @@ sub compile_watchheaders ($) {
 
 sub new {
         my ($class, $config) = @_;
-        my (%mdmap, @mdir, $spamc);
-        my %uniq; # directory => count
+        my (%mdmap, $spamc);
         my %imap; # url => [inbox objects] or 'watchspam'
 
         # "publicinboxwatch" is the documented namespace
@@ -54,10 +53,7 @@ sub new {
                 for my $dir (@$dirs) {
                         if (is_maildir($dir)) {
                                 # skip "new", no MUA has seen it, yet.
-                                my $cur = "$dir/cur";
-                                push @mdir, $cur;
-                                $uniq{$cur}++;
-                                $mdmap{$cur} = 'watchspam';
+                                $mdmap{"$dir/cur"} = 'watchspam';
                         } elsif (my $url = imap_url($dir)) {
                                 $imap{$url} = 'watchspam';
                         } else {
@@ -83,8 +79,6 @@ sub new {
                                 my ($new, $cur) = ("$watch/new", "$watch/cur");
                                 my $cur_dst = $mdmap{$cur} //= [];
                                 return if is_watchspam($cur, $cur_dst, $ibx);
-                                push @mdir, $new unless $uniq{$new}++;
-                                push @mdir, $cur unless $uniq{$cur}++;
                                 push @{$mdmap{$new} //= []}, $ibx;
                                 push @$cur_dst, $ibx;
                         } elsif (my $url = imap_url($watch)) {
@@ -96,17 +90,16 @@ sub new {
                         }
                 }
         });
-        return unless scalar(@mdir) || scalar(keys %imap);
 
         my $mdre;
-        if (@mdir) {
-                $mdre = join('|', map { quotemeta($_) } @mdir);
+        if (scalar keys %mdmap) {
+                $mdre = join('|', map { quotemeta($_) } keys %mdmap);
                 $mdre = qr!\A($mdre)/!;
         }
+        return unless $mdre || scalar(keys %imap);
         bless {
                 spamcheck => $spamcheck,
                 mdmap => \%mdmap,
-                mdir => \@mdir,
                 mdre => $mdre,
                 config => $config,
                 imap => scalar keys %imap ? \%imap : undef,
@@ -231,7 +224,8 @@ sub watch_fs_init ($) {
                 $self->{done_timer} //= PublicInbox::DS::requeue($done);
         };
         require PublicInbox::DirIdle;
-        PublicInbox::DirIdle->new($self->{mdir}, $cb); # EPOLL_CTL_ADD
+        # inotify_create + EPOLL_CTL_ADD
+        PublicInbox::DirIdle->new([keys %{$self->{mdmap}}], $cb);
 }
 
 # returns the git config section name, e.g [imap "imaps://user@example.com"]
@@ -688,7 +682,7 @@ sub fs_scan_step {
                 $opendirs->{$dir} = $dh if $n < 0;
         }
         if ($op && $op eq 'full') {
-                foreach my $dir (@{$self->{mdir}}) {
+                foreach my $dir (keys %{$self->{mdmap}}) {
                         next if $opendirs->{$dir}; # already in progress
                         my $ok = opendir(my $dh, $dir);
                         unless ($ok) {