Skip to content

Commit

Permalink
fix(builder): Fully recurse when building
Browse files Browse the repository at this point in the history
Besides addressing the panic from assuming things were built when they
weren't, this should fix some completion issues for some people.

Fixes #3669
  • Loading branch information
epage committed May 1, 2022
1 parent c6849e2 commit 0ecb6f4
Show file tree
Hide file tree
Showing 8 changed files with 23 additions and 27 deletions.
2 changes: 1 addition & 1 deletion clap_complete/tests/snapshots/sub_subcommands.bash
Expand Up @@ -73,7 +73,7 @@ _my-app() {
return 0
;;
my__app__some_cmd__help)
opts="-h -V --help --version <SUBCOMMAND>..."
opts="<SUBCOMMAND>..."
if [[ ${cur} == -* || ${COMP_CWORD} -eq 3 ]] ; then
COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
return 0
Expand Down
4 changes: 0 additions & 4 deletions clap_complete/tests/snapshots/sub_subcommands.elvish
Expand Up @@ -53,10 +53,6 @@ set edit:completion:arg-completer[my-app] = {|@words|
cand --version 'Print version information'
}
&'my-app;some_cmd;help'= {
cand -h 'Print help information'
cand --help 'Print help information'
cand -V 'Print version information'
cand --version 'Print version information'
}
&'my-app;help'= {
}
Expand Down
2 changes: 0 additions & 2 deletions clap_complete/tests/snapshots/sub_subcommands.fish
Expand Up @@ -14,5 +14,3 @@ complete -c my-app -n "__fish_seen_subcommand_from some_cmd; and not __fish_seen
complete -c my-app -n "__fish_seen_subcommand_from some_cmd; and __fish_seen_subcommand_from sub_cmd" -l config -d 'the other case to test' -r -f -a "{Lest quotes aren/'t escaped. }"
complete -c my-app -n "__fish_seen_subcommand_from some_cmd; and __fish_seen_subcommand_from sub_cmd" -s h -l help -d 'Print help information'
complete -c my-app -n "__fish_seen_subcommand_from some_cmd; and __fish_seen_subcommand_from sub_cmd" -s V -l version -d 'Print version information'
complete -c my-app -n "__fish_seen_subcommand_from some_cmd; and __fish_seen_subcommand_from help" -s h -l help -d 'Print help information'
complete -c my-app -n "__fish_seen_subcommand_from some_cmd; and __fish_seen_subcommand_from help" -s V -l version -d 'Print version information'
4 changes: 0 additions & 4 deletions clap_complete/tests/snapshots/sub_subcommands.ps1
Expand Up @@ -60,10 +60,6 @@ Register-ArgumentCompleter -Native -CommandName 'my-app' -ScriptBlock {
break
}
'my-app;some_cmd;help' {
[CompletionResult]::new('-h', 'h', [CompletionResultType]::ParameterName, 'Print help information')
[CompletionResult]::new('--help', 'help', [CompletionResultType]::ParameterName, 'Print help information')
[CompletionResult]::new('-V', 'V', [CompletionResultType]::ParameterName, 'Print version information')
[CompletionResult]::new('--version', 'version', [CompletionResultType]::ParameterName, 'Print version information')
break
}
'my-app;help' {
Expand Down
4 changes: 0 additions & 4 deletions clap_complete/tests/snapshots/sub_subcommands.zsh
Expand Up @@ -70,10 +70,6 @@ _arguments "${_arguments_options[@]}" /
;;
(help)
_arguments "${_arguments_options[@]}" /
'-h[Print help information]' /
'--help[Print help information]' /
'-V[Print version information]' /
'--version[Print version information]' /
'*::subcommand -- The subcommand whose help message to display:' /
&& ret=0
;;
Expand Down
10 changes: 0 additions & 10 deletions clap_complete_fig/tests/snapshots/sub_subcommands.fig.js
Expand Up @@ -56,16 +56,6 @@ const completion: Fig.Spec = {
{
name: "help",
description: "Print this message or the help of the given subcommand(s)",
options: [
{
name: ["-h", "--help"],
description: "Print help information",
},
{
name: ["-V", "--version"],
description: "Print version information",
},
],
args: {
name: "subcommand",
isOptional: true,
Expand Down
8 changes: 6 additions & 2 deletions src/build/command.rs
Expand Up @@ -4008,11 +4008,15 @@ impl<'help> App<'help> {
/// Call this on the top-level [`Command`] when done building and before reading state for
/// cases like completions, custom help output, etc.
pub fn build(&mut self) {
self._build_recursive();
self._build_bin_names_internal();
}

pub(crate) fn _build_recursive(&mut self) {
self._build_self();
for subcmd in self.get_subcommands_mut() {
subcmd._build_self();
subcmd._build_recursive();
}
self._build_bin_names_internal();
}

pub(crate) fn _build_self(&mut self) {
Expand Down
16 changes: 16 additions & 0 deletions tests/builder/tests.rs
Expand Up @@ -408,3 +408,19 @@ fn mut_arg_all() {
cmd = cmd.mut_arg(arg_name, |arg| arg.hide_possible_values(true));
}
}

#[test]
fn issue_3669_command_build_recurses() {
let mut cmd = Command::new("ctest").subcommand(
Command::new("subcmd").subcommand(
Command::new("multi")
.about("tests subcommands")
.author("Kevin K. <kbknapp@gmail.com>")
.version("0.1")
.arg(clap::arg!(
<FLAG> "tests flags"
)),
),
);
cmd.build();
}

0 comments on commit 0ecb6f4

Please sign in to comment.