From ac5cd3795ca4c1d073dcb0996c5ffa2636a2bbe9 Mon Sep 17 00:00:00 2001 From: Ed Page Date: Tue, 30 Aug 2022 13:43:22 -0500 Subject: [PATCH] fix(usage): Don't include irrelevant parent args This was identified in https://github.com/clap-rs/clap/discussions/4134 --- src/builder/command.rs | 7 ++++-- tests/builder/help.rs | 52 +++++++++++++++++++++++++++++++++++------- 2 files changed, 49 insertions(+), 10 deletions(-) diff --git a/src/builder/command.rs b/src/builder/command.rs index 84f3cbbb36c..de59ad8cd95 100644 --- a/src/builder/command.rs +++ b/src/builder/command.rs @@ -4336,7 +4336,8 @@ impl<'help> App<'help> { use std::fmt::Write; let mut mid_string = String::from(" "); - if !self.is_subcommand_negates_reqs_set() { + if !self.is_subcommand_negates_reqs_set() && !self.is_args_conflicts_with_subcommands_set() + { let reqs = Usage::new(self).get_required_usage_from(&[], None, true); // maybe Some(m) for s in &reqs { @@ -4419,7 +4420,9 @@ impl<'help> App<'help> { if !self.is_set(AppSettings::BinNameBuilt) { let mut mid_string = String::from(" "); - if !self.is_subcommand_negates_reqs_set() { + if !self.is_subcommand_negates_reqs_set() + && !self.is_args_conflicts_with_subcommands_set() + { let reqs = Usage::new(self).get_required_usage_from(&[], None, true); // maybe Some(m) for s in &reqs { diff --git a/tests/builder/help.rs b/tests/builder/help.rs index 26ad3b546c2..7a3d6f3a94c 100644 --- a/tests/builder/help.rs +++ b/tests/builder/help.rs @@ -829,14 +829,6 @@ fn multi_level_sc_help() { utils::assert_output(cmd, "ctest help subcmd multi", MULTI_SC_HELP, false); } -#[test] -fn no_wrap_help() { - let cmd = Command::new("ctest") - .term_width(0) - .override_help(MULTI_SC_HELP); - utils::assert_output(cmd, "ctest --help", &format!("{}\n", MULTI_SC_HELP), false); -} - #[test] fn no_wrap_default_help() { let cmd = Command::new("ctest").version("1.0").term_width(0); @@ -2857,6 +2849,50 @@ OPTIONS: utils::assert_eq(EXPECTED, String::from_utf8(buf).unwrap()); } +#[test] +fn parent_cmd_req_ignored_when_negates_reqs() { + static MULTI_SC_HELP: &str = "ctest-subcmd + +USAGE: + ctest subcmd + +OPTIONS: + -h, --help Print help information +"; + + let cmd = Command::new("ctest") + .arg(arg!()) + .subcommand_negates_reqs(true) + .subcommand(Command::new("subcmd")); + utils::assert_output(cmd, "ctest subcmd --help", MULTI_SC_HELP, false); +} + +#[test] +fn parent_cmd_req_ignored_when_conflicts() { + static MULTI_SC_HELP: &str = "ctest-subcmd + +USAGE: + ctest subcmd + +OPTIONS: + -h, --help Print help information +"; + + let cmd = Command::new("ctest") + .arg(arg!()) + .args_conflicts_with_subcommands(true) + .subcommand(Command::new("subcmd")); + utils::assert_output(cmd, "ctest subcmd --help", MULTI_SC_HELP, false); +} + +#[test] +fn no_wrap_help() { + let cmd = Command::new("ctest") + .term_width(0) + .override_help(MULTI_SC_HELP); + utils::assert_output(cmd, "ctest --help", &format!("{}\n", MULTI_SC_HELP), false); +} + #[test] fn display_name_default() { let mut cmd = Command::new("app").bin_name("app.exe");