rust/rhg/src/main.rs
changeset 46503 d8730ff51d5a
parent 46502 95d37db31479
child 46504 2e5dd18d6dc3
--- 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<fn(
             &ui::Ui,
             &hg::config::Config,
+            Option<&Path>,
             &ArgMatches,
         ) -> Result<(), CommandError>> {
             match name {