X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=lib%2FPublicInbox%2FLEI.pm;h=a94941a995e8ad88b443de1e4ae1b5c607eee988;hb=7d3a5e7e0edf0c3aef219d0e03af905f956cf671;hp=eb3ad9e290f9a34da656a8ac3f68a8afaac64fcb;hpb=65ec1f78464ce8cf4f6379aca7bbae38743c50f0;p=public-inbox.git diff --git a/lib/PublicInbox/LEI.pm b/lib/PublicInbox/LEI.pm index eb3ad9e2..a94941a9 100644 --- a/lib/PublicInbox/LEI.pm +++ b/lib/PublicInbox/LEI.pm @@ -120,6 +120,9 @@ sub index_opt { } my @c_opt = qw(c=s@ C=s@ quiet|q); +my @lxs_opt = (qw(remote! local! external! include|I=s@ exclude=s@ only=s@ + import-remote! no-torsocks torsocks=s), + PublicInbox::LeiQuery::curl_opt()); # we generate shell completion + help using %CMD and %OPTDESC, # see lei__complete() and PublicInbox::LeiHelp @@ -127,16 +130,15 @@ my @c_opt = qw(c=s@ C=s@ quiet|q); our %CMD = ( # sorted in order of importance/use: '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+ - sort|s=s reverse|r offset=i remote! local! external! pretty - include|I=s@ exclude=s@ only=s@ jobs|j=s globoff|g augment|a - import-remote! import-before! lock=s@ rsyncable - alert=s@ mua=s no-torsocks torsocks=s verbose|v+), @c_opt, - PublicInbox::LeiQuery::curl_opt(), opt_dash('limit|n=i', '[0-9]+') ], + 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]+') ], -'show' => [ 'MID|OID', 'show a given object (Message-ID or object ID)', - qw(type=s solve! format|f=s dedupe|d=s threads|t remote local! - verbose|v+), @c_opt, pass_through('git show') ], +'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 ], 'add-external' => [ 'LOCATION', 'add/set priority of a publicinbox|extindex for extra matches', @@ -247,7 +249,12 @@ my %OPTDESC = ( "and\xa0'[]'\x{a0}ranges", 'verbose|v+' => 'be more verbose', 'external!' => 'do not use externals', -'solve!' => 'do not attempt to reconstruct blobs from emails', +'mail!' => 'do not look in mail storage for OID', +'cwd!' => 'do not look in git repo of current working directory', +'oid-a|A=s' => 'pre-image OID', +'path-a|a=s' => 'pre-image pathname associated with OID', +'path-b|b=s' => 'post-image pathname associated with OID', +'git-dir=s@' => 'additional git repository to scan', 'torsocks=s' => ['VAL|auto|no|yes', 'whether or not to wrap git and curl commands with torsocks'], 'no-torsocks' => 'alias for --torsocks=no', @@ -350,7 +357,7 @@ my %CONFIG_KEYS = ( 'leistore.dir' => 'top-level storage location', ); -my @WQ_KEYS = qw(lxs l2m imp mrr cnv p2q mark); # internal workers +my @WQ_KEYS = qw(lxs l2m imp mrr cnv p2q mark sol); # internal workers # pronounced "exit": x_it(1 << 8) => exit(1); x_it(13) => SIGPIPE sub x_it ($$) { @@ -492,11 +499,11 @@ sub _delete_pkt_op { # OnDestroy callback to prevent leaks on die } sub pkt_op_pair { - my ($self, $ops) = @_; + my ($self) = @_; require PublicInbox::OnDestroy; require PublicInbox::PktOp; my $end = PublicInbox::OnDestroy->new($$, \&_delete_pkt_op, $self); - @$self{qw(pkt_op_c pkt_op_p)} = PublicInbox::PktOp->pair($ops); + @$self{qw(pkt_op_c pkt_op_p)} = PublicInbox::PktOp->pair; $end; } @@ -510,14 +517,13 @@ sub workers_start { ($ops ? %$ops : ()), }; $ops->{''} //= [ \&dclose, $lei ]; - my $end = $lei->pkt_op_pair($ops); + my $end = $lei->pkt_op_pair; $wq->wq_workers_start($ident, $jobs, $lei->oldset, { lei => $lei }); delete $lei->{pkt_op_p}; - my $op = delete $lei->{pkt_op_c}; + my $op_c = delete $lei->{pkt_op_c}; @$end = (); $lei->event_step_init; - # oneshot needs $op, daemon-mode uses DS->EventLoop to handle $op - $lei->{oneshot} ? $op : undef; + ($op_c, $ops); } sub _help { @@ -726,10 +732,6 @@ sub _lei_store ($;$) { }; } -sub lei_show { - my ($self, @argv) = @_; -} - sub _config { my ($self, @argv) = @_; my %env = (%{$self->{env}}, GIT_CONFIG => undef); @@ -747,38 +749,6 @@ sub lei_config { x_it($self, $?) if $?; } -sub lei_init { - my ($self, $dir) = @_; - my $cfg = _lei_cfg($self, 1); - my $cur = $cfg->{'leistore.dir'}; - $dir //= store_path($self); - $dir = rel2abs($self, $dir); - my @cur = stat($cur) if defined($cur); - $cur = File::Spec->canonpath($cur // $dir); - my @dir = stat($dir); - my $exists = "# leistore.dir=$cur already initialized" if @dir; - if (@cur) { - if ($cur eq $dir) { - _lei_store($self, 1)->done; - return qerr($self, $exists); - } - - # some folks like symlinks and bind mounts :P - if (@dir && "@cur[1,0]" eq "@dir[1,0]") { - lei_config($self, 'leistore.dir', $dir); - _lei_store($self, 1)->done; - return qerr($self, "$exists (as $cur)"); - } - return fail($self, <<""); -E: leistore.dir=$cur already initialized and it is not $dir - - } - lei_config($self, 'leistore.dir', $dir); - _lei_store($self, 1)->done; - $exists //= "# leistore.dir=$dir newly initialized"; - return qerr($self, $exists); -} - sub lei_daemon_pid { puts shift, $$ } sub lei_daemon_kill { @@ -787,8 +757,6 @@ sub lei_daemon_kill { kill($sig, $$) or fail($self, "kill($sig, $$): $!"); } -sub lei_help { _help($_[0]) } - # Shell completion helper. Used by lei-completion.bash and hopefully # other shells. Try to do as much here as possible to avoid redundancy # and improve maintainability. @@ -823,7 +791,7 @@ sub lei__complete { if (s/[:=].+\z//) { # req/optional args, e.g output|o=i } elsif (s/\+\z//) { # verbose|v+ } elsif (s/!\z//) { - # negation: solve! => no-solve|solve + # negation: mail! => no-mail|mail s/([\w\-]+)/$1|no-$1/g } map {