X-Git-Url: http://www.git.stargrave.org/?p=public-inbox.git;a=blobdiff_plain;f=script%2Fpublic-inbox-watch;h=af02d8f358f7b84392744b68df49a4328fc69636;hp=0d1cd8319fed5f44a89542ff0aaa27dfc0089385;hb=refs%2Fheads%2Fmaster;hpb=8b0359338d1ec1e0ec7521c77b35f878931f4cd6 diff --git a/script/public-inbox-watch b/script/public-inbox-watch index 0d1cd831..4c50461f 100755 --- a/script/public-inbox-watch +++ b/script/public-inbox-watch @@ -1,26 +1,58 @@ #!/usr/bin/perl -w -# Copyright (C) 2016 all contributors +# Copyright (C) all contributors # License: AGPL-3.0+ +my $help = <autoflush +use PublicInbox::Watch; use PublicInbox::Config; -my ($config, $watch_md); +use PublicInbox::DS; +my $do_scan = 1; +GetOptions('scan!' => \$do_scan, # undocumented, testing only + 'help|h' => \(my $show_help)) or do { print STDERR $help; exit 1 }; +if ($show_help) { print $help; exit 0 }; +my $oldset = PublicInbox::DS::block_signals(); +STDOUT->autoflush(1); +STDERR->autoflush(1); +local $0 = $0; # local since this script may be eval-ed +my $watch = PublicInbox::Watch->new(PublicInbox::Config->new); my $reload = sub { - $config = PublicInbox::Config->new; - $watch_md->quit if $watch_md; - $watch_md = PublicInbox::WatchMaildir->new($config); + my $prev = $watch or return; # SIGQUIT issued + $watch->quit; + $watch = PublicInbox::Watch->new(PublicInbox::Config->new); + if ($watch) { + warn "# reloaded\n"; + } else { + warn("E: reloading failed\n"); + $watch = $prev; + } }; -$reload->(); -if ($watch_md) { - my $scan = sub { $watch_md->trigger_scan('full') if $watch_md }; - $SIG{HUP} = $reload; - $SIG{USR1} = $scan; - $SIG{ALRM} = sub { $SIG{ALRM} = 'DEFAULT'; $scan->() }; - $SIG{QUIT} = $SIG{TERM} = $SIG{INT} = sub { - $watch_md->quit if $watch_md; - $watch_md = undef; + +if ($watch) { + my $scan = sub { + return if !$watch; + warn "# scanning\n"; + $watch->trigger_scan('full'); }; - alarm(1); - $watch_md->watch while ($watch_md); + my $quit = sub { + $watch->quit if $watch; + $watch = undef; + $0 .= ' quitting'; + }; + my $sig = { + HUP => $reload, + USR1 => $scan, + CHLD => \&PublicInbox::DS::enqueue_reap, + }; + $sig->{QUIT} = $sig->{TERM} = $sig->{INT} = $quit; + + # --no-scan is only intended for testing atm, undocumented. + PublicInbox::DS::requeue($scan) if $do_scan; + $watch->watch($sig, $oldset) while ($watch); }