]> Sergey Matveev's repositories - public-inbox.git/commitdiff
watch: remove Filesys::Notify::Simple dependency
authorEric Wong <e@yhbt.net>
Sat, 27 Jun 2020 10:03:36 +0000 (10:03 +0000)
committerEric Wong <e@yhbt.net>
Sun, 28 Jun 2020 22:27:14 +0000 (22:27 +0000)
Since we already use inotify and EVFILT_VNODE (kqueue)
in -imapd, we might as well use them directly in -watch,
too.

This will allow public-inbox-watch to use PublicInbox::DS
for timers to watch newsgroups/mailboxes and have saner
signal handling in future commits.

17 files changed:
Documentation/public-inbox-watch.pod
INSTALL
MANIFEST
Makefile.PL
ci/deps.perl
lib/PublicInbox/DirIdle.pm [new file with mode: 0644]
lib/PublicInbox/In2Tie.pm
lib/PublicInbox/InboxIdle.pm
lib/PublicInbox/TestCommon.pm
lib/PublicInbox/WatchMaildir.pm
script/public-inbox-watch
t/dir_idle.t [new file with mode: 0644]
t/imapd.t
t/watch_filter_rubylang.t
t/watch_maildir.t
t/watch_maildir_v2.t
t/watch_multiple_headers.t

index 8a3ef076a5193dd3f3332c051b8808acfcda2aa7..bf3c9bd4bb9a47cc475fff18131ffd203960e77b 100644 (file)
@@ -48,8 +48,7 @@ of large Maildirs.
 Upon startup, it scans the mailbox for new messages to be
 imported while it was not running.
 
 Upon startup, it scans the mailbox for new messages to be
 imported while it was not running.
 
-Currently, only Maildirs are supported and the
-L<Filesys::Notify::Simple> Perl module is required.
+Currently, only Maildirs are supported.
 
 For now, IMAP users should use tools such as L<mbsync(1)>
 or L<offlineimap(1)> to bidirectionally sync their IMAP
 
 For now, IMAP users should use tools such as L<mbsync(1)>
 or L<offlineimap(1)> to bidirectionally sync their IMAP
diff --git a/INSTALL b/INSTALL
index 80cee7535f87c72ec8bdccb4382e09b89c5bbf7a..05e0f95e9142e43b5f4e31fc926c8e446b4b9cac 100644 (file)
--- a/INSTALL
+++ b/INSTALL
@@ -132,18 +132,10 @@ above, so there is no need to explicitly install them:
                                    (optional for stale FD cleanup in daemons,
                                     typically installed alongside Perl5)
 
                                    (optional for stale FD cleanup in daemons,
                                     typically installed alongside Perl5)
 
-- Filesys::Notify::Simple          deb: libfilesys-notify-simple-perl
-                                   pkg: p5-Filesys-Notify-Simple
-                                   rpm: perl-Filesys-Notify-Simple
-                                   (for public-inbox-watch, pulled in by Plack)
-
 - Linux::Inotify2                  deb: liblinux-inotify2-perl
                                    rpm: perl-Linux-Inotify2
                                    (for public-inbox-watch on Linux)
 
 - Linux::Inotify2                  deb: liblinux-inotify2-perl
                                    rpm: perl-Linux-Inotify2
                                    (for public-inbox-watch on Linux)
 
-- Filesys::Notify::KQueue          pkg: p5-Filesys-Notify-KQueue
-                                   (for public-inbox-watch on FreeBSD)
-
 - IO::Compress (::Gzip)            deb: perl-modules (or libio-compress-perl)
                                    pkg: perl5
                                    rpm: perl-IO-Compress
 - IO::Compress (::Gzip)            deb: perl-modules (or libio-compress-perl)
                                    pkg: perl5
                                    rpm: perl-IO-Compress
index 9d1a4e4a8b1b040b4569416ea401e5cdb39a233c..035c45bf49869197524471d958ea036dc4b1e585 100644 (file)
--- a/MANIFEST
+++ b/MANIFEST
@@ -106,6 +106,7 @@ lib/PublicInbox/DS.pm
 lib/PublicInbox/DSKQXS.pm
 lib/PublicInbox/DSPoll.pm
 lib/PublicInbox/Daemon.pm
 lib/PublicInbox/DSKQXS.pm
 lib/PublicInbox/DSPoll.pm
 lib/PublicInbox/Daemon.pm
+lib/PublicInbox/DirIdle.pm
 lib/PublicInbox/DummyInbox.pm
 lib/PublicInbox/Emergency.pm
 lib/PublicInbox/Eml.pm
 lib/PublicInbox/DummyInbox.pm
 lib/PublicInbox/Emergency.pm
 lib/PublicInbox/Eml.pm
@@ -243,6 +244,7 @@ t/content_hash.t
 t/convert-compact.t
 t/data/0001.patch
 t/data/message_embed.eml
 t/convert-compact.t
 t/data/0001.patch
 t/data/message_embed.eml
+t/dir_idle.t
 t/ds-kqxs.t
 t/ds-leak.t
 t/ds-poll.t
 t/ds-kqxs.t
 t/ds-leak.t
 t/ds-poll.t
index 472baa9b080eda0466dd099be9bdc2b5eebcf4f2..8d90ad46cf64c0753b5ad9823b1553860231d30b 100644 (file)
@@ -138,10 +138,6 @@ WriteMakefile(
                # Plack is needed for public-inbox-httpd and PublicInbox::WWW
                # 'Plack' => 0,
 
                # Plack is needed for public-inbox-httpd and PublicInbox::WWW
                # 'Plack' => 0,
 
-               # Filesys::Notify::Simple is pulled in by Plack, but also
-               # needed by public-inbox-watch (for now)
-               # 'Filesys::Notify::Simple' => 0,
-
                # TODO: this should really be made optional...
                'URI::Escape' => 0,
 
                # TODO: this should really be made optional...
                'URI::Escape' => 0,
 
index 48aaa9e46d49f4d1d3f0c760f101bef7ad805a0c..501f51129e7c3c69848da4ad9b43cf56d14cf0f8 100755 (executable)
@@ -32,7 +32,6 @@ my $profiles = {
                BSD::Resource
                DBD::SQLite
                DBI
                BSD::Resource
                DBD::SQLite
                DBI
-               Filesys::Notify::Simple
                Inline::C
                Net::Server
                Plack
                Inline::C
                Net::Server
                Plack
diff --git a/lib/PublicInbox/DirIdle.pm b/lib/PublicInbox/DirIdle.pm
new file mode 100644 (file)
index 0000000..ffceda6
--- /dev/null
@@ -0,0 +1,50 @@
+# Copyright (C) 2020 all contributors <meta@public-inbox.org>
+# License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt>
+
+# Used by public-inbox-watch for Maildir (and possibly MH in the future)
+package PublicInbox::DirIdle;
+use strict;
+use base 'PublicInbox::DS';
+use fields qw(inot);
+use PublicInbox::Syscall qw(EPOLLIN EPOLLET);
+use PublicInbox::In2Tie;
+
+my ($MAIL_IN, $ino_cls);
+if ($^O eq 'linux' && eval { require Linux::Inotify2; 1 }) {
+       $MAIL_IN = Linux::Inotify2::IN_MOVED_TO() |
+               Linux::Inotify2::IN_CREATE();
+       $ino_cls = 'Linux::Inotify2';
+} elsif (eval { require PublicInbox::KQNotify }) {
+       $MAIL_IN = PublicInbox::KQNotify::MOVED_TO_OR_CREATE();
+       $ino_cls = 'PublicInbox::KQNotify';
+} else {
+       require PublicInbox::FakeInotify;
+       $MAIL_IN = PublicInbox::FakeInotify::MOVED_TO_OR_CREATE();
+}
+
+sub new {
+       my ($class, $dirs, $cb) = @_;
+       my $self = fields::new($class);
+       my $inot;
+       if ($ino_cls) {
+               $inot = $ino_cls->new or die "E: $ino_cls->new: $!";
+               my $io = PublicInbox::In2Tie::io($inot);
+               $self->SUPER::new($io, EPOLLIN | EPOLLET);
+       } else {
+               require PublicInbox::FakeInotify;
+               $inot = PublicInbox::FakeInotify->new; # starts timer
+       }
+
+       # Linux::Inotify2->watch or similar
+       $inot->watch($_, $MAIL_IN, $cb) for @$dirs;
+       $self->{inot} = $inot;
+       $self;
+}
+
+sub event_step {
+       my ($self) = @_;
+       eval { $self->{inot}->poll }; # Linux::Inotify2::poll
+       warn "$self->{inot}->poll err: $@\n" if $@;
+}
+
+1;
index db1dc1045c14b52480ba5189d589593d76137a02..7dee362724ea3002b500cc19a43a12b5bafe50e7 100644 (file)
@@ -5,6 +5,19 @@
 # on Linux::Inotify2 objects
 package PublicInbox::In2Tie;
 use strict;
 # on Linux::Inotify2 objects
 package PublicInbox::In2Tie;
 use strict;
+use Symbol qw(gensym);
+
+sub io {
+       my $in2 = $_[0];
+       $in2->blocking(0);
+       if ($in2->can('on_overflow')) {
+               # broadcasts everything on overflow
+               $in2->on_overflow(undef);
+       }
+       my $io = gensym;
+       tie *$io, __PACKAGE__, $in2;
+       $io;
+}
 
 sub TIEHANDLE {
        my ($class, $in2) = @_;
 
 sub TIEHANDLE {
        my ($class, $in2) = @_;
index 97e9d53250eb43285ae7eba56c3f4ae79d898d8e..ba8200aef05b366220d89e533d9f13c68d48a26f 100644 (file)
@@ -6,7 +6,6 @@ use strict;
 use base qw(PublicInbox::DS);
 use fields qw(pi_config inot pathmap);
 use Cwd qw(abs_path);
 use base qw(PublicInbox::DS);
 use fields qw(pi_config inot pathmap);
 use Cwd qw(abs_path);
-use Symbol qw(gensym);
 use PublicInbox::Syscall qw(EPOLLIN EPOLLET);
 my $IN_MODIFY = 0x02; # match Linux inotify
 my $ino_cls;
 use PublicInbox::Syscall qw(EPOLLIN EPOLLET);
 my $IN_MODIFY = 0x02; # match Linux inotify
 my $ino_cls;
@@ -55,14 +54,8 @@ sub new {
        my $inot;
        if ($ino_cls) {
                $inot = $ino_cls->new or die "E: $ino_cls->new: $!";
        my $inot;
        if ($ino_cls) {
                $inot = $ino_cls->new or die "E: $ino_cls->new: $!";
-               my $sock = gensym;
-               tie *$sock, 'PublicInbox::In2Tie', $inot;
-               $inot->blocking(0);
-               if ($inot->can('on_overflow')) {
-                        # broadcasts everything on overflow
-                       $inot->on_overflow(undef);
-               }
-               $self->SUPER::new($sock, EPOLLIN | EPOLLET);
+               my $io = PublicInbox::In2Tie::io($inot);
+               $self->SUPER::new($io, EPOLLIN | EPOLLET);
        } else {
                require PublicInbox::FakeInotify;
                $inot = PublicInbox::FakeInotify->new;
        } else {
                require PublicInbox::FakeInotify;
                $inot = PublicInbox::FakeInotify->new;
index dc360135569c762ea9cc1953e4aa8617d044d90c..b252810fca51865903e332aaecd2ef4b4f21d2a0 100644 (file)
@@ -10,7 +10,7 @@ use Fcntl qw(FD_CLOEXEC F_SETFD F_GETFD :seek);
 use POSIX qw(dup2);
 use IO::Socket::INET;
 our @EXPORT = qw(tmpdir tcp_server tcp_connect require_git require_mods
 use POSIX qw(dup2);
 use IO::Socket::INET;
 our @EXPORT = qw(tmpdir tcp_server tcp_connect require_git require_mods
-       run_script start_script key2sub xsys xqx eml_load);
+       run_script start_script key2sub xsys xqx eml_load tick);
 
 sub eml_load ($) {
        my ($path, $cb) = @_;
 
 sub eml_load ($) {
        my ($path, $cb) = @_;
@@ -418,4 +418,8 @@ sub DESTROY {
        $self->join('TERM');
 }
 
        $self->join('TERM');
 }
 
+package PublicInbox::TestCommon::InboxWakeup;
+use strict;
+sub on_inbox_unlock { ${$_[0]}->($_[1]) }
+
 1;
 1;
index fea7d5ef9ee54cd13d6a906dbb4339afaafdb511..22f190366a4696f7ead6cb9ffa2b2346d0001ca9 100644 (file)
@@ -119,19 +119,6 @@ sub _done_for_now {
        }
 }
 
        }
 }
 
-sub _try_fsn_paths {
-       my ($self, $scan_re, $paths) = @_;
-       foreach (@$paths) {
-               my $path = $_->{path};
-               if ($path =~ $scan_re) {
-                       scan($self, $path);
-               } else {
-                       _try_path($self, $path);
-               }
-       }
-       _done_for_now($self);
-}
-
 sub remove_eml_i { # each_inbox callback
        my ($ibx, $arg) = @_;
        my ($self, $eml, $loc) = @$arg;
 sub remove_eml_i { # each_inbox callback
        my ($ibx, $arg) = @_;
        my ($self, $eml, $loc) = @$arg;
@@ -225,16 +212,28 @@ sub quit {
 
 sub watch_fs {
        my ($self) = @_;
 
 sub watch_fs {
        my ($self) = @_;
+       require PublicInbox::DirIdle;
        my $scan = File::Temp->newdir("public-inbox-watch.$$.scan.XXXXXX",
                                        TMPDIR => 1);
        my $scandir = $self->{scandir} = $scan->dirname;
        my $scan = File::Temp->newdir("public-inbox-watch.$$.scan.XXXXXX",
                                        TMPDIR => 1);
        my $scandir = $self->{scandir} = $scan->dirname;
-       my $re = qr!\A$scandir/!;
-       my $cb = sub { _try_fsn_paths($self, $re, \@_) };
-
-       eval { require Filesys::Notify::Simple } or
-               die "Filesys::Notify::Simple is currently required for $0\n";
-       my $fsn = Filesys::Notify::Simple->new([@{$self->{mdir}}, $scandir]);
-       $fsn->wait($cb) until $self->{quit};
+       my $scan_re = qr!\A$scandir/!;
+       my $done = sub {
+               delete $self->{done_timer};
+               _done_for_now($self);
+       };
+       my $cb = sub {
+               my $path = $_[0]->fullname;
+               if ($path =~ $scan_re) {
+                       scan($self, $path);
+               } else {
+                       _try_path($self, $path);
+               }
+               $self->{done_timer} //= PublicInbox::DS::requeue($done);
+       };
+       my $di = PublicInbox::DirIdle->new([@{$self->{mdir}}, $scandir], $cb);
+       PublicInbox::DS->SetPostLoopCallback(sub { !$self->{quit} });
+       PublicInbox::DS->EventLoop;
+       _done_for_now($self);
 }
 
 # returns the git config section name, e.g [imap "imaps://user@example.com"]
 }
 
 # returns the git config section name, e.g [imap "imaps://user@example.com"]
index 645abeda971688b3849e77de4bd5cdd46960b0b2..2057066a2a9038589120d7ed424550aef44b1444 100755 (executable)
@@ -21,6 +21,7 @@ if ($watch_md) {
                $watch_md->quit if $watch_md;
                $watch_md = undef;
        };
                $watch_md->quit if $watch_md;
                $watch_md = undef;
        };
-       alarm(1);
+       # --no-scan is only intended for testing atm, undocumented.
+       alarm(1) unless (grep(/\A--no-scan\z/, @ARGV));
        $watch_md->watch while ($watch_md);
 }
        $watch_md->watch while ($watch_md);
 }
diff --git a/t/dir_idle.t b/t/dir_idle.t
new file mode 100644 (file)
index 0000000..587599e
--- /dev/null
@@ -0,0 +1,6 @@
+#!perl -w
+# Copyright (C) 2020 all contributors <meta@public-inbox.org>
+# License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt>
+use Test::More;
+use_ok 'PublicInbox::DirIdle';
+done_testing;
index 3f31743df2e1e0eea899157b12c9750215d86fd0..cc87a127851a0d025cd0beebda9657ff4676c102 100644 (file)
--- a/t/imapd.t
+++ b/t/imapd.t
@@ -462,7 +462,7 @@ ok($mic->logout, 'logged out');
        PublicInbox::DS->Reset;
        my $ii = PublicInbox::InboxIdle->new($cfg);
        my $cb = sub { PublicInbox::DS->SetPostLoopCallback(sub {}) };
        PublicInbox::DS->Reset;
        my $ii = PublicInbox::InboxIdle->new($cfg);
        my $cb = sub { PublicInbox::DS->SetPostLoopCallback(sub {}) };
-       my $obj = bless \$cb, 'InboxWakeup';
+       my $obj = bless \$cb, 'PublicInbox::TestCommon::InboxWakeup';
        $cfg->each_inbox(sub { $_[0]->subscribe_unlock('ident', $obj) });
        open my $err, '+>', undef or BAIL_OUT $!;
        my $w = start_script(['-watch'], undef, { 2 => $err });
        $cfg->each_inbox(sub { $_[0]->subscribe_unlock('ident', $obj) });
        open my $err, '+>', undef or BAIL_OUT $!;
        my $w = start_script(['-watch'], undef, { 2 => $err });
@@ -488,7 +488,3 @@ unlike($eout, qr/wide/i, 'no Wide character warnings');
 unlike($eout, qr/uninitialized/i, 'no uninitialized warnings');
 
 done_testing;
 unlike($eout, qr/uninitialized/i, 'no uninitialized warnings');
 
 done_testing;
-
-package InboxWakeup;
-use strict;
-sub on_inbox_unlock { ${$_[0]}->() }
index 2e7d402e5fafb45143c99cc522e95ec458807e86..db48cb2ffde3d60742ed208a305a8cda702a57f0 100644 (file)
@@ -6,7 +6,7 @@ use PublicInbox::TestCommon;
 use Test::More;
 use PublicInbox::Eml;
 use PublicInbox::Config;
 use Test::More;
 use PublicInbox::Eml;
 use PublicInbox::Config;
-require_mods(qw(Filesys::Notify::Simple DBD::SQLite Search::Xapian));
+require_mods(qw(DBD::SQLite Search::Xapian));
 use_ok 'PublicInbox::WatchMaildir';
 use_ok 'PublicInbox::Emergency';
 my ($tmpdir, $for_destroy) = tmpdir();
 use_ok 'PublicInbox::WatchMaildir';
 use_ok 'PublicInbox::Emergency';
 my ($tmpdir, $for_destroy) = tmpdir();
index 33a3458bd4dca7a63dbfc5aa791093f1416f8919..a2c09b0351b9ed4df55e0b56d73f209378554e1c 100644 (file)
@@ -7,7 +7,6 @@ use Cwd;
 use PublicInbox::Config;
 use PublicInbox::TestCommon;
 use PublicInbox::Import;
 use PublicInbox::Config;
 use PublicInbox::TestCommon;
 use PublicInbox::Import;
-require_mods(qw(Filesys::Notify::Simple));
 my ($tmpdir, $for_destroy) = tmpdir();
 my $git_dir = "$tmpdir/test.git";
 my $maildir = "$tmpdir/md";
 my ($tmpdir, $for_destroy) = tmpdir();
 my $git_dir = "$tmpdir/test.git";
 my $maildir = "$tmpdir/md";
@@ -47,14 +46,22 @@ EOF
                'only got the spam folder to watch');
 }
 
                'only got the spam folder to watch');
 }
 
-my $config = PublicInbox::Config->new(\<<EOF);
-$cfgpfx.address=$addr
-$cfgpfx.inboxdir=$git_dir
-$cfgpfx.watch=maildir:$maildir
-$cfgpfx.filter=PublicInbox::Filter::Vger
-publicinboxlearn.watchspam=maildir:$spamdir
+my $cfg_path = "$tmpdir/config";
+{
+       open my $fh, '>', $cfg_path or BAIL_OUT $!;
+       print $fh <<EOF or BAIL_OUT $!;
+[publicinbox "test"]
+       address = $addr
+       inboxdir = $git_dir
+       watch = maildir:$maildir
+       filter = PublicInbox::Filter::Vger
+[publicinboxlearn]
+       watchspam = maildir:$spamdir
 EOF
 EOF
+       close $fh or BAIL_OUT $!;
+}
 
 
+my $config = PublicInbox::Config->new($cfg_path);
 PublicInbox::WatchMaildir->new($config)->scan('full');
 my $git = PublicInbox::Git->new($git_dir);
 my @list = $git->qx(qw(rev-list refs/heads/master));
 PublicInbox::WatchMaildir->new($config)->scan('full');
 my $git = PublicInbox::Git->new($git_dir);
 my @list = $git->qx(qw(rev-list refs/heads/master));
@@ -136,6 +143,70 @@ More majordomo info at  http://vger.kernel.org/majordomo-info.html\n);
        like($$mref, qr/something\n\z/s, 'message scrubbed on import');
 }
 
        like($$mref, qr/something\n\z/s, 'message scrubbed on import');
 }
 
+# end-to-end test which actually uses inotify/kevent
+{
+       my $env = { PI_CONFIG => $cfg_path };
+       $git->cleanup;
+
+       # n.b. --no-scan is only intended for testing atm
+       my $wm = start_script([qw(-watch --no-scan)], $env);
+       my $eml = eml_load('t/data/0001.patch');
+       $eml->header_set('Cc', $addr);
+       my $em = PublicInbox::Emergency->new($maildir);
+       $em->prepare(\($eml->as_string));
+
+       use_ok 'PublicInbox::InboxIdle';
+       use_ok 'PublicInbox::DS';
+       my $delivered = 0;
+       my $cb = sub {
+               my ($ibx) = @_;
+               diag "message delivered to `$ibx->{name}'";
+               $delivered++;
+       };
+       PublicInbox::DS->Reset;
+       my $ii = PublicInbox::InboxIdle->new($config);
+       my $obj = bless \$cb, 'PublicInbox::TestCommon::InboxWakeup';
+       $config->each_inbox(sub { $_[0]->subscribe_unlock('ident', $obj) });
+       PublicInbox::DS->SetPostLoopCallback(sub { $delivered == 0 });
+
+       # wait for -watch to setup inotify watches
+       my $sleep = 1;
+       if (eval { require Linux::Inotify2 } && -d "/proc/$wm->{pid}/fd") {
+               my $end = time + 2;
+               my (@ino, @ino_info);
+               do {
+                       @ino = grep {
+                               (readlink($_)//'') =~ /\binotify\b/
+                       } glob("/proc/$wm->{pid}/fd/*");
+               } until (@ino || time > $end || !tick);
+               if (scalar(@ino) == 1) {
+                       my $ino_fd = (split('/', $ino[0]))[-1];
+                       my $ino_fdinfo = "/proc/$wm->{pid}/fdinfo/$ino_fd";
+                       while (time < $end && open(my $fh, '<', $ino_fdinfo)) {
+                               @ino_info = grep(/^inotify wd:/, <$fh>);
+                               last if @ino_info >= 4;
+                               tick;
+                       }
+                       $sleep = undef if @ino_info >= 4;
+               }
+       }
+       if ($sleep) {
+               diag "waiting ${sleep}s for -watch to start up";
+               sleep $sleep;
+       }
+
+       $em->commit; # wake -watch up
+       diag 'waiting for -watch to import new message';
+       PublicInbox::DS->EventLoop;
+       $wm->kill;
+       $wm->join;
+       $ii->close;
+       PublicInbox::DS->Reset;
+       my $head = $git->qx(qw(cat-file commit HEAD));
+       my $subj = $eml->header('Subject');
+       like($head, qr/^\Q$subj\E/sm, 'new commit made');
+}
+
 sub is_maildir {
        my ($dir) = @_;
        PublicInbox::WatchMaildir::is_maildir($dir);
 sub is_maildir {
        my ($dir) = @_;
        PublicInbox::WatchMaildir::is_maildir($dir);
index 19a2da7707085b6d536472bd8fbf8525cfbd51d8..6cc8b6ff0e9a1c62baeaadc8d4943dad43a34f94 100644 (file)
@@ -8,7 +8,7 @@ use PublicInbox::Config;
 use PublicInbox::TestCommon;
 use PublicInbox::Import;
 require_git(2.6);
 use PublicInbox::TestCommon;
 use PublicInbox::Import;
 require_git(2.6);
-require_mods(qw(Search::Xapian DBD::SQLite Filesys::Notify::Simple));
+require_mods(qw(Search::Xapian DBD::SQLite));
 require PublicInbox::V2Writable;
 my ($tmpdir, $for_destroy) = tmpdir();
 my $inboxdir = "$tmpdir/v2";
 require PublicInbox::V2Writable;
 my ($tmpdir, $for_destroy) = tmpdir();
 my $inboxdir = "$tmpdir/v2";
index 3a39eba9e0ea2540148db28dcb30094ece0f91bc..0ee96d5ff89d2eb31d88adb27d1cadaa95481b0b 100644 (file)
@@ -5,7 +5,7 @@ use Test::More;
 use PublicInbox::Config;
 use PublicInbox::TestCommon;
 require_git(2.6);
 use PublicInbox::Config;
 use PublicInbox::TestCommon;
 require_git(2.6);
-require_mods(qw(Search::Xapian DBD::SQLite Filesys::Notify::Simple));
+require_mods(qw(Search::Xapian DBD::SQLite));
 my ($tmpdir, $for_destroy) = tmpdir();
 my $inboxdir = "$tmpdir/v2";
 my $maildir = "$tmpdir/md";
 my ($tmpdir, $for_destroy) = tmpdir();
 my $inboxdir = "$tmpdir/v2";
 my $maildir = "$tmpdir/md";