about summary refs log tree commit homepage
path: root/lib/PublicInbox
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2021-10-19 09:33:41 +0000
committerEric Wong <e@80x24.org>2021-10-19 17:29:19 +0000
commitbb0eab1051318528011252866b592735981084a5 (patch)
tree23ccb94338a05522bbb4186e807cae7711cd2a40 /lib/PublicInbox
parent01a049cadb1080698a447479de806755e9bc9342 (diff)
downloadpublic-inbox-bb0eab1051318528011252866b592735981084a5.tar.gz
These can be used to temporarily disable  using certain
externals in case of temporary network failure or mount point
unavailability.
Diffstat (limited to 'lib/PublicInbox')
-rw-r--r--lib/PublicInbox/LEI.pm4
-rw-r--r--lib/PublicInbox/LeiExternal.pm11
-rw-r--r--lib/PublicInbox/LeiQuery.pm15
-rw-r--r--lib/PublicInbox/LeiUp.pm22
4 files changed, 38 insertions, 14 deletions
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;