Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(help): Do not propagate global args to help #4131

Merged
merged 1 commit into from Aug 27, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
6 changes: 3 additions & 3 deletions clap_complete/tests/snapshots/basic.bash
Expand Up @@ -39,7 +39,7 @@ _my-app() {
return 0
;;
my__app__help)
opts="-c test help"
opts="test help"
if [[ ${cur} == -* || ${COMP_CWORD} -eq 2 ]] ; then
COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
return 0
Expand All @@ -53,7 +53,7 @@ _my-app() {
return 0
;;
my__app__help__help)
opts="-c"
opts=""
if [[ ${cur} == -* || ${COMP_CWORD} -eq 3 ]] ; then
COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
return 0
Expand All @@ -67,7 +67,7 @@ _my-app() {
return 0
;;
my__app__help__test)
opts="-c"
opts=""
if [[ ${cur} == -* || ${COMP_CWORD} -eq 3 ]] ; then
COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
return 0
Expand Down
3 changes: 0 additions & 3 deletions clap_complete/tests/snapshots/basic.elvish
Expand Up @@ -32,15 +32,12 @@ set edit:completion:arg-completer[my-app] = {|@words|
cand --help 'Print help information'
}
&'my-app;help'= {
cand -c 'c'
cand test 'Subcommand'
cand help 'Print this message or the help of the given subcommand(s)'
}
&'my-app;help;test'= {
cand -c 'c'
}
&'my-app;help;help'= {
cand -c 'c'
}
]
$completions[$command]
Expand Down
3 changes: 0 additions & 3 deletions clap_complete/tests/snapshots/basic.fish
Expand Up @@ -6,8 +6,5 @@ complete -c my-app -n "__fish_use_subcommand" -f -a "help" -d 'Print this messag
complete -c my-app -n "__fish_seen_subcommand_from test" -s d
complete -c my-app -n "__fish_seen_subcommand_from test" -s c
complete -c my-app -n "__fish_seen_subcommand_from test" -s h -l help -d 'Print help information'
complete -c my-app -n "__fish_seen_subcommand_from help; and not __fish_seen_subcommand_from test; and not __fish_seen_subcommand_from help" -s c
complete -c my-app -n "__fish_seen_subcommand_from help; and not __fish_seen_subcommand_from test; and not __fish_seen_subcommand_from help" -f -a "test" -d 'Subcommand'
complete -c my-app -n "__fish_seen_subcommand_from help; and not __fish_seen_subcommand_from test; and not __fish_seen_subcommand_from help" -f -a "help" -d 'Print this message or the help of the given subcommand(s)'
complete -c my-app -n "__fish_seen_subcommand_from help; and __fish_seen_subcommand_from test" -s c
complete -c my-app -n "__fish_seen_subcommand_from help; and __fish_seen_subcommand_from help" -s c
3 changes: 0 additions & 3 deletions clap_complete/tests/snapshots/basic.ps1
Expand Up @@ -37,17 +37,14 @@ Register-ArgumentCompleter -Native -CommandName 'my-app' -ScriptBlock {
break
}
'my-app;help' {
[CompletionResult]::new('-c', 'c', [CompletionResultType]::ParameterName, 'c')
[CompletionResult]::new('test', 'test', [CompletionResultType]::ParameterValue, 'Subcommand')
[CompletionResult]::new('help', 'help', [CompletionResultType]::ParameterValue, 'Print this message or the help of the given subcommand(s)')
break
}
'my-app;help;test' {
[CompletionResult]::new('-c', 'c', [CompletionResultType]::ParameterName, 'c')
break
}
'my-app;help;help' {
[CompletionResult]::new('-c', 'c', [CompletionResultType]::ParameterName, 'c')
break
}
})
Expand Down
3 changes: 0 additions & 3 deletions clap_complete/tests/snapshots/basic.zsh
Expand Up @@ -38,7 +38,6 @@ _arguments "${_arguments_options[@]}" /
;;
(help)
_arguments "${_arguments_options[@]}" /
'*-c[]' /
":: :_my-app__help_commands" /
"*::: :->help" /
&& ret=0
Expand All @@ -51,12 +50,10 @@ _arguments "${_arguments_options[@]}" /
case $line[1] in
(test)
_arguments "${_arguments_options[@]}" /
'*-c[]' /
&& ret=0
;;
(help)
_arguments "${_arguments_options[@]}" /
'*-c[]' /
&& ret=0
;;
esac
Expand Down
15 changes: 0 additions & 15 deletions clap_complete_fig/tests/snapshots/basic.fig.js
Expand Up @@ -26,25 +26,10 @@ const completion: Fig.Spec = {
{
name: "test",
description: "Subcommand",
options: [
{
name: "-c",
},
],
},
{
name: "help",
description: "Print this message or the help of the given subcommand(s)",
options: [
{
name: "-c",
},
],
},
],
options: [
{
name: "-c",
},
],
},
Expand Down
10 changes: 10 additions & 0 deletions src/builder/command.rs
Expand Up @@ -4070,7 +4070,17 @@ impl Command {
pub(crate) fn _propagate_global_args(&mut self) {
debug!("Command::_propagate_global_args:{}", self.name);

let autogenerated_help_subcommand = !self.is_disable_help_subcommand_set();

for sc in &mut self.subcommands {
if sc.get_name() == "help" && autogenerated_help_subcommand {
// Avoid propagating args to the autogenerated help subtrees used in completion.
// This prevents args from showing up during help completions like
// `myapp help subcmd <TAB>`, which should only suggest subcommands and not args,
// while still allowing args to show up properly on the generated help message.
continue;
}

for a in self.args.args().filter(|a| a.is_global_set()) {
if sc.find(&a.id).is_some() {
debug!(
Expand Down
105 changes: 105 additions & 0 deletions tests/builder/help.rs
Expand Up @@ -2097,6 +2097,111 @@ Arguments:
);
}

#[test]
fn global_args_should_show_on_toplevel_help_message() {
static HELP: &str = "myapp\x20

Usage:
myapp [OPTIONS] [SUBCOMMAND]

Subcommands:
subcmd\x20\x20\x20\x20
help Print this message or the help of the given subcommand(s)

Options:
-g, --some-global <someglobal>\x20\x20\x20\x20
-h, --help Print help information
";

let cmd = Command::new("myapp")
.arg(
Arg::new("someglobal")
.short('g')
.long("some-global")
.global(true),
)
.subcommand(Command::new("subcmd").subcommand(Command::new("multi").version("1.0")));

utils::assert_output(cmd, "myapp help", HELP, false);
}

#[test]
fn global_args_should_not_show_on_help_message_for_help_help() {
static HELP_HELP: &str = "myapp-help\x20
Print this message or the help of the given subcommand(s)

Usage:
myapp help [SUBCOMMAND]...

Arguments:
[SUBCOMMAND]... The subcommand whose help message to display
";

let cmd = Command::new("myapp")
.arg(
Arg::new("someglobal")
.short('g')
.long("some-global")
.global(true),
)
.subcommand(Command::new("subcmd").subcommand(Command::new("multi").version("1.0")));

utils::assert_output(cmd, "myapp help help", HELP_HELP, false);
}

#[test]
fn global_args_should_show_on_help_message_for_subcommand() {
static HELP_SUBCMD: &str = "myapp-subcmd\x20

Usage:
myapp subcmd [OPTIONS] [SUBCOMMAND]

Subcommands:
multi\x20\x20\x20\x20
help Print this message or the help of the given subcommand(s)

Options:
-g, --some-global <someglobal>\x20\x20\x20\x20
-h, --help Print help information
";

let cmd = Command::new("myapp")
.arg(
Arg::new("someglobal")
.short('g')
.long("some-global")
.global(true),
)
.subcommand(Command::new("subcmd").subcommand(Command::new("multi").version("1.0")));

utils::assert_output(cmd, "myapp help subcmd", HELP_SUBCMD, false);
}

#[test]
fn global_args_should_show_on_help_message_for_nested_subcommand() {
static HELP_SUB_SUBCMD: &str = "myapp-subcmd-multi 1.0

Usage:
myapp subcmd multi [OPTIONS]

Options:
-g, --some-global <someglobal>\x20\x20\x20\x20
-h, --help Print help information
-V, --version Print version information
";

let cmd = Command::new("myapp")
.arg(
Arg::new("someglobal")
.short('g')
.long("some-global")
.global(true),
)
.subcommand(Command::new("subcmd").subcommand(Command::new("multi").version("1.0")));

utils::assert_output(cmd, "myapp help subcmd multi", HELP_SUB_SUBCMD, false);
}

#[test]
fn option_usage_order() {
static OPTION_USAGE_ORDER: &str = "order
Expand Down