about summary refs log tree commit homepage
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2021-02-07 23:05:11 -1000
committerEric Wong <e@80x24.org>2021-02-08 22:07:42 +0000
commit80ba871c557eb5ba79c73150519ce9ea5225d695 (patch)
tree891a8b05bb0338d0afdb07b5eae72bb2d6285b6e
parentc642cbd0b4e490d5c0922f0659129c936e5349c8 (diff)
downloadpublic-inbox-80ba871c557eb5ba79c73150519ce9ea5225d695.tar.gz
While using utime on the destination Maildir is enough for mutt
to eventually notice new mail, "eventually" isn't good enough.

Send a SIGWINCH to wake mutt (and likely other MUAs)
immediately.  This is more portable than relying on MUAs to
support inotify or EVFILT_VNODE.
-rw-r--r--lib/PublicInbox/LEI.pm11
-rw-r--r--lib/PublicInbox/LeiXSearch.pm7
-rwxr-xr-xscript/lei8
3 files changed, 22 insertions, 4 deletions
diff --git a/lib/PublicInbox/LEI.pm b/lib/PublicInbox/LEI.pm
index c3645698..e95a674b 100644
--- a/lib/PublicInbox/LEI.pm
+++ b/lib/PublicInbox/LEI.pm
@@ -746,6 +746,17 @@ sub start_mua {
         }
 }
 
+sub poke_mua { # forces terminal MUAs to wake up and hopefully notice new mail
+        my ($self) = @_;
+        return unless $self->{opt}->{mua} && -t $self->{1};
+        # hit the process group that started the MUA
+        if (my $s = $self->{sock}) {
+                send($s, '-WINCH', MSG_EOR);
+        } elsif ($self->{oneshot}) {
+                kill('-WINCH', $$);
+        }
+}
+
 # caller needs to "-t $self->{1}" to check if tty
 sub start_pager {
         my ($self) = @_;
diff --git a/lib/PublicInbox/LeiXSearch.pm b/lib/PublicInbox/LeiXSearch.pm
index 588df3a4..10485220 100644
--- a/lib/PublicInbox/LeiXSearch.pm
+++ b/lib/PublicInbox/LeiXSearch.pm
@@ -317,7 +317,12 @@ Error closing $lei->{ovv}->{dst}: $!
                         }
                         $lei->{1} = $out;
                 }
-                $l2m->lock_free ? $l2m->poke_dst : $lei->start_mua;
+                if ($l2m->lock_free) {
+                        $l2m->poke_dst;
+                        $lei->poke_mua;
+                } else { # mbox users
+                        $lei->start_mua;
+                }
         }
         $lei->{-progress} and
                 $lei->err('# ', $lei->{-mset_total} // 0, " matches");
diff --git a/script/lei b/script/lei
index b7f21f14..0b0e2976 100755
--- a/script/lei
+++ b/script/lei
@@ -105,13 +105,15 @@ Falling back to (slow) one-shot mode
                         die "recvmsg: $!";
                 }
                 last if $buf eq '';
-                if ($buf =~ /\Ax_it ([0-9]+)\z/) {
+                if ($buf =~ /\Aexec (.+)\z/) {
+                        $exec_cmd->(\@fds, split(/\0/, $1));
+                } elsif ($buf eq '-WINCH') {
+                        kill($buf, $$); # for MUA
+                } elsif ($buf =~ /\Ax_it ([0-9]+)\z/) {
                         $x_it_code = $1 + 0;
                         last;
                 } elsif ($buf =~ /\Achild_error ([0-9]+)\z/) {
                         $x_it_code = $1 + 0;
-                } elsif ($buf =~ /\Aexec (.+)\z/) {
-                        $exec_cmd->(\@fds, split(/\0/, $1));
                 } else {
                         $sigchld->();
                         die $buf;