about summary refs log tree commit homepage
path: root/lib
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2021-01-23 10:27:51 +0000
committerEric Wong <e@80x24.org>2021-01-23 23:45:30 +0000
commitd7a74234a1c83b4a4d8ee23dec2bd67c391bd399 (patch)
tree23e502232698e5b233cb03159e2d8e6baf6132b1 /lib
parent27ea6f3e84dbeb65589dccef22947f17919f2f9c (diff)
downloadpublic-inbox-d7a74234a1c83b4a4d8ee23dec2bd67c391bd399.tar.gz
This improves the experience for developers running local
instances of PublicInbox::WWW without permissions to bind
port 80 or 443.
Diffstat (limited to 'lib')
-rw-r--r--lib/PublicInbox/LeiExternal.pm30
1 files 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}});
 }