]> Sergey Matveev's repositories - public-inbox.git/commitdiff
lei completion: handle URLs with port numbers
authorEric Wong <e@80x24.org>
Sat, 23 Jan 2021 10:27:51 +0000 (10:27 +0000)
committerEric Wong <e@80x24.org>
Sat, 23 Jan 2021 23:45:30 +0000 (23:45 +0000)
This improves the experience for developers running local
instances of PublicInbox::WWW without permissions to bind
port 80 or 443.

lib/PublicInbox/LeiExternal.pm

index 59c3c3674cefa1dd159a5fb3a184b2e1561952b0..a4e644ee6bae31d3d8e3caef85935bb36ef54366 100644 (file)
@@ -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}});
 }