diff options
Diffstat (limited to 'lib/PublicInbox/LeiUp.pm')
-rw-r--r-- | lib/PublicInbox/LeiUp.pm | 65 |
1 files changed, 36 insertions, 29 deletions
diff --git a/lib/PublicInbox/LeiUp.pm b/lib/PublicInbox/LeiUp.pm index dac0fc28..9931f017 100644 --- a/lib/PublicInbox/LeiUp.pm +++ b/lib/PublicInbox/LeiUp.pm @@ -1,16 +1,16 @@ -# Copyright (C) 2021 all contributors <meta@public-inbox.org> +# Copyright (C) all contributors <meta@public-inbox.org> # License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt> # "lei up" - updates the result of "lei q --save" package PublicInbox::LeiUp; -use strict; -use v5.10.1; +use v5.12; # n.b. we use LeiInput to setup IMAP auth use parent qw(PublicInbox::IPC PublicInbox::LeiInput); -use PublicInbox::LeiSavedSearch; +use PublicInbox::LeiSavedSearch; # OverIdx use PublicInbox::DS; use PublicInbox::PktOp; use PublicInbox::LeiFinmsg; +use PublicInbox::LEI; my $REMOTE_RE = qr!\A(?:imap|http)s?://!i; # http(s) will be for JMAP sub up1 ($$) { @@ -26,13 +26,19 @@ sub up1 ($$) { my $lss = PublicInbox::LeiSavedSearch->up($lei, $out) or return; my $f = $lss->{'-f'}; my $mset_opt = $lei->{mset_opt} = { relevance => -2 }; - my $q = $mset_opt->{q_raw} = $lss->{-cfg}->{'lei.q'} // + my $q = $lss->{-cfg}->get_all('lei.q') // die("lei.q unset in $f (out=$out)\n"); my $lse = $lei->{lse} // die 'BUG: {lse} missing'; - if (ref($q)) { - $mset_opt->{qstr} = $lse->query_argv_to_string($lse->git, $q); + my $rawstr = $lss->{-cfg}->{'lei.internal.rawstr'} // + (scalar(@$q) == 1 && substr($q->[0], -1) eq "\n"); + if ($rawstr) { + die <<EOM if scalar(@$q) > 1; +$f: lei.q has multiple values (@$q) (out=$out) +$f: while lei.internal.rawstr is set +EOM + $lse->query_approxidate($lse->git, $mset_opt->{qstr} = $q->[0]); } else { - $lse->query_approxidate($lse->git, $mset_opt->{qstr} = $q); + $mset_opt->{qstr} = $lse->query_argv_to_string($lse->git, $q); } # n.b. only a few CLI args are accepted for "up", so //= usually sets for my $k ($lss->ARRAY_FIELDS) { @@ -71,6 +77,7 @@ sub redispatch_all ($$) { my $upq = [ (@{$self->{o_local} // []}, @{$self->{o_remote} // []}) ]; return up1($lei, $upq->[0]) if @$upq == 1; # just one, may start MUA + PublicInbox::OverIdx::fork_ok($lei->{opt}); # FIXME: this is also used per-query, see lei->_start_query my $j = $lei->{opt}->{jobs} || do { my $n = $self->detect_nproc // 1; @@ -85,7 +92,6 @@ sub redispatch_all ($$) { $op_c->{ops} = { '' => [ $lei->can('dclose'), $lei ] }; my @first_batch = splice(@$upq, 0, $j); # initial parallelism $lei->{-upq} = $upq; - $lei->{daemon_pid} = $$; $lei->event_step_init; # wait for client disconnects for my $out (@first_batch) { PublicInbox::DS::requeue( @@ -93,6 +99,21 @@ sub redispatch_all ($$) { } } +sub filter_lss { + my ($self, $lei, $all) = @_; + my @outs = PublicInbox::LeiSavedSearch::list($lei); + if ($all eq 'local') { + $self->{o_local} = [ grep(!/$REMOTE_RE/, @outs) ]; + } elsif ($all eq 'remote') { + $self->{o_remote} = [ grep(/$REMOTE_RE/, @outs) ]; + } elsif ($all eq '') { + $self->{o_remote} = [ grep(/$REMOTE_RE/, @outs) ]; + $self->{o_local} = [ grep(!/$REMOTE_RE/, @outs) ]; + } else { + undef; + } +} + sub lei_up { my ($lei, @outs) = @_; my $opt = $lei->{opt}; @@ -101,17 +122,8 @@ sub lei_up { return $lei->fail("--all and @outs incompatible") if @outs; defined($opt->{mua}) and return $lei->fail('--all and --mua= are incompatible'); - @outs = PublicInbox::LeiSavedSearch::list($lei); - if ($all eq 'local') { - $self->{o_local} = [ grep(!/$REMOTE_RE/, @outs) ]; - } elsif ($all eq 'remote') { - $self->{o_remote} = [ grep(/$REMOTE_RE/, @outs) ]; - } elsif ($all eq '') { - $self->{o_remote} = [ grep(/$REMOTE_RE/, @outs) ]; - $self->{o_local} = [ grep(!/$REMOTE_RE/, @outs) ]; - } else { + filter_lss($self, $lei, $all) // return $lei->fail("only --all=$all not understood"); - } } elsif ($lei->{lse}) { # redispatched scalar(@outs) == 1 or die "BUG: lse set w/ >1 out[@outs]"; return up1($lei, $outs[0]); @@ -130,10 +142,7 @@ EOM if ($lei->{auth}) { # start auth worker require PublicInbox::NetWriter; bless $lei->{net}, 'PublicInbox::NetWriter'; - $lei->{auth}->op_merge(my $ops = {}, $self, $lei); - (my $op_c, $ops) = $lei->workers_start($self, 1, $ops); - $lei->{wq1} = $self; - $lei->wait_wq_events($op_c, $ops); + $lei->wq1_start($self); # net_merge_all_done will fire when auth is done } else { redispatch_all($self, $lei); # see below @@ -155,9 +164,8 @@ sub _complete_up { # lei__complete hook map { $match_cb->($_) } PublicInbox::LeiSavedSearch::list($lei); } -sub _wq_done_wait { # dwaitpid callback - my ($arg, $pid) = @_; - my ($wq, $lei) = @$arg; +sub _wq_done_wait { # awaitpid cb + my ($pid, $wq, $lei) = @_; $lei->child_error($?, 'auth failure') if $? } @@ -165,8 +173,7 @@ no warnings 'once'; *ipc_atfork_child = \&PublicInbox::LeiInput::input_only_atfork_child; package PublicInbox::LeiUp1; # for redispatch_all -use strict; -use v5.10.1; +use v5.12; sub nxt ($$$) { my ($lei, $out, $op_p) = @_; @@ -203,8 +210,8 @@ sub event_step { # runs via PublicInbox::DS::requeue sub DESTROY { my ($self) = @_; + return if ($PublicInbox::LEI::daemon_pid // -1) != $$; my $lei = $self->{lei}; # the original, from lei_up - return if $lei->{daemon_pid} != $$; my $sock = delete $self->{unref_on_destroy}; my $s = $lei->{-socks} // []; @$s = grep { $_ != $sock } @$s; |