]> Sergey Matveev's repositories - public-inbox.git/blobdiff - lib/PublicInbox/LEI.pm
lei rm: new command to remove messages from index
[public-inbox.git] / lib / PublicInbox / LEI.pm
index 628908b5bc22ae8e098c4be376fb9aa651e038e4..7acc05bf1fcd048511859d1e7f4d7eb52e11f67e 100644 (file)
@@ -206,7 +206,10 @@ our %CMD = ( # sorted in order of importance/use:
                qw(verbose|v+), @c_opt ],
 'edit-search' => [ 'OUTPUT', "edit saved search via `git config --edit'",
                        @c_opt ],
-
+'rm' => [ '--stdin|LOCATION...',
+       'remove a message from the index and prevent reindexing',
+       'stdin|', # /|\z/ must be first for lone dash
+       @c_opt ],
 'plonk' => [ '--threads|--from=IDENT',
        'exclude mail matching From: or threads from non-Message-ID searches',
        qw(stdin| threads|t from|f=s mid=s oid=s), @c_opt ],
@@ -243,7 +246,8 @@ our %CMD = ( # sorted in order of importance/use:
        qw(stdin| offset=i recursive|r exclude=s include|I=s
        lock=s@ in-format|F=s kw! verbose|v+ incremental! mail-sync!),
        qw(no-torsocks torsocks=s), PublicInbox::LeiQuery::curl_opt(), @c_opt ],
-
+'forget-mail-sync' => [ 'LOCATION...',
+       'forget sync information for a mail folder', @c_opt ],
 'export-kw' => [ 'LOCATION...|--all',
        'one-time export of keywords of sync sources',
        qw(all:s mode=s), @c_opt ],
@@ -443,19 +447,6 @@ sub x_it ($$) {
        dump_and_clear_log();
        if (my $s = $self->{pkt_op_p} // $self->{sock}) {
                send($s, "x_it $code", MSG_EOR);
-       } elsif ($self->{oneshot}) {
-               # don't want to end up using $? from child processes
-               _drop_wq($self);
-               # cleanup anything that has tempfiles or open file handles
-               %PATH2CFG = ();
-               delete @$self{qw(ovv dedupe sto cfg)};
-               if (my $signum = ($code & 127)) { # usually SIGPIPE (13)
-                       $SIG{PIPE} = 'DEFAULT'; # $SIG{$signum} doesn't work
-                       kill $signum, $$;
-                       sleep(1) while 1; # wait for signal
-               } else {
-                       $quit->($code >> 8);
-               }
        } # else ignore if client disconnected
 }
 
@@ -920,17 +911,6 @@ sub start_mua {
                my $io = [];
                $io->[0] = $self->{1} if $self->{opt}->{stdin} && -t $self->{1};
                send_exec_cmd($self, $io, \@cmd, {});
-       } elsif ($self->{oneshot}) {
-               my $pid = fork // die "fork: $!";
-               if ($pid > 0) { # original process
-                       if ($self->{opt}->{stdin} && -t STDOUT) {
-                               open STDIN, '+<&', \*STDOUT or die "dup2: $!";
-                       }
-                       exec(@cmd);
-                       warn "exec @cmd: $!\n";
-                       POSIX::_exit(1);
-               }
-               POSIX::setsid() > 0 or die "setsid: $!";
        }
        if ($self->{lxs} && $self->{au_done}) { # kick wait_startq
                syswrite($self->{au_done}, 'q' x ($self->{lxs}->{jobs} // 0));
@@ -951,14 +931,11 @@ sub send_exec_cmd { # tell script/lei to execute a command
 sub poke_mua { # forces terminal MUAs to wake up and hopefully notice new mail
        my ($self) = @_;
        my $alerts = $self->{opt}->{alert} // return;
+       my $sock = $self->{sock};
        while (my $op = shift(@$alerts)) {
                if ($op eq ':WINCH') {
                        # hit the process group that started the MUA
-                       if ($self->{sock}) {
-                               send($self->{sock}, '-WINCH', MSG_EOR);
-                       } elsif ($self->{oneshot}) {
-                               kill('-WINCH', $$);
-                       }
+                       send($sock, '-WINCH', MSG_EOR) if $sock;
                } elsif ($op eq ':bell') {
                        out($self, "\a");
                } elsif ($op =~ /(?<!\\),/) { # bare ',' (not ',,')
@@ -967,11 +944,7 @@ sub poke_mua { # forces terminal MUAs to wake up and hopefully notice new mail
                        my $cmd = $1; # run an arbitrary command
                        require Text::ParseWords;
                        $cmd = [ Text::ParseWords::shellwords($cmd) ];
-                       if (my $s = $self->{sock}) {
-                               send($s, exec_buf($cmd, {}), MSG_EOR);
-                       } elsif ($self->{oneshot}) {
-                               $self->{"pid.$self.$$"}->{spawn($cmd)} = $cmd;
-                       }
+                       send($sock, exec_buf($cmd, {}), MSG_EOR) if $sock;
                } else {
                        err($self, "W: unsupported --alert=$op"); # non-fatal
                }
@@ -1008,9 +981,6 @@ sub start_pager {
        if ($self->{sock}) { # lei(1) process runs it
                delete @$new_env{keys %$env}; # only set iff unset
                send_exec_cmd($self, [ @$rdr{0..2} ], [$pager], $new_env);
-       } elsif ($self->{oneshot}) {
-               my $cmd = [$pager];
-               $self->{"pid.$self.$$"}->{spawn($cmd, $new_env, $rdr)} = $cmd;
        } else {
                die 'BUG: start_pager w/o socket';
        }
@@ -1252,29 +1222,13 @@ sub lazy_start {
 
 sub busy { 1 } # prevent daemon-shutdown if client is connected
 
-# for users w/o Socket::Msghdr installed or Inline::C enabled
-sub oneshot {
-       my ($main_pkg) = @_;
-       my $exit = $main_pkg->can('exit'); # caller may override exit()
-       local $quit = $exit if $exit;
-       local %PATH2CFG;
-       umask(077) // die("umask(077): $!");
-       my $self = bless { oneshot => 1, env => \%ENV }, __PACKAGE__;
-       for (0..2) { open($self->{$_}, '+<&=', $_) or die "open fd=$_: $!" }
-       dispatch($self, @ARGV);
-       x_it($self, $self->{child_error}) if $self->{child_error};
-}
-
 # ensures stdout hits the FS before sock disconnects so a client
 # can immediately reread it
 sub DESTROY {
        my ($self) = @_;
        $self->{1}->autoflush(1) if $self->{1};
        stop_pager($self);
-       my $err = $?;
-       my $oneshot_pids = delete $self->{"pid.$self.$$"} or return;
-       waitpid($_, 0) for keys %$oneshot_pids;
-       $? = $err if $err; # preserve ->fail or ->x_it code
+       # preserve $? for ->fail or ->x_it code
 }
 
 sub wq_done_wait { # dwaitpid callback