'[' => '[', ']' => ']', ',' => ',' );
sub glob2re {
- my ($re) = @_;
+ my $re = $_[-1];
my $p = '';
my $in_bracket = 0;
my $qm = 0;
sub lei_add_external {
my ($self, $location) = @_;
- $self->_lei_store(1)->write_prepare($self);
my $opt = $self->{opt};
my $mirror = $opt->{mirror} // do {
my @fail;
for my $sw ($self->index_opt, $self->curl_opt,
- qw(c no-torsocks torsocks inbox-version)) {
+ qw(no-torsocks torsocks inbox-version)) {
my ($f) = (split(/|/, $sw, 2))[0];
next unless defined $opt->{$f};
$f = length($f) == 1 ? "-$f" : "--$f";
}
}
-sub _complete_url_common ($) {
- my ($argv) = @_;
+# returns an anonymous sub which returns an array of potential results
+sub complete_url_prepare {
+ my $argv = $_[-1];
# Workaround bash word-splitting URLs to ['https', ':', '//' ...]
# Maybe there's a better way to go about this in
# contrib/completion/lei-completion.bash
my $re = '';
- my $cur = pop @$argv;
+ my $cur = pop(@$argv) // '';
if (@$argv) {
my @x = @$argv;
if ($cur eq ':' && @x) {
push @x, $cur;
$cur = '';
}
- while (@x > 2 && $x[0] !~ /\Ahttps?\z/ && $x[1] ne ':') {
+ while (@x > 2 && $x[0] !~ /\A(?:http|nntp|imap)s?\z/i &&
+ $x[1] ne ':') {
shift @x;
}
if (@x >= 2) { # qw(https : hostname : 443) or qw(http :)
}
$re = quotemeta($re);
}
- ($cur, $re);
+ my $match_cb = sub {
+ # only return the part specified on the CLI
+ # don't duplicate if already 100% completed
+ $_[0] =~ /\A$re(\Q$cur\E.*)/ ? ($cur eq $1 ? () : $1) : ()
+ };
+ wantarray ? ($re, $cur, $match_cb) : $match_cb;
}
# shell completion helper called by lei__complete
sub _complete_forget_external {
my ($self, @argv) = @_;
my $cfg = $self->_lei_cfg;
- my ($cur, $re) = _complete_url_common(\@argv);
+ my ($cur, $re, $match_cb) = complete_url_prepare(\@argv);
# 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
- # don't duplicate if already 100% completed
- $x =~ /\A$re(\Q$cur\E.*)/ ? ($cur eq $1 ? () : $1) : ();
+ $match_cb->(substr($_, length('external.')));
} grep(/\Aexternal\.$re\Q$cur/, @{$cfg->{-section_order}});
}
sub _complete_add_external { # for bash, this relies on "compopt -o nospace"
my ($self, @argv) = @_;
my $cfg = $self->_lei_cfg;
- my ($cur, $re) = _complete_url_common(\@argv);
+ my $match_cb = complete_url_prepare(\@argv);
require URI;
map {
my $u = URI->new(substr($_, length('external.')));
my ($base) = ($u->path =~ m!((?:/?.*)?/)[^/]+/?\z!);
$u->path($base);
- $u = $u->as_string;
- $u =~ /\A$re(\Q$cur\E.*)/ ? ($cur eq $1 ? () : $1) : ();
+ $match_cb->($u->as_string);
} grep(m!\Aexternal\.https?://!, @{$cfg->{-section_order}});
}