applied

> On June 7, 2018 at 11:59 AM Wolfgang Bumiller <[email protected]> wrote:
> 
> 
> This contains 2 functional changes:
> 
> First: resolve_cmd no longer keeps a hash of which arguments
> were expanded. This information is not required and not used
> properly: For one it would conflict if the same word
> appeared twice in a longer subcommand, and secondly we lose
> the information when recursing into an alias anyway. And
> lastly, we do not support tab completing multiple parameters
> simultaneously anyway (as in, `pveum u a<tab>` does not
> become `pveum user add`).
> So now we simply return the expanded version of the last
> command or undef if it was unknown in place of the hash we
> returned previously.
> 
> The second change is how we use the new returned value:
> Previously if resolve_cmd() returned a new subcommand in
> $def we skipped over finishing the last word. Of course, if
> the command was already fully specified (but no space put
> after it), we already considered it complete and returned
> the new $def.
> This condition can be detected as in this case the $prev
> command equals the $cur command. (Additionally, the $cur
> command is either '' (after the space) or also the $prev
> command (before the space), but checking this would only be
> required when the same word can actually appear multiple
> times in a row in a sub command chain...)
> This case now takes precedence over looking through the
> nested $def, so that bash will put the space after a full
> command which requires another subcommand to be added.
> 
> Signed-off-by: Wolfgang Bumiller <[email protected]>
> ---
>  src/PVE/CLIHandler.pm | 35 ++++++++++++++++++++++-------------
>  1 file changed, 22 insertions(+), 13 deletions(-)
> 
> diff --git a/src/PVE/CLIHandler.pm b/src/PVE/CLIHandler.pm
> index 62a61a7..8c911b2 100644
> --- a/src/PVE/CLIHandler.pm
> +++ b/src/PVE/CLIHandler.pm
> @@ -52,11 +52,12 @@ my $abort = sub {
>  my $expand_command_name = sub {
>      my ($def, $cmd) = @_;
>  
> -    if (!$def->{$cmd}) {
> -     my @expanded = grep { /^\Q$cmd\E/ } keys %$def;
> -     return $expanded[0] if scalar(@expanded) == 1; # enforce exact match
> -    }
> -    return $cmd;
> +    return $cmd if exists $def->{$cmd}; # command is already complete
> +
> +    my @expanded = grep { /^\Q$cmd\E/ } keys %$def;
> +    return $expanded[0] if scalar(@expanded) == 1; # enforce exact match
> +
> +    return undef;
>  };
>  
>  my $get_commands = sub {
> @@ -78,20 +79,27 @@ sub resolve_cmd {
>      my $cmdstr = $exename;
>  
>      if (ref($argv) eq 'ARRAY') {
> -     my $expanded = {};
> +     my $expanded_last_arg;
>       my $last_arg_id = scalar(@$argv) - 1;
>  
>       for my $i (0..$last_arg_id) {
>           $cmd = $expand_command_name->($def, $argv->[$i]);
> +         if (defined($cmd)) {
> +             # If the argument was expanded (or was already complete) and it
> +             # is the final argument, tell our caller about it:
> +             $expanded_last_arg = $cmd if $i == $last_arg_id;
> +         } else {
> +             # Otherwise continue with the unexpanded version of it.
> +             $cmd = $argv->[$i]; 
> +         }
>           $cmdstr .= " $cmd";
> -         $expanded->{$argv->[$i]} = $cmd if $cmd ne $argv->[$i];
>           last if !defined($def->{$cmd});
>           $def = $def->{$cmd};
>  
>           if (ref($def) eq 'ARRAY') {
>               # could expand to a real command, rest of $argv are its 
> arguments
>               my $cmd_args = [ @$argv[$i+1..$last_arg_id] ];
> -             return ($cmd, $def, $cmd_args, $expanded, $cmdstr);
> +             return ($cmd, $def, $cmd_args, $expanded_last_arg, $cmdstr);
>           }
>  
>           if (defined($def->{alias})) {
> @@ -104,7 +112,7 @@ sub resolve_cmd {
>       # got either a special command (bashcomplete, verifyapi) or an unknown
>       # cmd, just return first entry as cmd and the rest of $argv as cmd_arg
>       my $cmd_args = [ @$argv[1..$last_arg_id] ];
> -     return ($argv->[0], $def, $cmd_args, $expanded, $cmdstr);
> +     return ($argv->[0], $def, $cmd_args, $expanded_last_arg, $cmdstr);
>      }
>      return ($cmd, $def, undef, undef, $cmdstr);
>  }
> @@ -313,12 +321,13 @@ my $print_bash_completion = sub {
>      if (!$simple_cmd) {
>       ($cmd, $def, $args, my $expanded) = resolve_cmd($args);
>  
> -     if (ref($def) eq 'HASH') {
> -         &$print_result(@{$get_commands->($def)});
> +     if (defined($expanded) && $prev ne $expanded) {
> +         print "$expanded\n";
>           return;
>       }
> -     if (my $expanded_cmd = $expanded->{$cur}) {
> -         print "$expanded_cmd\n";
> +
> +     if (ref($def) eq 'HASH') {
> +         &$print_result(@{$get_commands->($def)});
>           return;
>       }
>      }
> -- 
> 2.11.0
> 
> 
> _______________________________________________
> pve-devel mailing list
> [email protected]
> https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel

_______________________________________________
pve-devel mailing list
[email protected]
https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel

Reply via email to