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.'));
}
}
+# TODO: we will probably extract glob2re into a separate module for
+# PublicInbox::Filter::Base and maybe other places
my %re_map = ( '*' => '[^/]*?', '?' => '[^/]',
'[' => '[', ']' => ']', ',' => ',' );
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
();
}
+# TODO: does this need JSON output?
sub lei_ls_external {
my ($self, $filter) = @_;
my $opt = $self->{opt};
# 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
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 {