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 640381F934 for ; Sat, 25 Sep 2021 08:49:45 +0000 (UTC) From: Eric Wong To: meta@public-inbox.org Subject: [PATCH 1/3] lei forget-external: split into separate file Date: Sat, 25 Sep 2021 08:49:43 +0000 Message-Id: <20210925084945.15899-2-e@80x24.org> In-Reply-To: <20210925084945.15899-1-e@80x24.org> References: <20210925084945.15899-1-e@80x24.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit List-Id: 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. --- MANIFEST | 1 + lib/PublicInbox/LeiExternal.pm | 48 ++-------------------------- lib/PublicInbox/LeiForgetExternal.pm | 46 ++++++++++++++++++++++++++ lib/PublicInbox/LeiQuery.pm | 6 ++-- 4 files changed, 52 insertions(+), 49 deletions(-) create mode 100644 lib/PublicInbox/LeiForgetExternal.pm diff --git a/MANIFEST b/MANIFEST index 3595195a6996..a39afe24aa87 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 f8e610cacb21..35a7d68a17b5 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 000000000000..7a4bbcf80a3a --- /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 cb5ac8fb84a7..c65b00ca0986 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;