]> Sergey Matveev's repositories - public-inbox.git/commitdiff
lei up: support --exclude=, --no-(external|remote|local)
authorEric Wong <e@80x24.org>
Tue, 19 Oct 2021 09:33:41 +0000 (09:33 +0000)
committerEric Wong <e@80x24.org>
Tue, 19 Oct 2021 17:29:19 +0000 (17:29 +0000)
These can be used to temporarily disable  using certain
externals in case of temporary network failure or mount point
unavailability.

Documentation/lei-up.pod
lib/PublicInbox/LEI.pm
lib/PublicInbox/LeiExternal.pm
lib/PublicInbox/LeiQuery.pm
lib/PublicInbox/LeiUp.pm

index f06ee5eb62b7270c070ad8d7ac8a62410099d648..8fba0953b1ef4948bb089da6b777b95e2b3b5d7f 100644 (file)
@@ -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<lei-q(1)>, 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<lei q>, these switches override the original C<lei q --only>
+options saved as C<lei.q.only>.
+
+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<lei-q(1)>, but may also exclude externals originally
+specified via C<lei q --only>.
 
 =item --lock=METHOD
 
@@ -49,7 +64,10 @@ The following options, described in L<lei-q(1)>, 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<lei-q(1)>.
+
+C<--mua> is incompatible with C<--all>.
 
 =back
 
@@ -62,7 +80,7 @@ and L<http://4uok3hntl7oi7b4uf4rtfwefqeexfzil2w6kgk2jn5z2f764irre7byd.onion/meta
 
 =head1 COPYRIGHT
 
-Copyright 2021 all contributors L<mailto:meta@public-inbox.org>
+Copyright all contributors L<mailto:meta@public-inbox.org>
 
 License: AGPL-3.0+ L<https://www.gnu.org/licenses/agpl-3.0.txt>
 
index 553379e404fc77ca65247080f1d04bb50056ef6b..5b726f71382e8732b43fae61bfcb6149e874a8a0 100644 (file)
@@ -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
index 851715d7099c4445f29fab429de5b3552075575e..30bb1a4579c74d8245d1eec7b66b9687bd526e71 100644 (file)
@@ -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
index 56b82acc8b5b7da13cfc3dace4712e7d5f44b468..effc572f6aaf45e658b1434537081342e29efe7e 100644 (file)
@@ -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) :
index fcdd535dc118cfec8b198559ff6a224a151ba1b1..dac0fc28788510d98894d05af6c213479202da07 100644 (file)
@@ -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;