X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=lib%2FPublicInbox%2FLEI.pm;h=8fa8994488e12ae82ca22503bbfad095ae4ca0eb;hb=4ea40d3f60bdf8e2a8b04f99d8e308309f2748cb;hp=7292d0f22c344f08cc7774d5830f2fdffceb231a;hpb=8ab43c1c27c725a8ef9307f5dba3e565169d48ca;p=public-inbox.git diff --git a/lib/PublicInbox/LEI.pm b/lib/PublicInbox/LEI.pm index 7292d0f2..8fa89944 100644 --- a/lib/PublicInbox/LEI.pm +++ b/lib/PublicInbox/LEI.pm @@ -68,28 +68,31 @@ 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); } -sub store_path ($) { +sub share_path ($) { # $HOME/.local/share/lei/$FOO my ($self) = @_; rel2abs($self, ($self->{env}->{XDG_DATA_HOME} // ($self->{env}->{HOME} // '/nonexistent').'/.local/share') - .'/lei/store'); + .'/lei'); } +sub store_path ($) { share_path($_[0]) . '/store' } + sub _config_path ($) { my ($self) = @_; rel2abs($self, ($self->{env}->{XDG_CONFIG_HOME} // @@ -136,6 +139,9 @@ our %CMD = ( # sorted in order of importance/use: import-before! lock=s@ rsyncable alert=s@ mua=s verbose|v+), @c_opt, opt_dash('limit|n=i', '[0-9]+') ], +'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), @lxs_opt, @c_opt ], @@ -152,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', @@ -307,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)' ], @@ -324,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', @@ -348,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) = @_; @@ -693,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)) @@ -835,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);