Auto merge of #610 - kbknapp:starkat99-fix-subcommand-name, r=kbknapp

Starkat99 fix subcommand name
This commit is contained in:
Homu 2016-07-29 11:08:28 +09:00
commit 3f79467e6b
4 changed files with 26 additions and 9 deletions

View file

@ -712,6 +712,20 @@ impl<'a, 'b> Parser<'a, 'b>
if let Some(p) = self.positionals.get(pos_counter) {
parse_positional!(self, p, arg_os, pos_counter, matcher);
} else if self.settings.is_set(AppSettings::AllowExternalSubcommands) {
// Get external subcommand name
let sc_name = match arg_os.to_str() {
Some(s) => s.to_string(),
None => {
if !self.settings.is_set(AppSettings::StrictUtf8) {
return Err(
Error::invalid_utf8(&*self.create_current_usage(matcher), self.color())
);
}
arg_os.to_string_lossy().into_owned()
}
};
// Collect the external subcommand args
let mut sc_m = ArgMatcher::new();
while let Some(v) = it.next() {
let a = v.into();
@ -722,11 +736,11 @@ impl<'a, 'b> Parser<'a, 'b>
);
}
}
sc_m.add_val_to("EXTERNAL_SUBCOMMAND", &a);
sc_m.add_val_to("", &a);
}
matcher.subcommand(SubCommand {
name: "EXTERNAL_SUBCOMMAND".into(),
name: sc_name,
matches: sc_m.into(),
});
} else {

View file

@ -347,11 +347,12 @@ pub enum AppSettings {
/// "myprog", "subcmd", "--option", "value", "-fff", "--flag"
/// ]);
///
/// // All trailing arguments will be stored under the subcommand's sub-matches using a value
/// // of the runtime subcommand name (in this case "subcmd")
/// // All trailing arguments will be stored under the subcommand's sub-matches using an empty
/// // string argument name
/// match m.subcommand() {
/// (external, Some(ext_m)) => {
/// let ext_args: Vec<&str> = ext_m.values_of(external).unwrap().collect();
/// let ext_args: Vec<&str> = ext_m.values_of("").unwrap().collect();
/// assert_eq!(external, "subcmd");
/// assert_eq!(ext_args, ["--option", "value", "-fff", "--flag"]);
/// },
/// _ => {},

View file

@ -493,11 +493,12 @@ impl<'a> ArgMatches<'a> {
/// "myprog", "subcmd", "--option", "value", "-fff", "--flag"
/// ]);
///
/// // All trailing arguments will be stored under the subcommand's sub-matches using a value
/// // of the runtime subcommand name (in this case "subcmd")
/// // All trailing arguments will be stored under the subcommand's sub-matches using an empty
/// // string argument name
/// match app_m.subcommand() {
/// (external, Some(sub_m)) => {
/// let ext_args: Vec<&str> = sub_m.values_of(external).unwrap().collect();
/// let ext_args: Vec<&str> = sub_m.values_of("").unwrap().collect();
/// assert_eq!(external, "subcmd");
/// assert_eq!(ext_args, ["--option", "value", "-fff", "--flag"]);
/// },
/// _ => {},

View file

@ -51,7 +51,8 @@ fn build_new_help(app: &App) -> String {
fn compare_app_str(l: &App, right: &str) -> bool {
let left = build_new_help(&l);
let b = left.trim() == right;
// Strip out any mismatching \r character on windows that might sneak in on either side
let b = left.trim().replace("\r", "") == right.replace("\r", "");
if !b {
println!("");
println!("--> left");