diff --git a/examples/repl.rs b/examples/repl.rs index ac88a7c26d4..f1b65c3090f 100644 --- a/examples/repl.rs +++ b/examples/repl.rs @@ -66,7 +66,6 @@ fn cli() -> Command<'static> { Command::new("repl") .multicall(true) .arg_required_else_help(true) - .disable_help_flag(true) .subcommand_required(true) .subcommand_value_name("APPLET") .subcommand_help_heading("APPLETS") diff --git a/src/build/command.rs b/src/build/command.rs index bee5ecec078..308019efc4e 100644 --- a/src/build/command.rs +++ b/src/build/command.rs @@ -4025,6 +4025,14 @@ impl<'help> App<'help> { // Make sure all the globally set flags apply to us as well self.settings = self.settings | self.g_settings; + #[cfg(feature = "unstable-multicall")] + { + if self.is_set(AppSettings::Multicall) { + self.settings.insert(AppSettings::DisableHelpFlag.into()); + self.settings.insert(AppSettings::DisableVersionFlag.into()); + } + } + self._propagate(); self._check_help_and_version(); self._propagate_global_args(); diff --git a/tests/builder/subcommands.rs b/tests/builder/subcommands.rs index 90f815ea171..438c11b6a0d 100644 --- a/tests/builder/subcommands.rs +++ b/tests/builder/subcommands.rs @@ -517,7 +517,7 @@ fn busybox_like_multicall() { let m = cmd.clone().try_get_matches_from(&["a.out"]); assert!(m.is_err()); - assert_eq!(m.unwrap_err().kind(), ErrorKind::UnknownArgument); + assert_eq!(m.unwrap_err().kind(), ErrorKind::UnrecognizedSubcommand); } #[cfg(feature = "unstable-multicall")] @@ -539,7 +539,7 @@ fn hostname_like_multicall() { let m = cmd.clone().try_get_matches_from(&["a.out"]); assert!(m.is_err()); - assert_eq!(m.unwrap_err().kind(), ErrorKind::UnknownArgument); + assert_eq!(m.unwrap_err().kind(), ErrorKind::UnrecognizedSubcommand); let m = cmd.try_get_matches_from_mut(&["hostname", "hostname"]); assert!(m.is_err()); @@ -549,3 +549,56 @@ fn hostname_like_multicall() { assert!(m.is_err()); assert_eq!(m.unwrap_err().kind(), ErrorKind::UnknownArgument); } + +#[cfg(feature = "unstable-multicall")] +#[test] +fn bad_multicall_command_error() { + let cmd = Command::new("repl") + .version("1.0.0") + .propagate_version(true) + .multicall(true) + .subcommand(Command::new("foo")) + .subcommand(Command::new("bar")); + + let err = cmd.clone().try_get_matches_from(&["world"]).unwrap_err(); + assert_eq!(err.kind(), ErrorKind::UnrecognizedSubcommand); + static HELLO_EXPECTED: &str = "\ +error: The subcommand 'world' wasn't recognized + +USAGE: + + +For more information try help +"; + utils::assert_eq(HELLO_EXPECTED, err.to_string()); + + let err = cmd.clone().try_get_matches_from(&["baz"]).unwrap_err(); + assert_eq!(err.kind(), ErrorKind::InvalidSubcommand); + static BAZ_EXPECTED: &str = "\ +error: The subcommand 'baz' wasn't recognized + +\tDid you mean 'bar'? + +If you believe you received this message in error, try re-running with ' -- baz' + +USAGE: + [SUBCOMMAND] + +For more information try help +"; + utils::assert_eq(BAZ_EXPECTED, err.to_string()); + + // Verify whatever we did to get the above to work didn't disable `--help` and `--version`. + + let err = cmd + .clone() + .try_get_matches_from(&["foo", "--help"]) + .unwrap_err(); + assert_eq!(err.kind(), ErrorKind::DisplayHelp); + + let err = cmd + .clone() + .try_get_matches_from(&["foo", "--version"]) + .unwrap_err(); + assert_eq!(err.kind(), ErrorKind::DisplayVersion); +}