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-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 5BF801FA19 for ; Sat, 23 Jan 2021 10:27:56 +0000 (UTC) From: Eric Wong To: meta@public-inbox.org Subject: [PATCH 06/10] lei completion: handle URLs with port numbers Date: Sat, 23 Jan 2021 10:27:51 +0000 Message-Id: <20210123102755.425-7-e@80x24.org> In-Reply-To: <20210123102755.425-1-e@80x24.org> References: <20210123102755.425-1-e@80x24.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit List-Id: This improves the experience for developers running local instances of PublicInbox::WWW without permissions to bind port 80 or 443. --- lib/PublicInbox/LeiExternal.pm | 30 +++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/lib/PublicInbox/LeiExternal.pm b/lib/PublicInbox/LeiExternal.pm index 59c3c367..a4e644ee 100644 --- a/lib/PublicInbox/LeiExternal.pm +++ b/lib/PublicInbox/LeiExternal.pm @@ -101,12 +101,36 @@ sub _complete_forget_external { # Workaround bash word-splitting URLs to ['https', ':', '//' ...] # Maybe there's a better way to go about this in # contrib/completion/lei-completion.bash - my $colon = ($argv[-1] // '') eq ':'; - my $re = $cur =~ /\A[\w-]/ ? '' : '.*'; + my $re = ''; + if (@argv) { + my @x = @argv; + if ($cur eq ':' && @x) { + push @x, $cur; + $cur = ''; + } + while (@x > 2 && $x[0] !~ /\Ahttps?\z/ && $x[1] ne ':') { + shift @x; + } + if (@x >= 2) { # qw(https : hostname : 443) or qw(http :) + $re = join('', @x); + } else { # just filter out the flags and hope for the best + $re = join('', grep(!/^-/, @argv)); + } + $re = quotemeta($re); + } + # 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 - $colon && $x =~ /(\Q$cur\E.*)/ ? $1 : $x; + if ($x =~ /\A$re(\Q$cur\E.*)/) { + # don't duplicate if already 100% completed + $cur eq $1 ? () : $1; + } else { + (); + } } grep(/\Aexternal\.$re\Q$cur/, @{$cfg->{-section_order}}); }