diff -r 95d37db31479 -r d8730ff51d5a rust/rhg/src/main.rs --- a/rust/rhg/src/main.rs Mon Feb 08 21:28:52 2021 +0100 +++ b/rust/rhg/src/main.rs Mon Feb 08 21:37:30 2021 +0100 @@ -1,14 +1,27 @@ extern crate log; use clap::App; use clap::AppSettings; +use clap::Arg; use clap::ArgMatches; use format_bytes::format_bytes; +use std::path::Path; mod error; mod exitcode; mod ui; use error::CommandError; +fn add_global_args<'a, 'b>(app: App<'a, 'b>) -> App<'a, 'b> { + app.arg( + Arg::with_name("repository") + .help("repository root directory") + .short("-R") + .long("--repository") + .value_name("REPO") + .takes_value(true), + ) +} + fn main() { env_logger::init(); let app = App::new("rhg") @@ -16,6 +29,7 @@ .setting(AppSettings::SubcommandRequired) .setting(AppSettings::VersionlessSubcommands) .version("0.0.1"); + let app = add_global_args(app); let app = add_subcommand_args(app); let ui = ui::Ui::new(); @@ -24,15 +38,22 @@ let _ = ui.writeln_stderr_str(&err.message); std::process::exit(exitcode::UNIMPLEMENTED) }); + let (subcommand_name, subcommand_matches) = matches.subcommand(); let run = subcommand_run_fn(subcommand_name) .expect("unknown subcommand name from clap despite AppSettings::SubcommandRequired"); let args = subcommand_matches .expect("no subcommand arguments from clap despite AppSettings::SubcommandRequired"); + // Global arguments can be in either based on e.g. `hg -R ./foo log` v.s. + // `hg log -R ./foo` + let global_arg = + |name| args.value_of_os(name).or_else(|| matches.value_of_os(name)); + + let repo_path = global_arg("repository").map(Path::new); let result = (|| -> Result<(), CommandError> { let config = hg::config::Config::load()?; - run(&ui, &config, args) + run(&ui, &config, repo_path, args) })(); let exit_code = match result { @@ -66,13 +87,14 @@ fn add_subcommand_args<'a, 'b>(app: App<'a, 'b>) -> App<'a, 'b> { app $( - .subcommand(commands::$command::args()) + .subcommand(add_global_args(commands::$command::args())) )+ } fn subcommand_run_fn(name: &str) -> Option, &ArgMatches, ) -> Result<(), CommandError>> { match name {