]> Sergey Matveev's repositories - public-inbox.git/blobdiff - lib/PublicInbox/LEI.pm
lei edit-search: command to tweak search parameters
[public-inbox.git] / lib / PublicInbox / LEI.pm
index 52b588a22a99bf8c94e5b3aa14093f7e84465bba..8fa8994488e12ae82ca22503bbfad095ae4ca0eb 100644 (file)
@@ -68,18 +68,19 @@ sub rel2abs ($$) {
        my ($self, $p) = @_;
        return $p if index($p, '/') == 0; # already absolute
        my $pwd = $self->{env}->{PWD};
+       my $cwd;
        if (defined $pwd) {
-               my $cwd = $self->{3} // getcwd() // die "getcwd(PWD=$pwd): $!";
+               my $xcwd = $self->{3} //
+                       ($cwd = getcwd() // die "getcwd(PWD=$pwd): $!");
                if (my @st_pwd = stat($pwd)) {
-                       my @st_cwd = stat($cwd) or die "stat($cwd): $!";
+                       my @st_cwd = stat($xcwd) or die "stat($xcwd): $!";
                        "@st_pwd[1,0]" eq "@st_cwd[1,0]" or
-                               $self->{env}->{PWD} = $pwd = $cwd;
+                               $self->{env}->{PWD} = $pwd = undef;
                } else { # PWD was invalid
-                       delete $self->{env}->{PWD};
-                       undef $pwd;
+                       $self->{env}->{PWD} = $pwd = undef;
                }
        }
-       $pwd //= $self->{env}->{PWD} = getcwd() // die "getcwd(PWD=$pwd): $!";
+       $pwd //= $self->{env}->{PWD} = $cwd // getcwd() // die "getcwd: $!";
        File::Spec->rel2abs($p, $pwd);
 }
 
@@ -137,8 +138,9 @@ our %CMD = ( # sorted in order of importance/use:
        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 ],
+
+'up' => [ 'OUTPUT|--all', 'update saved search',
+       qw(jobs|j=s lock=s@ alert=s@ mua=s verbose|v+ all:s), @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),
@@ -156,10 +158,12 @@ our %CMD = ( # sorted in order of importance/use:
        'exclude further results from a publicinbox|extindex',
        qw(prune), @c_opt ],
 
-'ls-query' => [ '[FILTER...]', 'list saved search queries',
-               qw(name-only format|f=s), @c_opt ],
-'rm-query' => [ 'QUERY_NAME', 'remove a saved search', @c_opt ],
-'mv-query' => [ qw(OLD_NAME NEW_NAME), 'rename a saved search', @c_opt ],
+'ls-search' => [ '[PREFIX]', 'list saved search queries',
+               qw(format|f=s pretty l ascii z|0), @c_opt ],
+'forget-search' => [ 'OUTPUT', 'forget a saved search',
+               qw(verbose|v+), @c_opt ],
+'edit-search' => [ 'OUTPUT', "edit saved search via `git config --edit'",
+                       @c_opt ],
 
 'plonk' => [ '--threads|--from=IDENT',
        'exclude mail matching From: or threads from non-Message-ID searches',
@@ -311,7 +315,9 @@ my %OPTDESC = (
 'jobs|j=i      add-external' => 'set parallelism when indexing after --mirror',
 
 'in-format|F=s' => $stdin_formats,
-'format|f=s    ls-query' => $ls_format,
+'format|f=s    ls-search' => ['OUT|json|jsonl|concatjson',
+                       'listing output format' ],
+'l     ls-search' => 'long listing format',
 'format|f=s    ls-external' => $ls_format,
 
 'limit|n=i@' => ['NUM', 'limit on number of matches (default: 10000)' ],
@@ -328,6 +334,8 @@ my %OPTDESC = (
 'remote' => 'limit operations to those requiring network access',
 'remote!' => 'prevent operations requiring network access',
 
+'all:s up' => ['local', 'update all (local) saved searches' ],
+
 'mid=s' => 'specify the Message-ID of a message',
 'oid=s' => 'specify the git object ID of a message',
 
@@ -352,7 +360,7 @@ my %CONFIG_KEYS = (
        'leistore.dir' => 'top-level storage location',
 );
 
-my @WQ_KEYS = qw(lxs l2m imp mrr cnv p2q tag sol); # internal workers
+my @WQ_KEYS = qw(lxs l2m imp mrr cnv p2q tag sol lsss); # internal workers
 
 sub _drop_wq {
        my ($self) = @_;
@@ -697,8 +705,7 @@ sub _lei_cfg ($;$) {
                $cur_st = pack('dd', $st[10], $st[7]);
                qerr($self, "# $f created") if $self->{cmd} ne 'config';
        }
-       my $cfg = PublicInbox::Config::git_config_dump($f);
-       bless $cfg, 'PublicInbox::Config';
+       my $cfg = PublicInbox::Config->git_config_dump($f);
        $cfg->{-st} = $cur_st;
        $cfg->{'-f'} = $f;
        if ($sto && File::Spec->canonpath($sto_dir // store_path($self))
@@ -839,11 +846,17 @@ sub start_mua {
                @cmd = map { $_ eq '%f' ? ($replaced = $mfolder) : $_ } @cmd;
        }
        push @cmd, $mfolder unless defined($replaced);
-       if (my $sock = $self->{sock}) { # lei(1) client process runs it
-               send($sock, exec_buf(\@cmd, {}), MSG_EOR);
+       if ($self->{sock}) { # lei(1) client process runs it
+               # restore terminal: echo $query | lei q -stdin --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);