]> Sergey Matveev's repositories - public-inbox.git/blobdiff - lib/PublicInbox/LeiExternal.pm
lei forget-external: don't show redundant "not found"
[public-inbox.git] / lib / PublicInbox / LeiExternal.pm
index 21071058a1a43d9aa6823b9092d85527334bd41e..e7693e09a7de67a427742590707926352e54aed0 100644 (file)
@@ -69,16 +69,18 @@ sub lei_forget_external {
        my ($self, @locations) = @_;
        my $cfg = $self->_lei_cfg(1);
        my $quiet = $self->{opt}->{quiet};
+       my %seen;
        for my $loc (@locations) {
                my (@unset, @not_found);
                for my $l ($loc, _canonicalize($loc)) {
+                       next if $seen{$l}++;
                        my $key = "external.$l.boost";
                        delete($cfg->{$key});
                        $self->_config('--unset', $key);
                        if ($? == 0) {
-                               push @unset, $key;
+                               push @unset, $l;
                        } elsif (($? >> 8) == 5) {
-                               push @not_found, $key;
+                               push @not_found, $l;
                        } else {
                                $self->err("# --unset $key error");
                                return $self->x_it($?);
@@ -86,11 +88,52 @@ sub lei_forget_external {
                }
                if (@unset) {
                        next if $quiet;
-                       $self->err("# $_ unset") for @unset;
+                       $self->err("# $_ gone") for @unset;
                } elsif (@not_found) {
                        $self->err("# $_ not found") for @not_found;
                } # else { already exited
        }
 }
 
+# shell completion helper called by lei__complete
+sub _complete_forget_external {
+       my ($self, @argv) = @_;
+       my $cfg = $self->_lei_cfg(0);
+       my $cur = pop @argv;
+       # 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 = '';
+       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
+               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}});
+}
+
 1;