[pve-devel] applied: [PATCH common v2] CLIHandler: fix command usage string generation

Wolfgang Bumiller w.bumiller at proxmox.com
Thu Mar 8 15:21:02 CET 2018


applied

On Tue, Mar 06, 2018 at 09:08:11AM +0100, Thomas Lamprecht wrote:
> track our command string, i.e. everything which cannot be an argument
> for a specific command, in resolve_cmd, as we go through the commando
> definition there anyway and know if a ARGV element is part of the
> command itself or its arguments.
> 
> Fixes a problem where a invalid command had all the passed parameter
> attached in the resulting USAGE output.
> 
> Signed-off-by: Thomas Lamprecht <t.lamprecht at proxmox.com>
> ---
> 
> changes v1 -> v2:
> * rebased on current master as Dietmars series produced a trivial merge
>   conflict.
> 
>  src/PVE/CLIHandler.pm | 21 +++++++++------------
>  1 file changed, 9 insertions(+), 12 deletions(-)
> 
> diff --git a/src/PVE/CLIHandler.pm b/src/PVE/CLIHandler.pm
> index 1fd7b02..222051d 100644
> --- a/src/PVE/CLIHandler.pm
> +++ b/src/PVE/CLIHandler.pm
> @@ -75,6 +75,7 @@ sub resolve_cmd {
>      my ($argv, $is_alias) = @_;
>  
>      my ($def, $cmd) = ($cmddef, $argv);
> +    my $cmdstr = $exename;
>  
>      if (ref($argv) eq 'ARRAY') {
>  	my $expanded = {};
> @@ -82,6 +83,7 @@ sub resolve_cmd {
>  
>  	for my $i (0..$last_arg_id) {
>  	    $cmd = $expand_command_name->($def, $argv->[$i]);
> +	    $cmdstr .= " $cmd";
>  	    $expanded->{$argv->[$i]} = $cmd if $cmd ne $argv->[$i];
>  	    last if !defined($def->{$cmd});
>  	    $def = $def->{$cmd};
> @@ -89,7 +91,7 @@ sub resolve_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);
> +		return ($cmd, $def, $cmd_args, $expanded, $cmdstr);
>  	    }
>  
>  	    if (defined($def->{alias})) {
> @@ -102,9 +104,9 @@ 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);
> +	return ($argv->[0], $def, $cmd_args, $expanded, $cmdstr);
>      }
> -    return ($cmd, $def);
> +    return ($cmd, $def, undef, undef, $cmdstr);
>  }
>  
>  sub generate_usage_str {
> @@ -121,7 +123,7 @@ sub generate_usage_str {
>      my $param_mapping_func = $cli_handler_class->can('param_mapping') ||
>  	$cli_handler_class->can('string_param_file_mapping');
>  
> -    my ($subcmd, $def) = resolve_cmd($cmd);
> +    my ($subcmd, $def, undef, undef, $cmdstr) = resolve_cmd($cmd);
>  
>      my $generate;
>      $generate = sub {
> @@ -168,9 +170,6 @@ sub generate_usage_str {
>  	return $str;
>      };
>  
> -    my $cmdstr = $exename;
> -    $cmdstr .= ' ' . join(' ', @$cmd) if defined($cmd);
> -
>      return $generate->($indent, $separator, $def, $cmdstr);
>  }
>  
> @@ -462,8 +461,7 @@ my $handle_cmd  = sub {
>  
>      $cmddef->{help} = [ __PACKAGE__, 'help', ['extra-args'] ];
>  
> -    my $cmd_str = join(' ', @$args);
> -    my ($cmd, $def, $cmd_args) = resolve_cmd($args);
> +    my ($cmd, $def, $cmd_args, undef, $cmd_str) = resolve_cmd($args);
>  
>      $abort->("no command specified") if !$cmd;
>  
> @@ -482,15 +480,14 @@ my $handle_cmd  = sub {
>      }
>  
>      # checked special commands, if def is still a hash we got an incomplete sub command
> -    $abort->("incomplete command '$exename $cmd_str'") if ref($def) eq 'HASH';
> +    $abort->("incomplete command '$cmd_str'") if ref($def) eq 'HASH';
>  
>      &$preparefunc() if $preparefunc;
>  
>      my ($class, $name, $arg_param, $uri_param, $outsub) = @{$def || []};
>      $abort->("unknown command '$cmd_str'") if !$class;
>  
> -    my $prefix = "$exename $cmd_str";
> -    my $res = $class->cli_handler($prefix, $name, $cmd_args, $arg_param, $uri_param, $read_password_func, $param_mapping_func);
> +    my $res = $class->cli_handler($cmd_str, $name, $cmd_args, $arg_param, $uri_param, $read_password_func, $param_mapping_func);
>  
>      &$outsub($res) if $outsub;
>  };
> -- 
> 2.14.2




More information about the pve-devel mailing list