From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: X-Spam-Status: No, score=-4.0 required=3.0 tests=ALL_TRUSTED,BAYES_00 shortcircuit=no autolearn=ham autolearn_force=no version=3.4.2 Received: from localhost (dcvr.yhbt.net [127.0.0.1]) by dcvr.yhbt.net (Postfix) with ESMTP id EBD101FA18 for ; Tue, 19 Oct 2021 09:33:46 +0000 (UTC) From: Eric Wong To: meta@public-inbox.org Subject: [PATCH 06/11] lei up: support --exclude=, --no-(external|remote|local) Date: Tue, 19 Oct 2021 09:33:41 +0000 Message-Id: <20211019093346.30885-7-e@80x24.org> In-Reply-To: <20211019093346.30885-1-e@80x24.org> References: <20211019093346.30885-1-e@80x24.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit List-Id: These can be used to temporarily disable using certain externals in case of temporary network failure or mount point unavailability. --- Documentation/lei-up.pod | 28 +++++++++++++++++++++++----- lib/PublicInbox/LEI.pm | 4 ++-- lib/PublicInbox/LeiExternal.pm | 11 ++++++++++- lib/PublicInbox/LeiQuery.pm | 15 ++++----------- lib/PublicInbox/LeiUp.pm | 22 ++++++++++++++++++++++ 5 files changed, 61 insertions(+), 19 deletions(-) diff --git a/Documentation/lei-up.pod b/Documentation/lei-up.pod index f06ee5eb62b7..8fba0953b1ef 100644 --- a/Documentation/lei-up.pod +++ b/Documentation/lei-up.pod @@ -37,11 +37,26 @@ e.g C<1.hour> or C<3.days> Default: 2.days -=back +=item --no-external -The following options, described in L, are supported. +=item --no-local -=over +=item --no-remote + +These disable the use of all externals, local externals, or +remote externals respectively. They are useful during +temporary network or mount-point outages. + +Unlike C, these switches override the original C +options saved as C. + +The combination C<--all=remote --no-remote> is supported for +offline use in case a user is updating an IMAP folder on localhost. + +=item --exclude=LOCATION + +As with L, but may also exclude externals originally +specified via C. =item --lock=METHOD @@ -49,7 +64,10 @@ The following options, described in L, are supported. =item --mua=CMD -This option is incompatible with C<--all>. +C<--lock>, C<--alert>, and C<--mua> are all supported and +documented in L. + +C<--mua> is incompatible with C<--all>. =back @@ -62,7 +80,7 @@ and L +Copyright all contributors L License: AGPL-3.0+ L diff --git a/lib/PublicInbox/LEI.pm b/lib/PublicInbox/LEI.pm index 553379e404fc..5b726f71382e 100644 --- a/lib/PublicInbox/LEI.pm +++ b/lib/PublicInbox/LEI.pm @@ -178,8 +178,8 @@ our %CMD = ( # sorted in order of importance/use: shared color! mail-sync!), @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+ - remote-fudge-time=s all:s), @c_opt ], + qw(jobs|j=s lock=s@ alert=s@ mua=s verbose|v+ exclude=s@ + remote-fudge-time=s all:s remote! local! external!), @c_opt ], 'lcat' => [ '--stdin|MSGID_OR_URL...', 'display local copy of message(s)', 'stdin|', # /|\z/ must be first for lone dash diff --git a/lib/PublicInbox/LeiExternal.pm b/lib/PublicInbox/LeiExternal.pm index 851715d7099c..30bb1a4579c7 100644 --- a/lib/PublicInbox/LeiExternal.pm +++ b/lib/PublicInbox/LeiExternal.pm @@ -105,7 +105,16 @@ sub get_externals { } else { die("`$loc' is ambiguous:\n", map { "\t$_\n" } @m, "\n"); } - (); +} + +sub canonicalize_excludes { + my ($lei, $excludes) = @_; + my %x; + for my $loc (@$excludes) { + my @l = get_externals($lei, $loc, 1); + $x{$_} = 1 for @l; + } + \%x; } # returns an anonymous sub which returns an array of potential results diff --git a/lib/PublicInbox/LeiQuery.pm b/lib/PublicInbox/LeiQuery.pm index 56b82acc8b5b..effc572f6aaf 100644 --- a/lib/PublicInbox/LeiQuery.pm +++ b/lib/PublicInbox/LeiQuery.pm @@ -95,18 +95,11 @@ sub lxs_prepare { } # --external is enabled by default, but allow --no-external if ($opt->{external} //= 1) { - my %x; - for my $loc (@{$opt->{exclude} // []}) { - my @l = $self->get_externals($loc, 1) or return; - $x{$_} = 1 for @l; - } - my $ne = $self->externals_each(\&prep_ext, $lxs, \%x); + my $ex = $self->canonicalize_excludes($opt->{exclude}); + $self->externals_each(\&prep_ext, $lxs, $ex); $opt->{remote} //= !($lxs->locals - $opt->{'local'}); - if ($opt->{'local'}) { - $lxs->{remotes} = \@iremotes if !$opt->{remote}; - } else { - $lxs->{locals} = \@ilocals; - } + $lxs->{locals} = \@ilocals if !$opt->{'local'}; + $lxs->{remotes} = \@iremotes if !$opt->{remote}; } } ($lxs->locals || $lxs->remotes) ? ($self->{lxs} = $lxs) : diff --git a/lib/PublicInbox/LeiUp.pm b/lib/PublicInbox/LeiUp.pm index fcdd535dc118..dac0fc287885 100644 --- a/lib/PublicInbox/LeiUp.pm +++ b/lib/PublicInbox/LeiUp.pm @@ -15,6 +15,14 @@ my $REMOTE_RE = qr!\A(?:imap|http)s?://!i; # http(s) will be for JMAP sub up1 ($$) { my ($lei, $out) = @_; + # precedence note for CLI switches between lei q and up: + # `lei q --only' > `lei q --no-(remote|local|external)' + # `lei up --no-(remote|local|external)' > `lei.q.only' in saved search + my %no = map { + my $v = $lei->{opt}->{$_}; # set by CLI + (defined($v) && !$v) ? ($_ => 1) : (); + } qw(remote local external); + my $cli_exclude = delete $lei->{opt}->{exclude}; my $lss = PublicInbox::LeiSavedSearch->up($lei, $out) or return; my $f = $lss->{'-f'}; my $mset_opt = $lei->{mset_opt} = { relevance => -2 }; @@ -31,6 +39,20 @@ sub up1 ($$) { my $v = $lss->{-cfg}->get_all("lei.q.$k") // next; $lei->{opt}->{$k} //= $v; } + + # --no-(local|remote) CLI flags overrided saved `lei.q.only' + my $only = $lei->{opt}->{only}; + @$only = map { $lei->get_externals($_) } @$only if $only; + if (scalar keys %no && $only) { + @$only = grep(!m!\Ahttps?://!i, @$only) if $no{remote}; + @$only = grep(m!\Ahttps?://!i, @$only) if $no{'local'}; + } + if ($cli_exclude) { + my $ex = $lei->canonicalize_excludes($cli_exclude); + @$only = grep { !$ex->{$_} } @$only if $only; + push @{$lei->{opt}->{exclude}}, @$cli_exclude; + } + delete $lei->{opt}->{only} if $no{external} || ($only && !@$only); for my $k ($lss->BOOL_FIELDS, $lss->SINGLE_FIELDS) { my $v = $lss->{-cfg}->get_1("lei.q.$k") // next; $lei->{opt}->{$k} //= $v;