From 31ae9a28f101a3469107cc3c026e104851c5eab2 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Mon, 19 Apr 2021 14:49:01 -0900 Subject: lei up: support --all=local Users may wish to update several saved searches at once. We can support parallel updates in lei-daemon so users won't have to do it themselves via xargs or similar. Supporting IMAP outputs would be significantly more involved since we'd have to pre-authenticate for every single IMAP output before entering the redispatch loop. --- lib/PublicInbox/LeiUp.pm | 59 ++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 54 insertions(+), 5 deletions(-) (limited to 'lib/PublicInbox/LeiUp.pm') diff --git a/lib/PublicInbox/LeiUp.pm b/lib/PublicInbox/LeiUp.pm index e80ccf57..0fb9698b 100644 --- a/lib/PublicInbox/LeiUp.pm +++ b/lib/PublicInbox/LeiUp.pm @@ -6,15 +6,14 @@ package PublicInbox::LeiUp; use strict; use v5.10.1; use PublicInbox::LeiSavedSearch; -use PublicInbox::LeiOverview; +use parent qw(PublicInbox::IPC); -sub lei_up { +sub up1 ($$) { my ($lei, $out) = @_; - $lei->{lse} = $lei->_lei_store(1)->search; my $lss = PublicInbox::LeiSavedSearch->up($lei, $out) or return; + my $f = $lss->{'-f'}; my $mset_opt = $lei->{mset_opt} = { relevance => -2 }; $mset_opt->{limit} = $lei->{opt}->{limit} // 10000; - my $f = $lss->{'-f'}; my $q = $mset_opt->{q_raw} = $lss->{-cfg}->{'lei.q'} // return $lei->fail("lei.q unset in $f"); my $lse = $lei->{lse} // die 'BUG: {lse} missing'; @@ -40,10 +39,60 @@ sub lei_up { $lei->{lss} = $lss; # for LeiOverview->new my $lxs = $lei->lxs_prepare or return; $lei->ale->refresh_externals($lxs); - $lei->{opt}->{save} = -1; $lei->_start_query; } +sub up1_redispatch { + my ($lei, $out, $op_p) = @_; + my $l = bless { %$lei }, ref($lei); + $l->{opt} = { %{$l->{opt}} }; + delete $l->{sock}; + $l->{''} = $op_p; # daemon only + eval { + $l->qerr("# updating $out"); + up1($l, $out); + $l->qerr("# $out done"); + }; + $l->err($@) if $@; +} + +sub lei_up { + my ($lei, $out) = @_; + $lei->{lse} = $lei->_lei_store(1)->search; + my $opt = $lei->{opt}; + $opt->{save} = -1; + if (defined $opt->{all}) { + length($opt->{mua}//'') and return + $lei->fail('--all and --mua= are incompatible'); + + # supporting IMAP outputs is more involved due to + # git-credential prompts. TODO: add this in 1.8 + $opt->{all} eq 'local' or return + $lei->fail('only --all=local works at the moment'); + my @all = PublicInbox::LeiSavedSearch::list($lei); + my @local = grep(!m!\Aimaps?://!i, @all); + $lei->_lei_store->write_prepare($lei); # share early + if ($lei->{oneshot}) { # synchronous + up1_redispatch($lei, $_) for @local; + } else { + # daemon mode, re-dispatch into our event loop w/o + # creating an extra fork-level + require PublicInbox::DS; + require PublicInbox::PktOp; + my ($op_c, $op_p) = PublicInbox::PktOp->pair; + for my $o (@local) { + PublicInbox::DS::requeue(sub { + up1_redispatch($lei, $o, $op_p); + }); + } + $lei->event_step_init; + $op_c->{ops} = { '' => [$lei->can('dclose'), $lei] }; + } + } else { + up1($lei, $out); + } +} + sub _complete_up { my ($lei, @argv) = @_; my ($cur, $re) = $lei->complete_url_common(\@argv); -- cgit v1.2.3-24-ge0c7