]> Sergey Matveev's repositories - public-inbox.git/blobdiff - lib/PublicInbox/LeiExternal.pm
www: improve visibility of coderepos
[public-inbox.git] / lib / PublicInbox / LeiExternal.pm
index b402eed4524cab6123191638581283ed01f6326c..47791d4e21ba0d2d67e48f99aadfbcce13752ce5 100644 (file)
@@ -9,7 +9,7 @@ use PublicInbox::Config;
 
 sub externals_each {
        my ($self, $cb, @arg) = @_;
-       my $cfg = $self->_lei_cfg(0);
+       my $cfg = $self->_lei_cfg;
        my %boost;
        for my $sec (grep(/\Aexternal\./, @{$cfg->{-section_order}})) {
                my $loc = substr($sec, length('external.'));
@@ -44,6 +44,8 @@ sub ext_canonicalize {
        }
 }
 
+# TODO: we will probably extract glob2re into a separate module for
+# PublicInbox::Filter::Base and maybe other places
 my %re_map = ( '*' => '[^/]*?', '?' => '[^/]',
                '[' => '[', ']' => ']', ',' => ',' );
 
@@ -52,21 +54,28 @@ sub glob2re {
        my $p = '';
        my $in_bracket = 0;
        my $qm = 0;
+       my $schema_host_port = '';
+
+       # don't glob URL-looking things that look like IPv6
+       if ($re =~ s!\A([a-z0-9\+]+://\[[a-f0-9\:]+\](?::[0-9]+)?/)!!i) {
+               $schema_host_port = quotemeta $1; # "http://[::1]:1234"
+       }
        my $changes = ($re =~ s!(.)!
                $re_map{$p eq '\\' ? '' : do {
                        if ($1 eq '[') { ++$in_bracket }
                        elsif ($1 eq ']') { --$in_bracket }
+                       elsif ($1 eq ',') { ++$qm } # no change
                        $p = $1;
                }} // do {
                        $p = $1;
                        ($p eq '-' && $in_bracket) ? $p : (++$qm, "\Q$p")
                }!sge);
        # bashism (also supported by curl): {a,b,c} => (a|b|c)
-       $re =~ s/([^\\]*)\\\{([^,]*?,[^\\]*?)\\\}/
-               (my $in_braces = $2) =~ tr!,!|!;
-               $1."($in_braces)";
-               /sge;
-       ($changes - $qm) ? $re : undef;
+       $changes += ($re =~ s/([^\\]*)\\\{([^,]*,[^\\]*)\\\}/
+                       (my $in_braces = $2) =~ tr!,!|!;
+                       $1."($in_braces)";
+                       /sge);
+       ($changes - $qm) ? $schema_host_port.$re : undef;
 }
 
 # get canonicalized externals list matching $loc
@@ -99,6 +108,7 @@ sub get_externals {
        ();
 }
 
+# TODO: does this need JSON output?
 sub lei_ls_external {
        my ($self, $filter) = @_;
        my $opt = $self->{opt};
@@ -230,7 +240,7 @@ sub _complete_url_common ($) {
 # shell completion helper called by lei__complete
 sub _complete_forget_external {
        my ($self, @argv) = @_;
-       my $cfg = $self->_lei_cfg(0);
+       my $cfg = $self->_lei_cfg;
        my ($cur, $re) = _complete_url_common(\@argv);
        # FIXME: bash completion off "http:" or "https:" when the last
        # character is a colon doesn't work properly even if we're
@@ -246,7 +256,7 @@ sub _complete_forget_external {
 
 sub _complete_add_external { # for bash, this relies on "compopt -o nospace"
        my ($self, @argv) = @_;
-       my $cfg = $self->_lei_cfg(0);
+       my $cfg = $self->_lei_cfg;
        my ($cur, $re) = _complete_url_common(\@argv);
        require URI;
        map {