From a410e855bcd82b05f9efa73fa8b9774dc8842c6b Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Mon, 19 Mar 2018 09:35:57 +0300 Subject: [PATCH] Disable typo suggestions in presence of external subcommands --- src/app/parser.rs | 4 ++-- tests/app_settings.rs | 24 +++++++++++++++++++++--- 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/src/app/parser.rs b/src/app/parser.rs index b517b4f762b..60baad048ad 100644 --- a/src/app/parser.rs +++ b/src/app/parser.rs @@ -976,7 +976,7 @@ where } if !(self.is_set(AS::ArgsNegateSubcommands) && self.is_set(AS::ValidArgFound)) - && !self.is_set(AS::InferSubcommands) + && !self.is_set(AS::InferSubcommands) && !self.is_set(AS::AllowExternalSubcommands) { if let Some(cdate) = suggestions::did_you_mean(&*arg_os.to_string_lossy(), sc_names!(self)) @@ -994,7 +994,7 @@ where let low_index_mults = self.is_set(AS::LowIndexMultiplePositional) && pos_counter == (self.positionals.len() - 1); let missing_pos = self.is_set(AS::AllowMissingPositional) - && (pos_counter == (self.positionals.len() - 1) + && (pos_counter == (self.positionals.len() - 1) && !self.is_set(AS::TrailingValues)); debugln!( "Parser::get_matches_with: Positional counter...{}", diff --git a/tests/app_settings.rs b/tests/app_settings.rs index 80a4cfeb050..c9b0198f291 100644 --- a/tests/app_settings.rs +++ b/tests/app_settings.rs @@ -717,7 +717,7 @@ fn missing_positional_hyphen_req_error() { #[test] fn issue_1066_allow_leading_hyphen_and_unknown_args() { let res = App::new("prog") - .global_setting(AppSettings::AllowLeadingHyphen) + .global_setting(AppSettings::AllowLeadingHyphen) .arg(Arg::from_usage("--some-argument")) .get_matches_from_safe(vec!["prog", "hello"]); @@ -728,7 +728,7 @@ fn issue_1066_allow_leading_hyphen_and_unknown_args() { #[test] fn issue_1066_allow_leading_hyphen_and_unknown_args_no_vals() { let res = App::new("prog") - .global_setting(AppSettings::AllowLeadingHyphen) + .global_setting(AppSettings::AllowLeadingHyphen) .arg(Arg::from_usage("--some-argument")) .get_matches_from_safe(vec!["prog", "--hello"]); @@ -739,7 +739,7 @@ fn issue_1066_allow_leading_hyphen_and_unknown_args_no_vals() { #[test] fn issue_1066_allow_leading_hyphen_and_unknown_args_option() { let res = App::new("prog") - .global_setting(AppSettings::AllowLeadingHyphen) + .global_setting(AppSettings::AllowLeadingHyphen) .arg(Arg::from_usage("--some-argument=[val]")) .get_matches_from_safe(vec!["prog", "-hello"]); @@ -755,6 +755,24 @@ fn issue_1093_allow_ext_sc() { assert!(test::compare_output(app, "clap-test --help", ALLOW_EXT_SC, false)); } +#[test] +fn external_subcommand_looks_like_built_in() { + let res = App::new("cargo") + .version("1.26.0") + .setting(AppSettings::AllowExternalSubcommands) + .subcommand(SubCommand::with_name("install")) + .get_matches_from_safe(vec!["cargo", "install-update", "foo"]); + assert!(res.is_ok()); + let m = res.unwrap(); + match m.subcommand() { + (name, Some(args)) => { + assert_eq!(name, "install-update"); + assert_eq!(args.values_of_lossy(""), Some(vec!["foo".to_string()])); + } + _ => assert!(false), + } +} + #[test] fn aaos_flags() { // flags