'q' => [ '--stdin|SEARCH_TERMS...', 'search for messages matching terms',
'stdin|', # /|\z/ must be first for lone dash
@lxs_opt,
- qw(save-as=s output|mfolder|o=s format|f=s dedupe|d=s threads|t+
+ qw(save output|mfolder|o=s format|f=s dedupe|d=s threads|t+
sort|s=s reverse|r offset=i pretty jobs|j=s globoff|g augment|a
import-before! lock=s@ rsyncable alert=s@ mua=s verbose|v+), @c_opt,
opt_dash('limit|n=i', '[0-9]+') ],
+'up' => [ 'SEARCH_TERMS...', 'update saved search',
+ qw(jobs|j=s lock=s@ alert=s@ mua=s verbose|v+), @c_opt ],
'blob' => [ 'OID', 'show a git blob, reconstructing from mail if necessary',
qw(git-dir=s@ cwd! verbose|v+ mail! oid-a|A=s path-a|a=s path-b|b=s),
'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 ],
-'mark' => [ 'KEYWORDS...',
- 'set/unset keywords on message(s)',
+'tag' => [ 'KEYWORDS...',
+ 'set/unset keywords and/or labels on message(s)',
qw(stdin| in-format|F=s input|i=s@ oid=s@ mid=s@), @c_opt,
pass_through('-kw:foo for delete') ],
'forget' => [ '[--stdin|--oid=OID|--by-mid=MID]',
'remove imported messages from IMAP, Maildirs, and MH',
qw(exact! all jobs:i indexed), @c_opt ],
-# code repos are used for `show' to solve blobs from patch mails
-'add-coderepo' => [ 'DIRNAME', 'add or set priority of a git code repo',
- qw(boost=i), @c_opt ],
-'ls-coderepo' => [ '[FILTER_TERMS...]',
- 'list known code repos', qw(format|f=s z), @c_opt ],
-'forget-coderepo' => [ 'DIRNAME',
- 'stop using repo to solve blobs from patches',
- qw(prune), @c_opt ],
-
'add-watch' => [ 'LOCATION', 'watch for new messages and flag changes',
qw(import! kw|keywords|flags! interval=s recursive|r
exclude=s include=s), @c_opt ],
'torsocks=s' => ['VAL|auto|no|yes',
'whether or not to wrap git and curl commands with torsocks'],
'no-torsocks' => 'alias for --torsocks=no',
-'save-as=s' => ['NAME', 'save a search terms by given name'],
+'save' => "save a search for `lei up'",
'import-remote!' => 'do not memoize remote messages into local store',
'type=s' => [ 'any|mid|git', 'disambiguate type' ],
'leistore.dir' => 'top-level storage location',
);
-my @WQ_KEYS = qw(lxs l2m imp mrr cnv p2q mark sol); # internal workers
+my @WQ_KEYS = qw(lxs l2m imp mrr cnv p2q tag sol); # internal workers
+
+sub _drop_wq {
+ my ($self) = @_;
+ for my $wq (grep(defined, delete(@$self{@WQ_KEYS}))) { $wq->DESTROY }
+}
# pronounced "exit": x_it(1 << 8) => exit(1); x_it(13) => SIGPIPE
sub x_it ($$) {
send($s, "x_it $code", MSG_EOR);
} elsif ($self->{oneshot}) {
# don't want to end up using $? from child processes
- for my $f (@WQ_KEYS) {
- my $wq = delete $self->{$f} or next;
- $wq->DESTROY;
- }
+ _drop_wq($self);
# cleanup anything that has tempfiles or open file handles
%PATH2CFG = ();
delete @$self{qw(ovv dedupe sto cfg)};
sub fail_handler ($;$$) {
my ($lei, $code, $io) = @_;
- for my $f (@WQ_KEYS) {
- my $wq = delete $lei->{$f} or next;
- $wq->wq_wait_old(undef, $lei) if $wq->wq_kill_old; # lei-daemon
- }
close($io) if $io; # needed to avoid warnings on SIGPIPE
+ _drop_wq($lei);
x_it($lei, $code // (1 << 8));
}
if (my $sock = $self->{sock}) { # lei(1) client process runs it
send($sock, exec_buf(\@cmd, {}), MSG_EOR);
} elsif ($self->{oneshot}) {
- $self->{"pid.$self.$$"}->{spawn(\@cmd)} = \@cmd;
+ my $pid = fork // die "fork: $!";
+ if ($pid > 0) { # original process
+ 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));
}
+ return unless -t $self->{2}; # XXX how to determine non-TUI MUAs?
$self->{opt}->{quiet} = 1;
delete $self->{-progress};
delete $self->{opt}->{verbose};
sub dclose {
my ($self) = @_;
delete $self->{-progress};
- for my $f (@WQ_KEYS) {
- my $wq = delete $self->{$f} or next;
- if ($wq->wq_kill) {
- $wq->wq_close(0, undef, $self);
- } elsif ($wq->wq_kill_old) {
- $wq->wq_wait_old(undef, $self);
- }
- }
+ _drop_wq($self);
close(delete $self->{1}) if $self->{1}; # may reap_compress
$self->close if $self->{-event_init_done}; # PublicInbox::DS::close
}