From a1ca45903b4b352f8d1dc90aee1aec76cc77c74a Mon Sep 17 00:00:00 2001 From: Martin Fischer Date: Wed, 15 Feb 2023 06:25:18 +0100 Subject: [PATCH] fix(help): Fix confusing --help help text in edge case --- src/builder/command.rs | 13 +++++++------ tests/builder/hidden_args.rs | 26 +++++++++++++++++++++++++- 2 files changed, 32 insertions(+), 7 deletions(-) diff --git a/src/builder/command.rs b/src/builder/command.rs index 494e235673be..b587fb01b040 100644 --- a/src/builder/command.rs +++ b/src/builder/command.rs @@ -4593,12 +4593,13 @@ impl Command { // specified by the user is sent through. If hide_short_help is not included, // then items specified with hidden_short_help will also be hidden. let should_long = |v: &Arg| { - v.get_long_help().is_some() - || v.is_hide_long_help_set() - || v.is_hide_short_help_set() - || v.get_possible_values() - .iter() - .any(PossibleValue::should_show_help) + !v.is_hide_set() + && (v.get_long_help().is_some() + || v.is_hide_long_help_set() + || v.is_hide_short_help_set() + || v.get_possible_values() + .iter() + .any(PossibleValue::should_show_help)) }; // Subcommands aren't checked because we prefer short help for them, deferring to diff --git a/tests/builder/hidden_args.rs b/tests/builder/hidden_args.rs index 4cdfb2453498..537c8fc1b5aa 100644 --- a/tests/builder/hidden_args.rs +++ b/tests/builder/hidden_args.rs @@ -1,6 +1,6 @@ use super::utils; -use clap::{arg, Arg, ArgAction, Command}; +use clap::{arg, builder::PossibleValue, Arg, ArgAction, Command}; static HIDDEN_ARGS: &str = "\ tests stuff @@ -278,3 +278,27 @@ fn hide_subcmds_only() { utils::assert_output(cmd, "test --help", HIDDEN_SUBCMDS_ONLY, false); } + +#[test] +fn hidden_arg_with_possible_value_with_help() { + // Normally the presence of a possible value with a help text triggers a + // change of the --help help text by appending `(see more with '--help')` + // or `(see a summary with '-h')`. When the argument is completely hidden + // we however do not want it to trigger that change. + static POS_VALS_HELP: &str = "\ +Usage: ctest + +Options: + -h, --help Print help +"; + let app = Command::new("ctest").arg( + Arg::new("pos") + .hide(true) + .value_parser([ + PossibleValue::new("fast"), + PossibleValue::new("slow").help("not as fast"), + ]) + .action(ArgAction::Set), + ); + utils::assert_output(app, "ctest --help", POS_VALS_HELP, false); +}