##// END OF EJS Templates
rhg: Use clap’s support for global CLI arguments...
Simon Sapin -
r47351:4e4c7040 default
parent child Browse files
Show More
@@ -15,39 +15,38 b' mod exitcode;'
15 15 mod ui;
16 16 use error::CommandError;
17 17
18 fn add_global_args<'a, 'b>(app: App<'a, 'b>) -> App<'a, 'b> {
19 app.arg(
20 Arg::with_name("repository")
21 .help("repository root directory")
22 .short("-R")
23 .long("--repository")
24 .value_name("REPO")
25 .takes_value(true),
26 )
27 .arg(
28 Arg::with_name("config")
29 .help("set/override config option (use 'section.name=value')")
30 .long("--config")
31 .value_name("CONFIG")
32 .takes_value(true)
33 // Ok: `--config section.key1=val --config section.key2=val2`
34 .multiple(true)
35 // Not ok: `--config section.key1=val section.key2=val2`
36 .number_of_values(1),
37 )
38 }
39
40 18 fn main_with_result(
41 19 ui: &ui::Ui,
42 20 process_start_time: &blackbox::ProcessStartTime,
43 21 ) -> Result<(), CommandError> {
44 22 env_logger::init();
45 23 let app = App::new("rhg")
46 .setting(AppSettings::AllowInvalidUtf8)
24 .global_setting(AppSettings::AllowInvalidUtf8)
47 25 .setting(AppSettings::SubcommandRequired)
48 26 .setting(AppSettings::VersionlessSubcommands)
27 .arg(
28 Arg::with_name("repository")
29 .help("repository root directory")
30 .short("-R")
31 .long("--repository")
32 .value_name("REPO")
33 .takes_value(true)
34 // Both ok: `hg -R ./foo log` or `hg log -R ./foo`
35 .global(true),
36 )
37 .arg(
38 Arg::with_name("config")
39 .help("set/override config option (use 'section.name=value')")
40 .long("--config")
41 .value_name("CONFIG")
42 .takes_value(true)
43 .global(true)
44 // Ok: `--config section.key1=val --config section.key2=val2`
45 .multiple(true)
46 // Not ok: `--config section.key1=val section.key2=val2`
47 .number_of_values(1),
48 )
49 49 .version("0.0.1");
50 let app = add_global_args(app);
51 50 let app = add_subcommand_args(app);
52 51
53 52 let matches = app.clone().get_matches_safe()?;
@@ -58,26 +57,15 b' fn main_with_result('
58 57 let subcommand_args = subcommand_matches
59 58 .expect("no subcommand arguments from clap despite AppSettings::SubcommandRequired");
60 59
61 // Global arguments can be in either based on e.g. `hg -R ./foo log` v.s.
62 // `hg log -R ./foo`
63 let value_of_global_arg = |name| {
64 subcommand_args
65 .value_of_os(name)
66 .or_else(|| matches.value_of_os(name))
67 };
68 // For arguments where multiple occurences are allowed, return a
69 // possibly-iterator of all values.
70 let values_of_global_arg = |name: &str| {
71 let a = matches.values_of_os(name).into_iter().flatten();
72 let b = subcommand_args.values_of_os(name).into_iter().flatten();
73 a.chain(b)
74 };
75
76 let config_args = values_of_global_arg("config")
60 let config_args = matches
61 .values_of_os("config")
62 // Turn `Option::None` into an empty iterator:
63 .into_iter()
64 .flatten()
77 65 .map(hg::utils::files::get_bytes_from_os_str);
78 66 let non_repo_config = &hg::config::Config::load(config_args)?;
79 67
80 let repo_path = value_of_global_arg("repository").map(Path::new);
68 let repo_path = matches.value_of_os("repository").map(Path::new);
81 69 let repo = match Repo::find(non_repo_config, repo_path) {
82 70 Ok(repo) => Ok(repo),
83 71 Err(RepoError::NotFound { at }) if repo_path.is_none() => {
@@ -141,7 +129,7 b' macro_rules! subcommands {'
141 129 fn add_subcommand_args<'a, 'b>(app: App<'a, 'b>) -> App<'a, 'b> {
142 130 app
143 131 $(
144 .subcommand(add_global_args(commands::$command::args()))
132 .subcommand(commands::$command::args())
145 133 )+
146 134 }
147 135
General Comments 0
You need to be logged in to leave comments. Login now