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 477F61FA18 for ; Thu, 29 Apr 2021 09:46:21 +0000 (UTC) From: Eric Wong To: meta@public-inbox.org Subject: [PATCH 4/4] lei import: support shell completion of known folders Date: Thu, 29 Apr 2021 09:46:20 +0000 Message-Id: <20210429094620.15195-5-e@80x24.org> In-Reply-To: <20210429094620.15195-1-e@80x24.org> References: <20210429094620.15195-1-e@80x24.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit List-Id: This also fixes completion of "lei up" for IMAP folders. --- contrib/completion/lei-completion.bash | 1 + lib/PublicInbox/LeiExternal.pm | 22 ++++++++++++---------- lib/PublicInbox/LeiImport.pm | 8 ++++++++ lib/PublicInbox/LeiUp.pm | 4 ++-- 4 files changed, 23 insertions(+), 12 deletions(-) diff --git a/contrib/completion/lei-completion.bash b/contrib/completion/lei-completion.bash index 2c28d44a..5c137e68 100644 --- a/contrib/completion/lei-completion.bash +++ b/contrib/completion/lei-completion.bash @@ -9,6 +9,7 @@ _lei() { *':'* | *'='* | '//'*) compopt -o nospace ;; *) compopt +o nospace ;; # the default esac + wordlist="${wordlist//;/\\\\;}" # escape ';' for ';UIDVALIDITY' and such COMPREPLY=($(compgen -W "$wordlist" -- "${COMP_WORDS[COMP_CWORD]}")) return 0 } diff --git a/lib/PublicInbox/LeiExternal.pm b/lib/PublicInbox/LeiExternal.pm index 3858085e..6fd3efef 100644 --- a/lib/PublicInbox/LeiExternal.pm +++ b/lib/PublicInbox/LeiExternal.pm @@ -215,7 +215,8 @@ sub lei_forget_external { } } -sub complete_url_common { +# returns an anonymous sub which returns an array of potential results +sub complete_url_prepare { my $argv = $_[-1]; # Workaround bash word-splitting URLs to ['https', ':', '//' ...] # Maybe there's a better way to go about this in @@ -239,37 +240,38 @@ sub complete_url_common { } $re = quotemeta($re); } - ($cur, $re); + my $match_cb = sub { + # only return the part specified on the CLI + # don't duplicate if already 100% completed + $_[0] =~ /\A$re(\Q$cur\E.*)/ ? ($cur eq $1 ? () : $1) : () + }; + 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) = complete_url_common(\@argv); + 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 { - my $x = substr($_, length('external.')); - # only return the part specified on the CLI - # don't duplicate if already 100% completed - $x =~ /\A$re(\Q$cur\E.*)/ ? ($cur eq $1 ? () : $1) : (); + $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; - my ($cur, $re) = complete_url_common(\@argv); + my $match_cb = complete_url_prepare(\@argv); require URI; map { my $u = URI->new(substr($_, length('external.'))); my ($base) = ($u->path =~ m!((?:/?.*)?/)[^/]+/?\z!); $u->path($base); - $u = $u->as_string; - $u =~ /\A$re(\Q$cur\E.*)/ ? ($cur eq $1 ? () : $1) : (); + $match_cb->($u->as_string); } grep(m!\Aexternal\.https?://!, @{$cfg->{-section_order}}); } diff --git a/lib/PublicInbox/LeiImport.pm b/lib/PublicInbox/LeiImport.pm index 277f4f95..def121ab 100644 --- a/lib/PublicInbox/LeiImport.pm +++ b/lib/PublicInbox/LeiImport.pm @@ -89,6 +89,14 @@ sub lei_import { # the main "lei import" method $op_c->op_wait_event($ops); } +sub _complete_import { + my ($lei, @argv) = @_; + my $sto = $lei->_lei_store or return; + my $lms = $sto->search->lms or return; + my $match_cb = $lei->complete_url_prepare(\@argv); + map { $match_cb->($_) } $lms->folders; +} + no warnings 'once'; *ipc_atfork_child = \&PublicInbox::LeiInput::input_only_atfork_child; diff --git a/lib/PublicInbox/LeiUp.pm b/lib/PublicInbox/LeiUp.pm index f4ff070b..4399c4fb 100644 --- a/lib/PublicInbox/LeiUp.pm +++ b/lib/PublicInbox/LeiUp.pm @@ -99,8 +99,8 @@ sub lei_up { sub _complete_up { my ($lei, @argv) = @_; - my ($cur, $re) = $lei->complete_url_common(\@argv); - grep(/\A$re\Q$cur/, PublicInbox::LeiSavedSearch::list($lei)); + my $match_cb = $lei->complete_url_prepare(\@argv); + map { $match_cb->($_) } PublicInbox::LeiSavedSearch::list($lei); } 1;