From: Eric Wong Date: Sat, 25 Sep 2021 08:49:43 +0000 (+0000) Subject: lei forget-external: split into separate file X-Git-Tag: v1.7.0~271 X-Git-Url: http://www.git.stargrave.org/?p=public-inbox.git;a=commitdiff_plain;h=a16e4816546cc098dab392eb1af4667e4961a753 lei forget-external: split into separate file This was written before we had auto-loading, and forget-external should be a rarely-used command that's not worth loading at startup. Do some golfing while we're in the area, too. --- diff --git a/MANIFEST b/MANIFEST index 3595195a..a39afe24 100644 --- a/MANIFEST +++ b/MANIFEST @@ -218,6 +218,7 @@ lib/PublicInbox/LeiEditSearch.pm lib/PublicInbox/LeiExportKw.pm lib/PublicInbox/LeiExternal.pm lib/PublicInbox/LeiFinmsg.pm +lib/PublicInbox/LeiForgetExternal.pm lib/PublicInbox/LeiForgetMailSync.pm lib/PublicInbox/LeiForgetSearch.pm lib/PublicInbox/LeiHelp.pm diff --git a/lib/PublicInbox/LeiExternal.pm b/lib/PublicInbox/LeiExternal.pm index f8e610ca..35a7d68a 100644 --- a/lib/PublicInbox/LeiExternal.pm +++ b/lib/PublicInbox/LeiExternal.pm @@ -31,7 +31,7 @@ sub externals_each { } sub ext_canonicalize { - my ($location) = @_; + my $location = $_[-1]; # $_[0] may be $lei if ($location !~ m!\Ahttps?://!) { PublicInbox::Config::rel2abs_collapsed($location); } else { @@ -185,39 +185,9 @@ sub lei_add_external { } } -sub lei_forget_external { - my ($self, @locations) = @_; - my $cfg = $self->_lei_cfg(1); - my $quiet = $self->{opt}->{quiet}; - my %seen; - for my $loc (@locations) { - my (@unset, @not_found); - for my $l ($loc, ext_canonicalize($loc)) { - next if $seen{$l}++; - my $key = "external.$l.boost"; - delete($cfg->{$key}); - $self->_config('--unset', $key); - if ($? == 0) { - push @unset, $l; - } elsif (($? >> 8) == 5) { - push @not_found, $l; - } else { - $self->err("# --unset $key error"); - return $self->x_it($?); - } - } - if (@unset) { - next if $quiet; - $self->err("# $_ gone") for @unset; - } elsif (@not_found) { - $self->err("# $_ not found") for @not_found; - } # else { already exited - } -} - # returns an anonymous sub which returns an array of potential results sub complete_url_prepare { - my $argv = $_[-1]; + my $argv = $_[-1]; # $_[0] may be $lei # Workaround bash word-splitting URLs to ['https', ':', '//' ...] # Maybe there's a better way to go about this in # contrib/completion/lei-completion.bash @@ -253,20 +223,6 @@ sub complete_url_prepare { wantarray ? ($re, $cur, $match_cb) : $match_cb; } -# shell completion helper called by lei__complete -sub _complete_forget_external { - my ($self, @argv) = @_; - my $cfg = $self->_lei_cfg; - my ($cur, $re, $match_cb) = complete_url_prepare(\@argv); - # FIXME: bash completion off "http:" or "https:" when the last - # character is a colon doesn't work properly even if we're - # returning "//$HTTP_HOST/$PATH_INFO/", not sure why, could - # be a bash issue. - map { - $match_cb->(substr($_, length('external.'))); - } grep(/\Aexternal\.$re\Q$cur/, @{$cfg->{-section_order}}); -} - sub _complete_add_external { # for bash, this relies on "compopt -o nospace" my ($self, @argv) = @_; my $cfg = $self->_lei_cfg; diff --git a/lib/PublicInbox/LeiForgetExternal.pm b/lib/PublicInbox/LeiForgetExternal.pm new file mode 100644 index 00000000..7a4bbcf8 --- /dev/null +++ b/lib/PublicInbox/LeiForgetExternal.pm @@ -0,0 +1,46 @@ +# Copyright (C) all contributors +# License: AGPL-3.0+ + +# "lei forget-external" command +package PublicInbox::LeiForgetExternal; +use strict; +use v5.10.1; + +sub lei_forget_external { + my ($lei, @locations) = @_; + my $cfg = $lei->_lei_cfg or + return $lei->fail('no externals configured'); + my %seen; + for my $loc (@locations) { + for my $l ($loc, $lei->ext_canonicalize($loc)) { + next if $seen{$l}++; + my $key = "external.$l.boost"; + delete($cfg->{$key}); + $lei->_config('--unset', $key); + if ($? == 0) { + $lei->qerr("# $l forgotten "); + } elsif (($? >> 8) == 5) { + $lei->err("# $l not found"); + } else { + $lei->err("# --unset $key error"); + return $lei->x_it($?); + } + } + } +} + +# shell completion helper called by lei__complete +sub _complete_forget_external { + my ($lei, @argv) = @_; + my $cfg = $lei->_lei_cfg or return (); + my ($cur, $re, $match_cb) = $lei->complete_url_prepare(\@argv); + # FIXME: bash completion off "http:" or "https:" when the last + # character is a colon doesn't work properly even if we're + # returning "//$HTTP_HOST/$PATH_INFO/", not sure why, could + # be a bash issue. + map { + $match_cb->(substr($_, length('external.'))); + } grep(/\Aexternal\.$re\Q$cur/, @{$cfg->{-section_order}}); +} + +1; diff --git a/lib/PublicInbox/LeiQuery.pm b/lib/PublicInbox/LeiQuery.pm index cb5ac8fb..c65b00ca 100644 --- a/lib/PublicInbox/LeiQuery.pm +++ b/lib/PublicInbox/LeiQuery.pm @@ -158,11 +158,11 @@ no query allowed on command-line with --stdin # shell completion helper called by lei__complete sub _complete_q { my ($self, @argv) = @_; - my $ext = qr/\A(?:-I|(?:--(?:include|exclude|only)))\z/; my @cur; + my $cb = $self->lazy_cb(qw(forget-external _complete_)); while (@argv) { - if ($argv[-1] =~ $ext) { - my @c = $self->_complete_forget_external(@cur); + if ($argv[-1] =~ /\A(?:-I|(?:--(?:include|exclude|only)))\z/) { + my @c = $cb->($self, @cur); # try basename match: if (scalar(@cur) == 1 && index($cur[0], '/') < 0) { my $all = $self->externals_each;