From bb0eab1051318528011252866b592735981084a5 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Tue, 19 Oct 2021 09:33:41 +0000 Subject: lei up: support --exclude=, --no-(external|remote|local) 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 f06ee5eb..8fba0953 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 553379e4..5b726f71 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 851715d7..30bb1a45 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 56b82acc..effc572f 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 fcdd535d..dac0fc28 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; -- cgit v1.2.3-24-ge0c7