Mercurial > public > mercurial-scm > hg
annotate rust/rhg/src/main.rs @ 46736:2255e7eb39e5
rhg: Add support for --cwd
This affect the meaning of relative paths in `--repository`,
which are resolved "early" by rhg in order to load config
which is needed before fallback to Python is considered.
An incorrect path could cause errors when loading a non-existent repo,
leading to failing tests even when fallback is enabled.
Differential Revision: https://phab.mercurial-scm.org/D10134
author | Simon Sapin <simon.sapin@octobus.net> |
---|---|
date | Fri, 05 Mar 2021 11:21:15 +0100 |
parents | 1a036d33bc18 |
children | b1f2c2b336ec |
rev | line source |
---|---|
45530
b1cea0dc9db0
rhg: Add debug timing
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45529
diff
changeset
|
1 extern crate log; |
46592
80840b651721
rhg: Group values passed to every sub-command into a struct
Simon Sapin <simon.sapin@octobus.net>
parents:
46591
diff
changeset
|
2 use crate::ui::Ui; |
45050
18f8d3b31baa
rhg: add a limited `rhg root` subcommand
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45049
diff
changeset
|
3 use clap::App; |
18f8d3b31baa
rhg: add a limited `rhg root` subcommand
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45049
diff
changeset
|
4 use clap::AppSettings; |
46503
d8730ff51d5a
rhg: Add support for -R and --repository command-line arguments
Simon Sapin <simon.sapin@octobus.net>
parents:
46502
diff
changeset
|
5 use clap::Arg; |
45529
f17caf8f3fef
rhg: add a limited `rhg debugdata` subcommand
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45440
diff
changeset
|
6 use clap::ArgMatches; |
46733
1bac7764ceef
rhg: Fall back to Python if unsupported extensions are enabled
Simon Sapin <simon.sapin@octobus.net>
parents:
46731
diff
changeset
|
7 use format_bytes::{format_bytes, join}; |
46592
80840b651721
rhg: Group values passed to every sub-command into a struct
Simon Sapin <simon.sapin@octobus.net>
parents:
46591
diff
changeset
|
8 use hg::config::Config; |
46593
5ce2aa7c2ad5
rhg: Move `Repo` object creation into `main()`
Simon Sapin <simon.sapin@octobus.net>
parents:
46592
diff
changeset
|
9 use hg::repo::{Repo, RepoError}; |
46665
7284b524b441
rhg: Make configuration available as early as possible in main()
Simon Sapin <simon.sapin@octobus.net>
parents:
46608
diff
changeset
|
10 use hg::utils::files::{get_bytes_from_os_str, get_path_from_bytes}; |
7284b524b441
rhg: Make configuration available as early as possible in main()
Simon Sapin <simon.sapin@octobus.net>
parents:
46608
diff
changeset
|
11 use hg::utils::SliceExt; |
7284b524b441
rhg: Make configuration available as early as possible in main()
Simon Sapin <simon.sapin@octobus.net>
parents:
46608
diff
changeset
|
12 use std::ffi::OsString; |
7284b524b441
rhg: Make configuration available as early as possible in main()
Simon Sapin <simon.sapin@octobus.net>
parents:
46608
diff
changeset
|
13 use std::path::PathBuf; |
46667
93e9f448273c
rhg: Add support for automatic fallback to Python
Simon Sapin <simon.sapin@octobus.net>
parents:
46666
diff
changeset
|
14 use std::process::Command; |
45050
18f8d3b31baa
rhg: add a limited `rhg root` subcommand
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45049
diff
changeset
|
15 |
46601
755c31a1caf9
rhg: Add support for the blackbox extension
Simon Sapin <simon.sapin@octobus.net>
parents:
46596
diff
changeset
|
16 mod blackbox; |
44982
bacf6c7ef01b
rhg: add Command trait for subcommands implemented by rhg
Antoine Cezar <antoine.cezar@octobus.net>
parents:
44981
diff
changeset
|
17 mod error; |
44981 | 18 mod exitcode; |
45049
513b3ef277a3
rhg: add RootCommand using hg-core FindRoot operation to prepare `hg root`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
44982
diff
changeset
|
19 mod ui; |
45529
f17caf8f3fef
rhg: add a limited `rhg debugdata` subcommand
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45440
diff
changeset
|
20 use error::CommandError; |
44981 | 21 |
46601
755c31a1caf9
rhg: Add support for the blackbox extension
Simon Sapin <simon.sapin@octobus.net>
parents:
46596
diff
changeset
|
22 fn main_with_result( |
46665
7284b524b441
rhg: Make configuration available as early as possible in main()
Simon Sapin <simon.sapin@octobus.net>
parents:
46608
diff
changeset
|
23 process_start_time: &blackbox::ProcessStartTime, |
46601
755c31a1caf9
rhg: Add support for the blackbox extension
Simon Sapin <simon.sapin@octobus.net>
parents:
46596
diff
changeset
|
24 ui: &ui::Ui, |
46665
7284b524b441
rhg: Make configuration available as early as possible in main()
Simon Sapin <simon.sapin@octobus.net>
parents:
46608
diff
changeset
|
25 repo: Result<&Repo, &NoRepoInCwdError>, |
7284b524b441
rhg: Make configuration available as early as possible in main()
Simon Sapin <simon.sapin@octobus.net>
parents:
46608
diff
changeset
|
26 config: &Config, |
46601
755c31a1caf9
rhg: Add support for the blackbox extension
Simon Sapin <simon.sapin@octobus.net>
parents:
46596
diff
changeset
|
27 ) -> Result<(), CommandError> { |
46733
1bac7764ceef
rhg: Fall back to Python if unsupported extensions are enabled
Simon Sapin <simon.sapin@octobus.net>
parents:
46731
diff
changeset
|
28 check_extensions(config)?; |
1bac7764ceef
rhg: Fall back to Python if unsupported extensions are enabled
Simon Sapin <simon.sapin@octobus.net>
parents:
46731
diff
changeset
|
29 |
45529
f17caf8f3fef
rhg: add a limited `rhg debugdata` subcommand
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45440
diff
changeset
|
30 let app = App::new("rhg") |
46608
4e4c70401028
rhg: Use clap?s support for global CLI arguments
Simon Sapin <simon.sapin@octobus.net>
parents:
46601
diff
changeset
|
31 .global_setting(AppSettings::AllowInvalidUtf8) |
45050
18f8d3b31baa
rhg: add a limited `rhg root` subcommand
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45049
diff
changeset
|
32 .setting(AppSettings::SubcommandRequired) |
18f8d3b31baa
rhg: add a limited `rhg root` subcommand
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45049
diff
changeset
|
33 .setting(AppSettings::VersionlessSubcommands) |
46608
4e4c70401028
rhg: Use clap?s support for global CLI arguments
Simon Sapin <simon.sapin@octobus.net>
parents:
46601
diff
changeset
|
34 .arg( |
4e4c70401028
rhg: Use clap?s support for global CLI arguments
Simon Sapin <simon.sapin@octobus.net>
parents:
46601
diff
changeset
|
35 Arg::with_name("repository") |
4e4c70401028
rhg: Use clap?s support for global CLI arguments
Simon Sapin <simon.sapin@octobus.net>
parents:
46601
diff
changeset
|
36 .help("repository root directory") |
4e4c70401028
rhg: Use clap?s support for global CLI arguments
Simon Sapin <simon.sapin@octobus.net>
parents:
46601
diff
changeset
|
37 .short("-R") |
4e4c70401028
rhg: Use clap?s support for global CLI arguments
Simon Sapin <simon.sapin@octobus.net>
parents:
46601
diff
changeset
|
38 .long("--repository") |
4e4c70401028
rhg: Use clap?s support for global CLI arguments
Simon Sapin <simon.sapin@octobus.net>
parents:
46601
diff
changeset
|
39 .value_name("REPO") |
4e4c70401028
rhg: Use clap?s support for global CLI arguments
Simon Sapin <simon.sapin@octobus.net>
parents:
46601
diff
changeset
|
40 .takes_value(true) |
4e4c70401028
rhg: Use clap?s support for global CLI arguments
Simon Sapin <simon.sapin@octobus.net>
parents:
46601
diff
changeset
|
41 // Both ok: `hg -R ./foo log` or `hg log -R ./foo` |
4e4c70401028
rhg: Use clap?s support for global CLI arguments
Simon Sapin <simon.sapin@octobus.net>
parents:
46601
diff
changeset
|
42 .global(true), |
4e4c70401028
rhg: Use clap?s support for global CLI arguments
Simon Sapin <simon.sapin@octobus.net>
parents:
46601
diff
changeset
|
43 ) |
4e4c70401028
rhg: Use clap?s support for global CLI arguments
Simon Sapin <simon.sapin@octobus.net>
parents:
46601
diff
changeset
|
44 .arg( |
4e4c70401028
rhg: Use clap?s support for global CLI arguments
Simon Sapin <simon.sapin@octobus.net>
parents:
46601
diff
changeset
|
45 Arg::with_name("config") |
4e4c70401028
rhg: Use clap?s support for global CLI arguments
Simon Sapin <simon.sapin@octobus.net>
parents:
46601
diff
changeset
|
46 .help("set/override config option (use 'section.name=value')") |
4e4c70401028
rhg: Use clap?s support for global CLI arguments
Simon Sapin <simon.sapin@octobus.net>
parents:
46601
diff
changeset
|
47 .long("--config") |
4e4c70401028
rhg: Use clap?s support for global CLI arguments
Simon Sapin <simon.sapin@octobus.net>
parents:
46601
diff
changeset
|
48 .value_name("CONFIG") |
4e4c70401028
rhg: Use clap?s support for global CLI arguments
Simon Sapin <simon.sapin@octobus.net>
parents:
46601
diff
changeset
|
49 .takes_value(true) |
4e4c70401028
rhg: Use clap?s support for global CLI arguments
Simon Sapin <simon.sapin@octobus.net>
parents:
46601
diff
changeset
|
50 .global(true) |
4e4c70401028
rhg: Use clap?s support for global CLI arguments
Simon Sapin <simon.sapin@octobus.net>
parents:
46601
diff
changeset
|
51 // Ok: `--config section.key1=val --config section.key2=val2` |
4e4c70401028
rhg: Use clap?s support for global CLI arguments
Simon Sapin <simon.sapin@octobus.net>
parents:
46601
diff
changeset
|
52 .multiple(true) |
4e4c70401028
rhg: Use clap?s support for global CLI arguments
Simon Sapin <simon.sapin@octobus.net>
parents:
46601
diff
changeset
|
53 // Not ok: `--config section.key1=val section.key2=val2` |
4e4c70401028
rhg: Use clap?s support for global CLI arguments
Simon Sapin <simon.sapin@octobus.net>
parents:
46601
diff
changeset
|
54 .number_of_values(1), |
4e4c70401028
rhg: Use clap?s support for global CLI arguments
Simon Sapin <simon.sapin@octobus.net>
parents:
46601
diff
changeset
|
55 ) |
46736
2255e7eb39e5
rhg: Add support for --cwd
Simon Sapin <simon.sapin@octobus.net>
parents:
46734
diff
changeset
|
56 .arg( |
2255e7eb39e5
rhg: Add support for --cwd
Simon Sapin <simon.sapin@octobus.net>
parents:
46734
diff
changeset
|
57 Arg::with_name("cwd") |
2255e7eb39e5
rhg: Add support for --cwd
Simon Sapin <simon.sapin@octobus.net>
parents:
46734
diff
changeset
|
58 .help("change working directory") |
2255e7eb39e5
rhg: Add support for --cwd
Simon Sapin <simon.sapin@octobus.net>
parents:
46734
diff
changeset
|
59 .long("--cwd") |
2255e7eb39e5
rhg: Add support for --cwd
Simon Sapin <simon.sapin@octobus.net>
parents:
46734
diff
changeset
|
60 .value_name("DIR") |
2255e7eb39e5
rhg: Add support for --cwd
Simon Sapin <simon.sapin@octobus.net>
parents:
46734
diff
changeset
|
61 .takes_value(true) |
2255e7eb39e5
rhg: Add support for --cwd
Simon Sapin <simon.sapin@octobus.net>
parents:
46734
diff
changeset
|
62 .global(true), |
2255e7eb39e5
rhg: Add support for --cwd
Simon Sapin <simon.sapin@octobus.net>
parents:
46734
diff
changeset
|
63 ) |
46502
95d37db31479
rhg: Replace subcommand boilerplate with a macro
Simon Sapin <simon.sapin@octobus.net>
parents:
46501
diff
changeset
|
64 .version("0.0.1"); |
95d37db31479
rhg: Replace subcommand boilerplate with a macro
Simon Sapin <simon.sapin@octobus.net>
parents:
46501
diff
changeset
|
65 let app = add_subcommand_args(app); |
45050
18f8d3b31baa
rhg: add a limited `rhg root` subcommand
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45049
diff
changeset
|
66 |
46591
21d3b40b4c0e
rhg: Remove error message on unsupported CLI arguments
Simon Sapin <simon.sapin@octobus.net>
parents:
46505
diff
changeset
|
67 let matches = app.clone().get_matches_safe()?; |
46503
d8730ff51d5a
rhg: Add support for -R and --repository command-line arguments
Simon Sapin <simon.sapin@octobus.net>
parents:
46502
diff
changeset
|
68 |
46502
95d37db31479
rhg: Replace subcommand boilerplate with a macro
Simon Sapin <simon.sapin@octobus.net>
parents:
46501
diff
changeset
|
69 let (subcommand_name, subcommand_matches) = matches.subcommand(); |
95d37db31479
rhg: Replace subcommand boilerplate with a macro
Simon Sapin <simon.sapin@octobus.net>
parents:
46501
diff
changeset
|
70 let run = subcommand_run_fn(subcommand_name) |
95d37db31479
rhg: Replace subcommand boilerplate with a macro
Simon Sapin <simon.sapin@octobus.net>
parents:
46501
diff
changeset
|
71 .expect("unknown subcommand name from clap despite AppSettings::SubcommandRequired"); |
46592
80840b651721
rhg: Group values passed to every sub-command into a struct
Simon Sapin <simon.sapin@octobus.net>
parents:
46591
diff
changeset
|
72 let subcommand_args = subcommand_matches |
46502
95d37db31479
rhg: Replace subcommand boilerplate with a macro
Simon Sapin <simon.sapin@octobus.net>
parents:
46501
diff
changeset
|
73 .expect("no subcommand arguments from clap despite AppSettings::SubcommandRequired"); |
45050
18f8d3b31baa
rhg: add a limited `rhg root` subcommand
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45049
diff
changeset
|
74 |
46601
755c31a1caf9
rhg: Add support for the blackbox extension
Simon Sapin <simon.sapin@octobus.net>
parents:
46596
diff
changeset
|
75 let invocation = CliInvocation { |
46592
80840b651721
rhg: Group values passed to every sub-command into a struct
Simon Sapin <simon.sapin@octobus.net>
parents:
46591
diff
changeset
|
76 ui, |
80840b651721
rhg: Group values passed to every sub-command into a struct
Simon Sapin <simon.sapin@octobus.net>
parents:
46591
diff
changeset
|
77 subcommand_args, |
46665
7284b524b441
rhg: Make configuration available as early as possible in main()
Simon Sapin <simon.sapin@octobus.net>
parents:
46608
diff
changeset
|
78 config, |
7284b524b441
rhg: Make configuration available as early as possible in main()
Simon Sapin <simon.sapin@octobus.net>
parents:
46608
diff
changeset
|
79 repo, |
46601
755c31a1caf9
rhg: Add support for the blackbox extension
Simon Sapin <simon.sapin@octobus.net>
parents:
46596
diff
changeset
|
80 }; |
755c31a1caf9
rhg: Add support for the blackbox extension
Simon Sapin <simon.sapin@octobus.net>
parents:
46596
diff
changeset
|
81 let blackbox = blackbox::Blackbox::new(&invocation, process_start_time)?; |
755c31a1caf9
rhg: Add support for the blackbox extension
Simon Sapin <simon.sapin@octobus.net>
parents:
46596
diff
changeset
|
82 blackbox.log_command_start(); |
755c31a1caf9
rhg: Add support for the blackbox extension
Simon Sapin <simon.sapin@octobus.net>
parents:
46596
diff
changeset
|
83 let result = run(&invocation); |
755c31a1caf9
rhg: Add support for the blackbox extension
Simon Sapin <simon.sapin@octobus.net>
parents:
46596
diff
changeset
|
84 blackbox.log_command_end(exit_code(&result)); |
755c31a1caf9
rhg: Add support for the blackbox extension
Simon Sapin <simon.sapin@octobus.net>
parents:
46596
diff
changeset
|
85 result |
46591
21d3b40b4c0e
rhg: Remove error message on unsupported CLI arguments
Simon Sapin <simon.sapin@octobus.net>
parents:
46505
diff
changeset
|
86 } |
46502
95d37db31479
rhg: Replace subcommand boilerplate with a macro
Simon Sapin <simon.sapin@octobus.net>
parents:
46501
diff
changeset
|
87 |
46591
21d3b40b4c0e
rhg: Remove error message on unsupported CLI arguments
Simon Sapin <simon.sapin@octobus.net>
parents:
46505
diff
changeset
|
88 fn main() { |
46601
755c31a1caf9
rhg: Add support for the blackbox extension
Simon Sapin <simon.sapin@octobus.net>
parents:
46596
diff
changeset
|
89 // Run this first, before we find out if the blackbox extension is even |
755c31a1caf9
rhg: Add support for the blackbox extension
Simon Sapin <simon.sapin@octobus.net>
parents:
46596
diff
changeset
|
90 // enabled, in order to include everything in-between in the duration |
755c31a1caf9
rhg: Add support for the blackbox extension
Simon Sapin <simon.sapin@octobus.net>
parents:
46596
diff
changeset
|
91 // measurements. Reading config files can be slow if they’re on NFS. |
755c31a1caf9
rhg: Add support for the blackbox extension
Simon Sapin <simon.sapin@octobus.net>
parents:
46596
diff
changeset
|
92 let process_start_time = blackbox::ProcessStartTime::now(); |
755c31a1caf9
rhg: Add support for the blackbox extension
Simon Sapin <simon.sapin@octobus.net>
parents:
46596
diff
changeset
|
93 |
46665
7284b524b441
rhg: Make configuration available as early as possible in main()
Simon Sapin <simon.sapin@octobus.net>
parents:
46608
diff
changeset
|
94 env_logger::init(); |
46593
5ce2aa7c2ad5
rhg: Move `Repo` object creation into `main()`
Simon Sapin <simon.sapin@octobus.net>
parents:
46592
diff
changeset
|
95 let ui = ui::Ui::new(); |
46591
21d3b40b4c0e
rhg: Remove error message on unsupported CLI arguments
Simon Sapin <simon.sapin@octobus.net>
parents:
46505
diff
changeset
|
96 |
46665
7284b524b441
rhg: Make configuration available as early as possible in main()
Simon Sapin <simon.sapin@octobus.net>
parents:
46608
diff
changeset
|
97 let early_args = EarlyArgs::parse(std::env::args_os()); |
46736
2255e7eb39e5
rhg: Add support for --cwd
Simon Sapin <simon.sapin@octobus.net>
parents:
46734
diff
changeset
|
98 |
2255e7eb39e5
rhg: Add support for --cwd
Simon Sapin <simon.sapin@octobus.net>
parents:
46734
diff
changeset
|
99 let initial_current_dir = early_args.cwd.map(|cwd| { |
2255e7eb39e5
rhg: Add support for --cwd
Simon Sapin <simon.sapin@octobus.net>
parents:
46734
diff
changeset
|
100 let cwd = get_path_from_bytes(&cwd); |
2255e7eb39e5
rhg: Add support for --cwd
Simon Sapin <simon.sapin@octobus.net>
parents:
46734
diff
changeset
|
101 std::env::current_dir() |
2255e7eb39e5
rhg: Add support for --cwd
Simon Sapin <simon.sapin@octobus.net>
parents:
46734
diff
changeset
|
102 .and_then(|initial| { |
2255e7eb39e5
rhg: Add support for --cwd
Simon Sapin <simon.sapin@octobus.net>
parents:
46734
diff
changeset
|
103 std::env::set_current_dir(cwd)?; |
2255e7eb39e5
rhg: Add support for --cwd
Simon Sapin <simon.sapin@octobus.net>
parents:
46734
diff
changeset
|
104 Ok(initial) |
2255e7eb39e5
rhg: Add support for --cwd
Simon Sapin <simon.sapin@octobus.net>
parents:
46734
diff
changeset
|
105 }) |
2255e7eb39e5
rhg: Add support for --cwd
Simon Sapin <simon.sapin@octobus.net>
parents:
46734
diff
changeset
|
106 .unwrap_or_else(|error| { |
2255e7eb39e5
rhg: Add support for --cwd
Simon Sapin <simon.sapin@octobus.net>
parents:
46734
diff
changeset
|
107 exit( |
2255e7eb39e5
rhg: Add support for --cwd
Simon Sapin <simon.sapin@octobus.net>
parents:
46734
diff
changeset
|
108 &None, |
2255e7eb39e5
rhg: Add support for --cwd
Simon Sapin <simon.sapin@octobus.net>
parents:
46734
diff
changeset
|
109 &ui, |
2255e7eb39e5
rhg: Add support for --cwd
Simon Sapin <simon.sapin@octobus.net>
parents:
46734
diff
changeset
|
110 OnUnsupported::Abort, |
2255e7eb39e5
rhg: Add support for --cwd
Simon Sapin <simon.sapin@octobus.net>
parents:
46734
diff
changeset
|
111 Err(CommandError::abort(format!( |
2255e7eb39e5
rhg: Add support for --cwd
Simon Sapin <simon.sapin@octobus.net>
parents:
46734
diff
changeset
|
112 "abort: {}: '{}'", |
2255e7eb39e5
rhg: Add support for --cwd
Simon Sapin <simon.sapin@octobus.net>
parents:
46734
diff
changeset
|
113 error, |
2255e7eb39e5
rhg: Add support for --cwd
Simon Sapin <simon.sapin@octobus.net>
parents:
46734
diff
changeset
|
114 cwd.display() |
2255e7eb39e5
rhg: Add support for --cwd
Simon Sapin <simon.sapin@octobus.net>
parents:
46734
diff
changeset
|
115 ))), |
2255e7eb39e5
rhg: Add support for --cwd
Simon Sapin <simon.sapin@octobus.net>
parents:
46734
diff
changeset
|
116 ) |
2255e7eb39e5
rhg: Add support for --cwd
Simon Sapin <simon.sapin@octobus.net>
parents:
46734
diff
changeset
|
117 }) |
2255e7eb39e5
rhg: Add support for --cwd
Simon Sapin <simon.sapin@octobus.net>
parents:
46734
diff
changeset
|
118 }); |
2255e7eb39e5
rhg: Add support for --cwd
Simon Sapin <simon.sapin@octobus.net>
parents:
46734
diff
changeset
|
119 |
46666
33f2d56acc73
rhg: Add a `rhg.on-unsupported` configuration key
Simon Sapin <simon.sapin@octobus.net>
parents:
46665
diff
changeset
|
120 let non_repo_config = |
33f2d56acc73
rhg: Add a `rhg.on-unsupported` configuration key
Simon Sapin <simon.sapin@octobus.net>
parents:
46665
diff
changeset
|
121 Config::load(early_args.config).unwrap_or_else(|error| { |
33f2d56acc73
rhg: Add a `rhg.on-unsupported` configuration key
Simon Sapin <simon.sapin@octobus.net>
parents:
46665
diff
changeset
|
122 // Normally this is decided based on config, but we don’t have that |
33f2d56acc73
rhg: Add a `rhg.on-unsupported` configuration key
Simon Sapin <simon.sapin@octobus.net>
parents:
46665
diff
changeset
|
123 // available. As of this writing config loading never returns an |
33f2d56acc73
rhg: Add a `rhg.on-unsupported` configuration key
Simon Sapin <simon.sapin@octobus.net>
parents:
46665
diff
changeset
|
124 // "unsupported" error but that is not enforced by the type system. |
33f2d56acc73
rhg: Add a `rhg.on-unsupported` configuration key
Simon Sapin <simon.sapin@octobus.net>
parents:
46665
diff
changeset
|
125 let on_unsupported = OnUnsupported::Abort; |
33f2d56acc73
rhg: Add a `rhg.on-unsupported` configuration key
Simon Sapin <simon.sapin@octobus.net>
parents:
46665
diff
changeset
|
126 |
46736
2255e7eb39e5
rhg: Add support for --cwd
Simon Sapin <simon.sapin@octobus.net>
parents:
46734
diff
changeset
|
127 exit(&initial_current_dir, &ui, on_unsupported, Err(error.into())) |
46666
33f2d56acc73
rhg: Add a `rhg.on-unsupported` configuration key
Simon Sapin <simon.sapin@octobus.net>
parents:
46665
diff
changeset
|
128 }); |
46665
7284b524b441
rhg: Make configuration available as early as possible in main()
Simon Sapin <simon.sapin@octobus.net>
parents:
46608
diff
changeset
|
129 |
46729
6cd9f53aaed8
rhg: Fall back to Python on --repository with an URL
Simon Sapin <simon.sapin@octobus.net>
parents:
46667
diff
changeset
|
130 if let Some(repo_path_bytes) = &early_args.repo { |
6cd9f53aaed8
rhg: Fall back to Python on --repository with an URL
Simon Sapin <simon.sapin@octobus.net>
parents:
46667
diff
changeset
|
131 lazy_static::lazy_static! { |
6cd9f53aaed8
rhg: Fall back to Python on --repository with an URL
Simon Sapin <simon.sapin@octobus.net>
parents:
46667
diff
changeset
|
132 static ref SCHEME_RE: regex::bytes::Regex = |
6cd9f53aaed8
rhg: Fall back to Python on --repository with an URL
Simon Sapin <simon.sapin@octobus.net>
parents:
46667
diff
changeset
|
133 // Same as `_matchscheme` in `mercurial/util.py` |
6cd9f53aaed8
rhg: Fall back to Python on --repository with an URL
Simon Sapin <simon.sapin@octobus.net>
parents:
46667
diff
changeset
|
134 regex::bytes::Regex::new("^[a-zA-Z0-9+.\\-]+:").unwrap(); |
6cd9f53aaed8
rhg: Fall back to Python on --repository with an URL
Simon Sapin <simon.sapin@octobus.net>
parents:
46667
diff
changeset
|
135 } |
6cd9f53aaed8
rhg: Fall back to Python on --repository with an URL
Simon Sapin <simon.sapin@octobus.net>
parents:
46667
diff
changeset
|
136 if SCHEME_RE.is_match(&repo_path_bytes) { |
6cd9f53aaed8
rhg: Fall back to Python on --repository with an URL
Simon Sapin <simon.sapin@octobus.net>
parents:
46667
diff
changeset
|
137 exit( |
46736
2255e7eb39e5
rhg: Add support for --cwd
Simon Sapin <simon.sapin@octobus.net>
parents:
46734
diff
changeset
|
138 &initial_current_dir, |
46729
6cd9f53aaed8
rhg: Fall back to Python on --repository with an URL
Simon Sapin <simon.sapin@octobus.net>
parents:
46667
diff
changeset
|
139 &ui, |
6cd9f53aaed8
rhg: Fall back to Python on --repository with an URL
Simon Sapin <simon.sapin@octobus.net>
parents:
46667
diff
changeset
|
140 OnUnsupported::from_config(&non_repo_config), |
6cd9f53aaed8
rhg: Fall back to Python on --repository with an URL
Simon Sapin <simon.sapin@octobus.net>
parents:
46667
diff
changeset
|
141 Err(CommandError::UnsupportedFeature { |
6cd9f53aaed8
rhg: Fall back to Python on --repository with an URL
Simon Sapin <simon.sapin@octobus.net>
parents:
46667
diff
changeset
|
142 message: format_bytes!( |
6cd9f53aaed8
rhg: Fall back to Python on --repository with an URL
Simon Sapin <simon.sapin@octobus.net>
parents:
46667
diff
changeset
|
143 b"URL-like --repository {}", |
6cd9f53aaed8
rhg: Fall back to Python on --repository with an URL
Simon Sapin <simon.sapin@octobus.net>
parents:
46667
diff
changeset
|
144 repo_path_bytes |
6cd9f53aaed8
rhg: Fall back to Python on --repository with an URL
Simon Sapin <simon.sapin@octobus.net>
parents:
46667
diff
changeset
|
145 ), |
6cd9f53aaed8
rhg: Fall back to Python on --repository with an URL
Simon Sapin <simon.sapin@octobus.net>
parents:
46667
diff
changeset
|
146 }), |
6cd9f53aaed8
rhg: Fall back to Python on --repository with an URL
Simon Sapin <simon.sapin@octobus.net>
parents:
46667
diff
changeset
|
147 ) |
6cd9f53aaed8
rhg: Fall back to Python on --repository with an URL
Simon Sapin <simon.sapin@octobus.net>
parents:
46667
diff
changeset
|
148 } |
6cd9f53aaed8
rhg: Fall back to Python on --repository with an URL
Simon Sapin <simon.sapin@octobus.net>
parents:
46667
diff
changeset
|
149 } |
46665
7284b524b441
rhg: Make configuration available as early as possible in main()
Simon Sapin <simon.sapin@octobus.net>
parents:
46608
diff
changeset
|
150 let repo_path = early_args.repo.as_deref().map(get_path_from_bytes); |
7284b524b441
rhg: Make configuration available as early as possible in main()
Simon Sapin <simon.sapin@octobus.net>
parents:
46608
diff
changeset
|
151 let repo_result = match Repo::find(&non_repo_config, repo_path) { |
7284b524b441
rhg: Make configuration available as early as possible in main()
Simon Sapin <simon.sapin@octobus.net>
parents:
46608
diff
changeset
|
152 Ok(repo) => Ok(repo), |
7284b524b441
rhg: Make configuration available as early as possible in main()
Simon Sapin <simon.sapin@octobus.net>
parents:
46608
diff
changeset
|
153 Err(RepoError::NotFound { at }) if repo_path.is_none() => { |
7284b524b441
rhg: Make configuration available as early as possible in main()
Simon Sapin <simon.sapin@octobus.net>
parents:
46608
diff
changeset
|
154 // Not finding a repo is not fatal yet, if `-R` was not given |
7284b524b441
rhg: Make configuration available as early as possible in main()
Simon Sapin <simon.sapin@octobus.net>
parents:
46608
diff
changeset
|
155 Err(NoRepoInCwdError { cwd: at }) |
46601
755c31a1caf9
rhg: Add support for the blackbox extension
Simon Sapin <simon.sapin@octobus.net>
parents:
46596
diff
changeset
|
156 } |
46666
33f2d56acc73
rhg: Add a `rhg.on-unsupported` configuration key
Simon Sapin <simon.sapin@octobus.net>
parents:
46665
diff
changeset
|
157 Err(error) => exit( |
46736
2255e7eb39e5
rhg: Add support for --cwd
Simon Sapin <simon.sapin@octobus.net>
parents:
46734
diff
changeset
|
158 &initial_current_dir, |
46666
33f2d56acc73
rhg: Add a `rhg.on-unsupported` configuration key
Simon Sapin <simon.sapin@octobus.net>
parents:
46665
diff
changeset
|
159 &ui, |
33f2d56acc73
rhg: Add a `rhg.on-unsupported` configuration key
Simon Sapin <simon.sapin@octobus.net>
parents:
46665
diff
changeset
|
160 OnUnsupported::from_config(&non_repo_config), |
33f2d56acc73
rhg: Add a `rhg.on-unsupported` configuration key
Simon Sapin <simon.sapin@octobus.net>
parents:
46665
diff
changeset
|
161 Err(error.into()), |
33f2d56acc73
rhg: Add a `rhg.on-unsupported` configuration key
Simon Sapin <simon.sapin@octobus.net>
parents:
46665
diff
changeset
|
162 ), |
46665
7284b524b441
rhg: Make configuration available as early as possible in main()
Simon Sapin <simon.sapin@octobus.net>
parents:
46608
diff
changeset
|
163 }; |
7284b524b441
rhg: Make configuration available as early as possible in main()
Simon Sapin <simon.sapin@octobus.net>
parents:
46608
diff
changeset
|
164 |
7284b524b441
rhg: Make configuration available as early as possible in main()
Simon Sapin <simon.sapin@octobus.net>
parents:
46608
diff
changeset
|
165 let config = if let Ok(repo) = &repo_result { |
7284b524b441
rhg: Make configuration available as early as possible in main()
Simon Sapin <simon.sapin@octobus.net>
parents:
46608
diff
changeset
|
166 repo.config() |
7284b524b441
rhg: Make configuration available as early as possible in main()
Simon Sapin <simon.sapin@octobus.net>
parents:
46608
diff
changeset
|
167 } else { |
7284b524b441
rhg: Make configuration available as early as possible in main()
Simon Sapin <simon.sapin@octobus.net>
parents:
46608
diff
changeset
|
168 &non_repo_config |
7284b524b441
rhg: Make configuration available as early as possible in main()
Simon Sapin <simon.sapin@octobus.net>
parents:
46608
diff
changeset
|
169 }; |
7284b524b441
rhg: Make configuration available as early as possible in main()
Simon Sapin <simon.sapin@octobus.net>
parents:
46608
diff
changeset
|
170 |
7284b524b441
rhg: Make configuration available as early as possible in main()
Simon Sapin <simon.sapin@octobus.net>
parents:
46608
diff
changeset
|
171 let result = main_with_result( |
7284b524b441
rhg: Make configuration available as early as possible in main()
Simon Sapin <simon.sapin@octobus.net>
parents:
46608
diff
changeset
|
172 &process_start_time, |
7284b524b441
rhg: Make configuration available as early as possible in main()
Simon Sapin <simon.sapin@octobus.net>
parents:
46608
diff
changeset
|
173 &ui, |
7284b524b441
rhg: Make configuration available as early as possible in main()
Simon Sapin <simon.sapin@octobus.net>
parents:
46608
diff
changeset
|
174 repo_result.as_ref(), |
7284b524b441
rhg: Make configuration available as early as possible in main()
Simon Sapin <simon.sapin@octobus.net>
parents:
46608
diff
changeset
|
175 config, |
7284b524b441
rhg: Make configuration available as early as possible in main()
Simon Sapin <simon.sapin@octobus.net>
parents:
46608
diff
changeset
|
176 ); |
46736
2255e7eb39e5
rhg: Add support for --cwd
Simon Sapin <simon.sapin@octobus.net>
parents:
46734
diff
changeset
|
177 exit( |
2255e7eb39e5
rhg: Add support for --cwd
Simon Sapin <simon.sapin@octobus.net>
parents:
46734
diff
changeset
|
178 &initial_current_dir, |
2255e7eb39e5
rhg: Add support for --cwd
Simon Sapin <simon.sapin@octobus.net>
parents:
46734
diff
changeset
|
179 &ui, |
2255e7eb39e5
rhg: Add support for --cwd
Simon Sapin <simon.sapin@octobus.net>
parents:
46734
diff
changeset
|
180 OnUnsupported::from_config(config), |
2255e7eb39e5
rhg: Add support for --cwd
Simon Sapin <simon.sapin@octobus.net>
parents:
46734
diff
changeset
|
181 result, |
2255e7eb39e5
rhg: Add support for --cwd
Simon Sapin <simon.sapin@octobus.net>
parents:
46734
diff
changeset
|
182 ) |
46601
755c31a1caf9
rhg: Add support for the blackbox extension
Simon Sapin <simon.sapin@octobus.net>
parents:
46596
diff
changeset
|
183 } |
755c31a1caf9
rhg: Add support for the blackbox extension
Simon Sapin <simon.sapin@octobus.net>
parents:
46596
diff
changeset
|
184 |
755c31a1caf9
rhg: Add support for the blackbox extension
Simon Sapin <simon.sapin@octobus.net>
parents:
46596
diff
changeset
|
185 fn exit_code(result: &Result<(), CommandError>) -> i32 { |
755c31a1caf9
rhg: Add support for the blackbox extension
Simon Sapin <simon.sapin@octobus.net>
parents:
46596
diff
changeset
|
186 match result { |
46591
21d3b40b4c0e
rhg: Remove error message on unsupported CLI arguments
Simon Sapin <simon.sapin@octobus.net>
parents:
46505
diff
changeset
|
187 Ok(()) => exitcode::OK, |
46601
755c31a1caf9
rhg: Add support for the blackbox extension
Simon Sapin <simon.sapin@octobus.net>
parents:
46596
diff
changeset
|
188 Err(CommandError::Abort { .. }) => exitcode::ABORT, |
46445
ca3f73cc3cf4
rhg: Simplify CommandError based on its use
Simon Sapin <simon.sapin@octobus.net>
parents:
45923
diff
changeset
|
189 |
ca3f73cc3cf4
rhg: Simplify CommandError based on its use
Simon Sapin <simon.sapin@octobus.net>
parents:
45923
diff
changeset
|
190 // Exit with a specific code and no error message to let a potential |
ca3f73cc3cf4
rhg: Simplify CommandError based on its use
Simon Sapin <simon.sapin@octobus.net>
parents:
45923
diff
changeset
|
191 // wrapper script fallback to Python-based Mercurial. |
46666
33f2d56acc73
rhg: Add a `rhg.on-unsupported` configuration key
Simon Sapin <simon.sapin@octobus.net>
parents:
46665
diff
changeset
|
192 Err(CommandError::UnsupportedFeature { .. }) => { |
33f2d56acc73
rhg: Add a `rhg.on-unsupported` configuration key
Simon Sapin <simon.sapin@octobus.net>
parents:
46665
diff
changeset
|
193 exitcode::UNIMPLEMENTED |
33f2d56acc73
rhg: Add a `rhg.on-unsupported` configuration key
Simon Sapin <simon.sapin@octobus.net>
parents:
46665
diff
changeset
|
194 } |
46601
755c31a1caf9
rhg: Add support for the blackbox extension
Simon Sapin <simon.sapin@octobus.net>
parents:
46596
diff
changeset
|
195 } |
44981 | 196 } |
45529
f17caf8f3fef
rhg: add a limited `rhg debugdata` subcommand
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45440
diff
changeset
|
197 |
46666
33f2d56acc73
rhg: Add a `rhg.on-unsupported` configuration key
Simon Sapin <simon.sapin@octobus.net>
parents:
46665
diff
changeset
|
198 fn exit( |
46736
2255e7eb39e5
rhg: Add support for --cwd
Simon Sapin <simon.sapin@octobus.net>
parents:
46734
diff
changeset
|
199 initial_current_dir: &Option<PathBuf>, |
46666
33f2d56acc73
rhg: Add a `rhg.on-unsupported` configuration key
Simon Sapin <simon.sapin@octobus.net>
parents:
46665
diff
changeset
|
200 ui: &Ui, |
46667
93e9f448273c
rhg: Add support for automatic fallback to Python
Simon Sapin <simon.sapin@octobus.net>
parents:
46666
diff
changeset
|
201 mut on_unsupported: OnUnsupported, |
46666
33f2d56acc73
rhg: Add a `rhg.on-unsupported` configuration key
Simon Sapin <simon.sapin@octobus.net>
parents:
46665
diff
changeset
|
202 result: Result<(), CommandError>, |
33f2d56acc73
rhg: Add a `rhg.on-unsupported` configuration key
Simon Sapin <simon.sapin@octobus.net>
parents:
46665
diff
changeset
|
203 ) -> ! { |
46667
93e9f448273c
rhg: Add support for automatic fallback to Python
Simon Sapin <simon.sapin@octobus.net>
parents:
46666
diff
changeset
|
204 if let ( |
93e9f448273c
rhg: Add support for automatic fallback to Python
Simon Sapin <simon.sapin@octobus.net>
parents:
46666
diff
changeset
|
205 OnUnsupported::Fallback { executable }, |
93e9f448273c
rhg: Add support for automatic fallback to Python
Simon Sapin <simon.sapin@octobus.net>
parents:
46666
diff
changeset
|
206 Err(CommandError::UnsupportedFeature { .. }), |
93e9f448273c
rhg: Add support for automatic fallback to Python
Simon Sapin <simon.sapin@octobus.net>
parents:
46666
diff
changeset
|
207 ) = (&on_unsupported, &result) |
93e9f448273c
rhg: Add support for automatic fallback to Python
Simon Sapin <simon.sapin@octobus.net>
parents:
46666
diff
changeset
|
208 { |
93e9f448273c
rhg: Add support for automatic fallback to Python
Simon Sapin <simon.sapin@octobus.net>
parents:
46666
diff
changeset
|
209 let mut args = std::env::args_os(); |
93e9f448273c
rhg: Add support for automatic fallback to Python
Simon Sapin <simon.sapin@octobus.net>
parents:
46666
diff
changeset
|
210 let executable_path = get_path_from_bytes(&executable); |
93e9f448273c
rhg: Add support for automatic fallback to Python
Simon Sapin <simon.sapin@octobus.net>
parents:
46666
diff
changeset
|
211 let this_executable = args.next().expect("exepcted argv[0] to exist"); |
93e9f448273c
rhg: Add support for automatic fallback to Python
Simon Sapin <simon.sapin@octobus.net>
parents:
46666
diff
changeset
|
212 if executable_path == &PathBuf::from(this_executable) { |
93e9f448273c
rhg: Add support for automatic fallback to Python
Simon Sapin <simon.sapin@octobus.net>
parents:
46666
diff
changeset
|
213 // Avoid spawning infinitely many processes until resource |
93e9f448273c
rhg: Add support for automatic fallback to Python
Simon Sapin <simon.sapin@octobus.net>
parents:
46666
diff
changeset
|
214 // exhaustion. |
93e9f448273c
rhg: Add support for automatic fallback to Python
Simon Sapin <simon.sapin@octobus.net>
parents:
46666
diff
changeset
|
215 let _ = ui.write_stderr(&format_bytes!( |
93e9f448273c
rhg: Add support for automatic fallback to Python
Simon Sapin <simon.sapin@octobus.net>
parents:
46666
diff
changeset
|
216 b"Blocking recursive fallback. The 'rhg.fallback-executable = {}' config \ |
93e9f448273c
rhg: Add support for automatic fallback to Python
Simon Sapin <simon.sapin@octobus.net>
parents:
46666
diff
changeset
|
217 points to `rhg` itself.\n", |
93e9f448273c
rhg: Add support for automatic fallback to Python
Simon Sapin <simon.sapin@octobus.net>
parents:
46666
diff
changeset
|
218 executable |
93e9f448273c
rhg: Add support for automatic fallback to Python
Simon Sapin <simon.sapin@octobus.net>
parents:
46666
diff
changeset
|
219 )); |
93e9f448273c
rhg: Add support for automatic fallback to Python
Simon Sapin <simon.sapin@octobus.net>
parents:
46666
diff
changeset
|
220 on_unsupported = OnUnsupported::Abort |
93e9f448273c
rhg: Add support for automatic fallback to Python
Simon Sapin <simon.sapin@octobus.net>
parents:
46666
diff
changeset
|
221 } else { |
93e9f448273c
rhg: Add support for automatic fallback to Python
Simon Sapin <simon.sapin@octobus.net>
parents:
46666
diff
changeset
|
222 // `args` is now `argv[1..]` since we’ve already consumed `argv[0]` |
46736
2255e7eb39e5
rhg: Add support for --cwd
Simon Sapin <simon.sapin@octobus.net>
parents:
46734
diff
changeset
|
223 let mut command = Command::new(executable_path); |
2255e7eb39e5
rhg: Add support for --cwd
Simon Sapin <simon.sapin@octobus.net>
parents:
46734
diff
changeset
|
224 command.args(args); |
2255e7eb39e5
rhg: Add support for --cwd
Simon Sapin <simon.sapin@octobus.net>
parents:
46734
diff
changeset
|
225 if let Some(initial) = initial_current_dir { |
2255e7eb39e5
rhg: Add support for --cwd
Simon Sapin <simon.sapin@octobus.net>
parents:
46734
diff
changeset
|
226 command.current_dir(initial); |
2255e7eb39e5
rhg: Add support for --cwd
Simon Sapin <simon.sapin@octobus.net>
parents:
46734
diff
changeset
|
227 } |
2255e7eb39e5
rhg: Add support for --cwd
Simon Sapin <simon.sapin@octobus.net>
parents:
46734
diff
changeset
|
228 let result = command.status(); |
46667
93e9f448273c
rhg: Add support for automatic fallback to Python
Simon Sapin <simon.sapin@octobus.net>
parents:
46666
diff
changeset
|
229 match result { |
93e9f448273c
rhg: Add support for automatic fallback to Python
Simon Sapin <simon.sapin@octobus.net>
parents:
46666
diff
changeset
|
230 Ok(status) => std::process::exit( |
93e9f448273c
rhg: Add support for automatic fallback to Python
Simon Sapin <simon.sapin@octobus.net>
parents:
46666
diff
changeset
|
231 status.code().unwrap_or(exitcode::ABORT), |
93e9f448273c
rhg: Add support for automatic fallback to Python
Simon Sapin <simon.sapin@octobus.net>
parents:
46666
diff
changeset
|
232 ), |
93e9f448273c
rhg: Add support for automatic fallback to Python
Simon Sapin <simon.sapin@octobus.net>
parents:
46666
diff
changeset
|
233 Err(error) => { |
93e9f448273c
rhg: Add support for automatic fallback to Python
Simon Sapin <simon.sapin@octobus.net>
parents:
46666
diff
changeset
|
234 let _ = ui.write_stderr(&format_bytes!( |
93e9f448273c
rhg: Add support for automatic fallback to Python
Simon Sapin <simon.sapin@octobus.net>
parents:
46666
diff
changeset
|
235 b"tried to fall back to a '{}' sub-process but got error {}\n", |
93e9f448273c
rhg: Add support for automatic fallback to Python
Simon Sapin <simon.sapin@octobus.net>
parents:
46666
diff
changeset
|
236 executable, format_bytes::Utf8(error) |
93e9f448273c
rhg: Add support for automatic fallback to Python
Simon Sapin <simon.sapin@octobus.net>
parents:
46666
diff
changeset
|
237 )); |
93e9f448273c
rhg: Add support for automatic fallback to Python
Simon Sapin <simon.sapin@octobus.net>
parents:
46666
diff
changeset
|
238 on_unsupported = OnUnsupported::Abort |
93e9f448273c
rhg: Add support for automatic fallback to Python
Simon Sapin <simon.sapin@octobus.net>
parents:
46666
diff
changeset
|
239 } |
93e9f448273c
rhg: Add support for automatic fallback to Python
Simon Sapin <simon.sapin@octobus.net>
parents:
46666
diff
changeset
|
240 } |
93e9f448273c
rhg: Add support for automatic fallback to Python
Simon Sapin <simon.sapin@octobus.net>
parents:
46666
diff
changeset
|
241 } |
93e9f448273c
rhg: Add support for automatic fallback to Python
Simon Sapin <simon.sapin@octobus.net>
parents:
46666
diff
changeset
|
242 } |
46666
33f2d56acc73
rhg: Add a `rhg.on-unsupported` configuration key
Simon Sapin <simon.sapin@octobus.net>
parents:
46665
diff
changeset
|
243 match &result { |
33f2d56acc73
rhg: Add a `rhg.on-unsupported` configuration key
Simon Sapin <simon.sapin@octobus.net>
parents:
46665
diff
changeset
|
244 Ok(_) => {} |
33f2d56acc73
rhg: Add a `rhg.on-unsupported` configuration key
Simon Sapin <simon.sapin@octobus.net>
parents:
46665
diff
changeset
|
245 Err(CommandError::Abort { message }) => { |
33f2d56acc73
rhg: Add a `rhg.on-unsupported` configuration key
Simon Sapin <simon.sapin@octobus.net>
parents:
46665
diff
changeset
|
246 if !message.is_empty() { |
33f2d56acc73
rhg: Add a `rhg.on-unsupported` configuration key
Simon Sapin <simon.sapin@octobus.net>
parents:
46665
diff
changeset
|
247 // Ignore errors when writing to stderr, we’re already exiting |
33f2d56acc73
rhg: Add a `rhg.on-unsupported` configuration key
Simon Sapin <simon.sapin@octobus.net>
parents:
46665
diff
changeset
|
248 // with failure code so there’s not much more we can do. |
46731
3d692e724d06
rhg: Align config file parse error formatting with Python
Simon Sapin <simon.sapin@octobus.net>
parents:
46729
diff
changeset
|
249 let _ = ui.write_stderr(&format_bytes!(b"{}\n", message)); |
46666
33f2d56acc73
rhg: Add a `rhg.on-unsupported` configuration key
Simon Sapin <simon.sapin@octobus.net>
parents:
46665
diff
changeset
|
250 } |
33f2d56acc73
rhg: Add a `rhg.on-unsupported` configuration key
Simon Sapin <simon.sapin@octobus.net>
parents:
46665
diff
changeset
|
251 } |
33f2d56acc73
rhg: Add a `rhg.on-unsupported` configuration key
Simon Sapin <simon.sapin@octobus.net>
parents:
46665
diff
changeset
|
252 Err(CommandError::UnsupportedFeature { message }) => { |
33f2d56acc73
rhg: Add a `rhg.on-unsupported` configuration key
Simon Sapin <simon.sapin@octobus.net>
parents:
46665
diff
changeset
|
253 match on_unsupported { |
33f2d56acc73
rhg: Add a `rhg.on-unsupported` configuration key
Simon Sapin <simon.sapin@octobus.net>
parents:
46665
diff
changeset
|
254 OnUnsupported::Abort => { |
33f2d56acc73
rhg: Add a `rhg.on-unsupported` configuration key
Simon Sapin <simon.sapin@octobus.net>
parents:
46665
diff
changeset
|
255 let _ = ui.write_stderr(&format_bytes!( |
33f2d56acc73
rhg: Add a `rhg.on-unsupported` configuration key
Simon Sapin <simon.sapin@octobus.net>
parents:
46665
diff
changeset
|
256 b"unsupported feature: {}\n", |
33f2d56acc73
rhg: Add a `rhg.on-unsupported` configuration key
Simon Sapin <simon.sapin@octobus.net>
parents:
46665
diff
changeset
|
257 message |
33f2d56acc73
rhg: Add a `rhg.on-unsupported` configuration key
Simon Sapin <simon.sapin@octobus.net>
parents:
46665
diff
changeset
|
258 )); |
33f2d56acc73
rhg: Add a `rhg.on-unsupported` configuration key
Simon Sapin <simon.sapin@octobus.net>
parents:
46665
diff
changeset
|
259 } |
33f2d56acc73
rhg: Add a `rhg.on-unsupported` configuration key
Simon Sapin <simon.sapin@octobus.net>
parents:
46665
diff
changeset
|
260 OnUnsupported::AbortSilent => {} |
46667
93e9f448273c
rhg: Add support for automatic fallback to Python
Simon Sapin <simon.sapin@octobus.net>
parents:
46666
diff
changeset
|
261 OnUnsupported::Fallback { .. } => unreachable!(), |
46666
33f2d56acc73
rhg: Add a `rhg.on-unsupported` configuration key
Simon Sapin <simon.sapin@octobus.net>
parents:
46665
diff
changeset
|
262 } |
46665
7284b524b441
rhg: Make configuration available as early as possible in main()
Simon Sapin <simon.sapin@octobus.net>
parents:
46608
diff
changeset
|
263 } |
7284b524b441
rhg: Make configuration available as early as possible in main()
Simon Sapin <simon.sapin@octobus.net>
parents:
46608
diff
changeset
|
264 } |
7284b524b441
rhg: Make configuration available as early as possible in main()
Simon Sapin <simon.sapin@octobus.net>
parents:
46608
diff
changeset
|
265 std::process::exit(exit_code(&result)) |
7284b524b441
rhg: Make configuration available as early as possible in main()
Simon Sapin <simon.sapin@octobus.net>
parents:
46608
diff
changeset
|
266 } |
7284b524b441
rhg: Make configuration available as early as possible in main()
Simon Sapin <simon.sapin@octobus.net>
parents:
46608
diff
changeset
|
267 |
46502
95d37db31479
rhg: Replace subcommand boilerplate with a macro
Simon Sapin <simon.sapin@octobus.net>
parents:
46501
diff
changeset
|
268 macro_rules! subcommands { |
95d37db31479
rhg: Replace subcommand boilerplate with a macro
Simon Sapin <simon.sapin@octobus.net>
parents:
46501
diff
changeset
|
269 ($( $command: ident )+) => { |
95d37db31479
rhg: Replace subcommand boilerplate with a macro
Simon Sapin <simon.sapin@octobus.net>
parents:
46501
diff
changeset
|
270 mod commands { |
95d37db31479
rhg: Replace subcommand boilerplate with a macro
Simon Sapin <simon.sapin@octobus.net>
parents:
46501
diff
changeset
|
271 $( |
95d37db31479
rhg: Replace subcommand boilerplate with a macro
Simon Sapin <simon.sapin@octobus.net>
parents:
46501
diff
changeset
|
272 pub mod $command; |
95d37db31479
rhg: Replace subcommand boilerplate with a macro
Simon Sapin <simon.sapin@octobus.net>
parents:
46501
diff
changeset
|
273 )+ |
95d37db31479
rhg: Replace subcommand boilerplate with a macro
Simon Sapin <simon.sapin@octobus.net>
parents:
46501
diff
changeset
|
274 } |
95d37db31479
rhg: Replace subcommand boilerplate with a macro
Simon Sapin <simon.sapin@octobus.net>
parents:
46501
diff
changeset
|
275 |
95d37db31479
rhg: Replace subcommand boilerplate with a macro
Simon Sapin <simon.sapin@octobus.net>
parents:
46501
diff
changeset
|
276 fn add_subcommand_args<'a, 'b>(app: App<'a, 'b>) -> App<'a, 'b> { |
95d37db31479
rhg: Replace subcommand boilerplate with a macro
Simon Sapin <simon.sapin@octobus.net>
parents:
46501
diff
changeset
|
277 app |
95d37db31479
rhg: Replace subcommand boilerplate with a macro
Simon Sapin <simon.sapin@octobus.net>
parents:
46501
diff
changeset
|
278 $( |
46608
4e4c70401028
rhg: Use clap?s support for global CLI arguments
Simon Sapin <simon.sapin@octobus.net>
parents:
46601
diff
changeset
|
279 .subcommand(commands::$command::args()) |
46502
95d37db31479
rhg: Replace subcommand boilerplate with a macro
Simon Sapin <simon.sapin@octobus.net>
parents:
46501
diff
changeset
|
280 )+ |
95d37db31479
rhg: Replace subcommand boilerplate with a macro
Simon Sapin <simon.sapin@octobus.net>
parents:
46501
diff
changeset
|
281 } |
46484
a6e4e4650bac
rhg: Parse system and user configuration at program start
Simon Sapin <simon.sapin@octobus.net>
parents:
46445
diff
changeset
|
282 |
46592
80840b651721
rhg: Group values passed to every sub-command into a struct
Simon Sapin <simon.sapin@octobus.net>
parents:
46591
diff
changeset
|
283 pub type RunFn = fn(&CliInvocation) -> Result<(), CommandError>; |
80840b651721
rhg: Group values passed to every sub-command into a struct
Simon Sapin <simon.sapin@octobus.net>
parents:
46591
diff
changeset
|
284 |
80840b651721
rhg: Group values passed to every sub-command into a struct
Simon Sapin <simon.sapin@octobus.net>
parents:
46591
diff
changeset
|
285 fn subcommand_run_fn(name: &str) -> Option<RunFn> { |
46502
95d37db31479
rhg: Replace subcommand boilerplate with a macro
Simon Sapin <simon.sapin@octobus.net>
parents:
46501
diff
changeset
|
286 match name { |
95d37db31479
rhg: Replace subcommand boilerplate with a macro
Simon Sapin <simon.sapin@octobus.net>
parents:
46501
diff
changeset
|
287 $( |
95d37db31479
rhg: Replace subcommand boilerplate with a macro
Simon Sapin <simon.sapin@octobus.net>
parents:
46501
diff
changeset
|
288 stringify!($command) => Some(commands::$command::run), |
95d37db31479
rhg: Replace subcommand boilerplate with a macro
Simon Sapin <simon.sapin@octobus.net>
parents:
46501
diff
changeset
|
289 )+ |
95d37db31479
rhg: Replace subcommand boilerplate with a macro
Simon Sapin <simon.sapin@octobus.net>
parents:
46501
diff
changeset
|
290 _ => None, |
95d37db31479
rhg: Replace subcommand boilerplate with a macro
Simon Sapin <simon.sapin@octobus.net>
parents:
46501
diff
changeset
|
291 } |
45542
33ded2d3f4fc
rhg: add a limited `rhg cat -r` subcommand
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45537
diff
changeset
|
292 } |
46502
95d37db31479
rhg: Replace subcommand boilerplate with a macro
Simon Sapin <simon.sapin@octobus.net>
parents:
46501
diff
changeset
|
293 }; |
45529
f17caf8f3fef
rhg: add a limited `rhg debugdata` subcommand
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45440
diff
changeset
|
294 } |
46502
95d37db31479
rhg: Replace subcommand boilerplate with a macro
Simon Sapin <simon.sapin@octobus.net>
parents:
46501
diff
changeset
|
295 |
95d37db31479
rhg: Replace subcommand boilerplate with a macro
Simon Sapin <simon.sapin@octobus.net>
parents:
46501
diff
changeset
|
296 subcommands! { |
95d37db31479
rhg: Replace subcommand boilerplate with a macro
Simon Sapin <simon.sapin@octobus.net>
parents:
46501
diff
changeset
|
297 cat |
95d37db31479
rhg: Replace subcommand boilerplate with a macro
Simon Sapin <simon.sapin@octobus.net>
parents:
46501
diff
changeset
|
298 debugdata |
95d37db31479
rhg: Replace subcommand boilerplate with a macro
Simon Sapin <simon.sapin@octobus.net>
parents:
46501
diff
changeset
|
299 debugrequirements |
95d37db31479
rhg: Replace subcommand boilerplate with a macro
Simon Sapin <simon.sapin@octobus.net>
parents:
46501
diff
changeset
|
300 files |
95d37db31479
rhg: Replace subcommand boilerplate with a macro
Simon Sapin <simon.sapin@octobus.net>
parents:
46501
diff
changeset
|
301 root |
46505
a25033eb43b5
rhg: add limited support for the `config` sub-command
Simon Sapin <simon.sapin@octobus.net>
parents:
46504
diff
changeset
|
302 config |
46502
95d37db31479
rhg: Replace subcommand boilerplate with a macro
Simon Sapin <simon.sapin@octobus.net>
parents:
46501
diff
changeset
|
303 } |
46592
80840b651721
rhg: Group values passed to every sub-command into a struct
Simon Sapin <simon.sapin@octobus.net>
parents:
46591
diff
changeset
|
304 pub struct CliInvocation<'a> { |
80840b651721
rhg: Group values passed to every sub-command into a struct
Simon Sapin <simon.sapin@octobus.net>
parents:
46591
diff
changeset
|
305 ui: &'a Ui, |
80840b651721
rhg: Group values passed to every sub-command into a struct
Simon Sapin <simon.sapin@octobus.net>
parents:
46591
diff
changeset
|
306 subcommand_args: &'a ArgMatches<'a>, |
46665
7284b524b441
rhg: Make configuration available as early as possible in main()
Simon Sapin <simon.sapin@octobus.net>
parents:
46608
diff
changeset
|
307 config: &'a Config, |
46593
5ce2aa7c2ad5
rhg: Move `Repo` object creation into `main()`
Simon Sapin <simon.sapin@octobus.net>
parents:
46592
diff
changeset
|
308 /// References inside `Result` is a bit peculiar but allow |
5ce2aa7c2ad5
rhg: Move `Repo` object creation into `main()`
Simon Sapin <simon.sapin@octobus.net>
parents:
46592
diff
changeset
|
309 /// `invocation.repo?` to work out with `&CliInvocation` since this |
5ce2aa7c2ad5
rhg: Move `Repo` object creation into `main()`
Simon Sapin <simon.sapin@octobus.net>
parents:
46592
diff
changeset
|
310 /// `Result` type is `Copy`. |
5ce2aa7c2ad5
rhg: Move `Repo` object creation into `main()`
Simon Sapin <simon.sapin@octobus.net>
parents:
46592
diff
changeset
|
311 repo: Result<&'a Repo, &'a NoRepoInCwdError>, |
5ce2aa7c2ad5
rhg: Move `Repo` object creation into `main()`
Simon Sapin <simon.sapin@octobus.net>
parents:
46592
diff
changeset
|
312 } |
5ce2aa7c2ad5
rhg: Move `Repo` object creation into `main()`
Simon Sapin <simon.sapin@octobus.net>
parents:
46592
diff
changeset
|
313 |
5ce2aa7c2ad5
rhg: Move `Repo` object creation into `main()`
Simon Sapin <simon.sapin@octobus.net>
parents:
46592
diff
changeset
|
314 struct NoRepoInCwdError { |
5ce2aa7c2ad5
rhg: Move `Repo` object creation into `main()`
Simon Sapin <simon.sapin@octobus.net>
parents:
46592
diff
changeset
|
315 cwd: PathBuf, |
46592
80840b651721
rhg: Group values passed to every sub-command into a struct
Simon Sapin <simon.sapin@octobus.net>
parents:
46591
diff
changeset
|
316 } |
46593
5ce2aa7c2ad5
rhg: Move `Repo` object creation into `main()`
Simon Sapin <simon.sapin@octobus.net>
parents:
46592
diff
changeset
|
317 |
46665
7284b524b441
rhg: Make configuration available as early as possible in main()
Simon Sapin <simon.sapin@octobus.net>
parents:
46608
diff
changeset
|
318 /// CLI arguments to be parsed "early" in order to be able to read |
7284b524b441
rhg: Make configuration available as early as possible in main()
Simon Sapin <simon.sapin@octobus.net>
parents:
46608
diff
changeset
|
319 /// configuration before using Clap. Ideally we would also use Clap for this, |
7284b524b441
rhg: Make configuration available as early as possible in main()
Simon Sapin <simon.sapin@octobus.net>
parents:
46608
diff
changeset
|
320 /// see <https://github.com/clap-rs/clap/discussions/2366>. |
7284b524b441
rhg: Make configuration available as early as possible in main()
Simon Sapin <simon.sapin@octobus.net>
parents:
46608
diff
changeset
|
321 /// |
7284b524b441
rhg: Make configuration available as early as possible in main()
Simon Sapin <simon.sapin@octobus.net>
parents:
46608
diff
changeset
|
322 /// These arguments are still declared when we do use Clap later, so that Clap |
7284b524b441
rhg: Make configuration available as early as possible in main()
Simon Sapin <simon.sapin@octobus.net>
parents:
46608
diff
changeset
|
323 /// does not return an error for their presence. |
7284b524b441
rhg: Make configuration available as early as possible in main()
Simon Sapin <simon.sapin@octobus.net>
parents:
46608
diff
changeset
|
324 struct EarlyArgs { |
7284b524b441
rhg: Make configuration available as early as possible in main()
Simon Sapin <simon.sapin@octobus.net>
parents:
46608
diff
changeset
|
325 /// Values of all `--config` arguments. (Possibly none) |
7284b524b441
rhg: Make configuration available as early as possible in main()
Simon Sapin <simon.sapin@octobus.net>
parents:
46608
diff
changeset
|
326 config: Vec<Vec<u8>>, |
7284b524b441
rhg: Make configuration available as early as possible in main()
Simon Sapin <simon.sapin@octobus.net>
parents:
46608
diff
changeset
|
327 /// Value of the `-R` or `--repository` argument, if any. |
7284b524b441
rhg: Make configuration available as early as possible in main()
Simon Sapin <simon.sapin@octobus.net>
parents:
46608
diff
changeset
|
328 repo: Option<Vec<u8>>, |
46736
2255e7eb39e5
rhg: Add support for --cwd
Simon Sapin <simon.sapin@octobus.net>
parents:
46734
diff
changeset
|
329 /// Value of the `--cwd` argument, if any. |
2255e7eb39e5
rhg: Add support for --cwd
Simon Sapin <simon.sapin@octobus.net>
parents:
46734
diff
changeset
|
330 cwd: Option<Vec<u8>>, |
46665
7284b524b441
rhg: Make configuration available as early as possible in main()
Simon Sapin <simon.sapin@octobus.net>
parents:
46608
diff
changeset
|
331 } |
7284b524b441
rhg: Make configuration available as early as possible in main()
Simon Sapin <simon.sapin@octobus.net>
parents:
46608
diff
changeset
|
332 |
7284b524b441
rhg: Make configuration available as early as possible in main()
Simon Sapin <simon.sapin@octobus.net>
parents:
46608
diff
changeset
|
333 impl EarlyArgs { |
7284b524b441
rhg: Make configuration available as early as possible in main()
Simon Sapin <simon.sapin@octobus.net>
parents:
46608
diff
changeset
|
334 fn parse(args: impl IntoIterator<Item = OsString>) -> Self { |
7284b524b441
rhg: Make configuration available as early as possible in main()
Simon Sapin <simon.sapin@octobus.net>
parents:
46608
diff
changeset
|
335 let mut args = args.into_iter().map(get_bytes_from_os_str); |
7284b524b441
rhg: Make configuration available as early as possible in main()
Simon Sapin <simon.sapin@octobus.net>
parents:
46608
diff
changeset
|
336 let mut config = Vec::new(); |
7284b524b441
rhg: Make configuration available as early as possible in main()
Simon Sapin <simon.sapin@octobus.net>
parents:
46608
diff
changeset
|
337 let mut repo = None; |
46736
2255e7eb39e5
rhg: Add support for --cwd
Simon Sapin <simon.sapin@octobus.net>
parents:
46734
diff
changeset
|
338 let mut cwd = None; |
46665
7284b524b441
rhg: Make configuration available as early as possible in main()
Simon Sapin <simon.sapin@octobus.net>
parents:
46608
diff
changeset
|
339 // Use `while let` instead of `for` so that we can also call |
7284b524b441
rhg: Make configuration available as early as possible in main()
Simon Sapin <simon.sapin@octobus.net>
parents:
46608
diff
changeset
|
340 // `args.next()` inside the loop. |
7284b524b441
rhg: Make configuration available as early as possible in main()
Simon Sapin <simon.sapin@octobus.net>
parents:
46608
diff
changeset
|
341 while let Some(arg) = args.next() { |
7284b524b441
rhg: Make configuration available as early as possible in main()
Simon Sapin <simon.sapin@octobus.net>
parents:
46608
diff
changeset
|
342 if arg == b"--config" { |
7284b524b441
rhg: Make configuration available as early as possible in main()
Simon Sapin <simon.sapin@octobus.net>
parents:
46608
diff
changeset
|
343 if let Some(value) = args.next() { |
7284b524b441
rhg: Make configuration available as early as possible in main()
Simon Sapin <simon.sapin@octobus.net>
parents:
46608
diff
changeset
|
344 config.push(value) |
7284b524b441
rhg: Make configuration available as early as possible in main()
Simon Sapin <simon.sapin@octobus.net>
parents:
46608
diff
changeset
|
345 } |
7284b524b441
rhg: Make configuration available as early as possible in main()
Simon Sapin <simon.sapin@octobus.net>
parents:
46608
diff
changeset
|
346 } else if let Some(value) = arg.drop_prefix(b"--config=") { |
7284b524b441
rhg: Make configuration available as early as possible in main()
Simon Sapin <simon.sapin@octobus.net>
parents:
46608
diff
changeset
|
347 config.push(value.to_owned()) |
7284b524b441
rhg: Make configuration available as early as possible in main()
Simon Sapin <simon.sapin@octobus.net>
parents:
46608
diff
changeset
|
348 } |
7284b524b441
rhg: Make configuration available as early as possible in main()
Simon Sapin <simon.sapin@octobus.net>
parents:
46608
diff
changeset
|
349 |
46736
2255e7eb39e5
rhg: Add support for --cwd
Simon Sapin <simon.sapin@octobus.net>
parents:
46734
diff
changeset
|
350 if arg == b"--cwd" { |
2255e7eb39e5
rhg: Add support for --cwd
Simon Sapin <simon.sapin@octobus.net>
parents:
46734
diff
changeset
|
351 if let Some(value) = args.next() { |
2255e7eb39e5
rhg: Add support for --cwd
Simon Sapin <simon.sapin@octobus.net>
parents:
46734
diff
changeset
|
352 cwd = Some(value) |
2255e7eb39e5
rhg: Add support for --cwd
Simon Sapin <simon.sapin@octobus.net>
parents:
46734
diff
changeset
|
353 } |
2255e7eb39e5
rhg: Add support for --cwd
Simon Sapin <simon.sapin@octobus.net>
parents:
46734
diff
changeset
|
354 } else if let Some(value) = arg.drop_prefix(b"--cwd=") { |
2255e7eb39e5
rhg: Add support for --cwd
Simon Sapin <simon.sapin@octobus.net>
parents:
46734
diff
changeset
|
355 cwd = Some(value.to_owned()) |
2255e7eb39e5
rhg: Add support for --cwd
Simon Sapin <simon.sapin@octobus.net>
parents:
46734
diff
changeset
|
356 } |
2255e7eb39e5
rhg: Add support for --cwd
Simon Sapin <simon.sapin@octobus.net>
parents:
46734
diff
changeset
|
357 |
46665
7284b524b441
rhg: Make configuration available as early as possible in main()
Simon Sapin <simon.sapin@octobus.net>
parents:
46608
diff
changeset
|
358 if arg == b"--repository" || arg == b"-R" { |
7284b524b441
rhg: Make configuration available as early as possible in main()
Simon Sapin <simon.sapin@octobus.net>
parents:
46608
diff
changeset
|
359 if let Some(value) = args.next() { |
7284b524b441
rhg: Make configuration available as early as possible in main()
Simon Sapin <simon.sapin@octobus.net>
parents:
46608
diff
changeset
|
360 repo = Some(value) |
7284b524b441
rhg: Make configuration available as early as possible in main()
Simon Sapin <simon.sapin@octobus.net>
parents:
46608
diff
changeset
|
361 } |
7284b524b441
rhg: Make configuration available as early as possible in main()
Simon Sapin <simon.sapin@octobus.net>
parents:
46608
diff
changeset
|
362 } else if let Some(value) = arg.drop_prefix(b"--repository=") { |
7284b524b441
rhg: Make configuration available as early as possible in main()
Simon Sapin <simon.sapin@octobus.net>
parents:
46608
diff
changeset
|
363 repo = Some(value.to_owned()) |
7284b524b441
rhg: Make configuration available as early as possible in main()
Simon Sapin <simon.sapin@octobus.net>
parents:
46608
diff
changeset
|
364 } else if let Some(value) = arg.drop_prefix(b"-R") { |
7284b524b441
rhg: Make configuration available as early as possible in main()
Simon Sapin <simon.sapin@octobus.net>
parents:
46608
diff
changeset
|
365 repo = Some(value.to_owned()) |
7284b524b441
rhg: Make configuration available as early as possible in main()
Simon Sapin <simon.sapin@octobus.net>
parents:
46608
diff
changeset
|
366 } |
46593
5ce2aa7c2ad5
rhg: Move `Repo` object creation into `main()`
Simon Sapin <simon.sapin@octobus.net>
parents:
46592
diff
changeset
|
367 } |
46736
2255e7eb39e5
rhg: Add support for --cwd
Simon Sapin <simon.sapin@octobus.net>
parents:
46734
diff
changeset
|
368 Self { config, repo, cwd } |
46593
5ce2aa7c2ad5
rhg: Move `Repo` object creation into `main()`
Simon Sapin <simon.sapin@octobus.net>
parents:
46592
diff
changeset
|
369 } |
5ce2aa7c2ad5
rhg: Move `Repo` object creation into `main()`
Simon Sapin <simon.sapin@octobus.net>
parents:
46592
diff
changeset
|
370 } |
46666
33f2d56acc73
rhg: Add a `rhg.on-unsupported` configuration key
Simon Sapin <simon.sapin@octobus.net>
parents:
46665
diff
changeset
|
371 |
33f2d56acc73
rhg: Add a `rhg.on-unsupported` configuration key
Simon Sapin <simon.sapin@octobus.net>
parents:
46665
diff
changeset
|
372 /// What to do when encountering some unsupported feature. |
33f2d56acc73
rhg: Add a `rhg.on-unsupported` configuration key
Simon Sapin <simon.sapin@octobus.net>
parents:
46665
diff
changeset
|
373 /// |
33f2d56acc73
rhg: Add a `rhg.on-unsupported` configuration key
Simon Sapin <simon.sapin@octobus.net>
parents:
46665
diff
changeset
|
374 /// See `HgError::UnsupportedFeature` and `CommandError::UnsupportedFeature`. |
33f2d56acc73
rhg: Add a `rhg.on-unsupported` configuration key
Simon Sapin <simon.sapin@octobus.net>
parents:
46665
diff
changeset
|
375 enum OnUnsupported { |
33f2d56acc73
rhg: Add a `rhg.on-unsupported` configuration key
Simon Sapin <simon.sapin@octobus.net>
parents:
46665
diff
changeset
|
376 /// Print an error message describing what feature is not supported, |
33f2d56acc73
rhg: Add a `rhg.on-unsupported` configuration key
Simon Sapin <simon.sapin@octobus.net>
parents:
46665
diff
changeset
|
377 /// and exit with code 252. |
33f2d56acc73
rhg: Add a `rhg.on-unsupported` configuration key
Simon Sapin <simon.sapin@octobus.net>
parents:
46665
diff
changeset
|
378 Abort, |
33f2d56acc73
rhg: Add a `rhg.on-unsupported` configuration key
Simon Sapin <simon.sapin@octobus.net>
parents:
46665
diff
changeset
|
379 /// Silently exit with code 252. |
33f2d56acc73
rhg: Add a `rhg.on-unsupported` configuration key
Simon Sapin <simon.sapin@octobus.net>
parents:
46665
diff
changeset
|
380 AbortSilent, |
46667
93e9f448273c
rhg: Add support for automatic fallback to Python
Simon Sapin <simon.sapin@octobus.net>
parents:
46666
diff
changeset
|
381 /// Try running a Python implementation |
93e9f448273c
rhg: Add support for automatic fallback to Python
Simon Sapin <simon.sapin@octobus.net>
parents:
46666
diff
changeset
|
382 Fallback { executable: Vec<u8> }, |
46666
33f2d56acc73
rhg: Add a `rhg.on-unsupported` configuration key
Simon Sapin <simon.sapin@octobus.net>
parents:
46665
diff
changeset
|
383 } |
33f2d56acc73
rhg: Add a `rhg.on-unsupported` configuration key
Simon Sapin <simon.sapin@octobus.net>
parents:
46665
diff
changeset
|
384 |
33f2d56acc73
rhg: Add a `rhg.on-unsupported` configuration key
Simon Sapin <simon.sapin@octobus.net>
parents:
46665
diff
changeset
|
385 impl OnUnsupported { |
46667
93e9f448273c
rhg: Add support for automatic fallback to Python
Simon Sapin <simon.sapin@octobus.net>
parents:
46666
diff
changeset
|
386 const DEFAULT: Self = OnUnsupported::Abort; |
93e9f448273c
rhg: Add support for automatic fallback to Python
Simon Sapin <simon.sapin@octobus.net>
parents:
46666
diff
changeset
|
387 const DEFAULT_FALLBACK_EXECUTABLE: &'static [u8] = b"hg"; |
93e9f448273c
rhg: Add support for automatic fallback to Python
Simon Sapin <simon.sapin@octobus.net>
parents:
46666
diff
changeset
|
388 |
46666
33f2d56acc73
rhg: Add a `rhg.on-unsupported` configuration key
Simon Sapin <simon.sapin@octobus.net>
parents:
46665
diff
changeset
|
389 fn from_config(config: &Config) -> Self { |
46667
93e9f448273c
rhg: Add support for automatic fallback to Python
Simon Sapin <simon.sapin@octobus.net>
parents:
46666
diff
changeset
|
390 match config |
93e9f448273c
rhg: Add support for automatic fallback to Python
Simon Sapin <simon.sapin@octobus.net>
parents:
46666
diff
changeset
|
391 .get(b"rhg", b"on-unsupported") |
93e9f448273c
rhg: Add support for automatic fallback to Python
Simon Sapin <simon.sapin@octobus.net>
parents:
46666
diff
changeset
|
392 .map(|value| value.to_ascii_lowercase()) |
93e9f448273c
rhg: Add support for automatic fallback to Python
Simon Sapin <simon.sapin@octobus.net>
parents:
46666
diff
changeset
|
393 .as_deref() |
93e9f448273c
rhg: Add support for automatic fallback to Python
Simon Sapin <simon.sapin@octobus.net>
parents:
46666
diff
changeset
|
394 { |
46666
33f2d56acc73
rhg: Add a `rhg.on-unsupported` configuration key
Simon Sapin <simon.sapin@octobus.net>
parents:
46665
diff
changeset
|
395 Some(b"abort") => OnUnsupported::Abort, |
33f2d56acc73
rhg: Add a `rhg.on-unsupported` configuration key
Simon Sapin <simon.sapin@octobus.net>
parents:
46665
diff
changeset
|
396 Some(b"abort-silent") => OnUnsupported::AbortSilent, |
46667
93e9f448273c
rhg: Add support for automatic fallback to Python
Simon Sapin <simon.sapin@octobus.net>
parents:
46666
diff
changeset
|
397 Some(b"fallback") => OnUnsupported::Fallback { |
93e9f448273c
rhg: Add support for automatic fallback to Python
Simon Sapin <simon.sapin@octobus.net>
parents:
46666
diff
changeset
|
398 executable: config |
93e9f448273c
rhg: Add support for automatic fallback to Python
Simon Sapin <simon.sapin@octobus.net>
parents:
46666
diff
changeset
|
399 .get(b"rhg", b"fallback-executable") |
93e9f448273c
rhg: Add support for automatic fallback to Python
Simon Sapin <simon.sapin@octobus.net>
parents:
46666
diff
changeset
|
400 .unwrap_or(Self::DEFAULT_FALLBACK_EXECUTABLE) |
93e9f448273c
rhg: Add support for automatic fallback to Python
Simon Sapin <simon.sapin@octobus.net>
parents:
46666
diff
changeset
|
401 .to_owned(), |
93e9f448273c
rhg: Add support for automatic fallback to Python
Simon Sapin <simon.sapin@octobus.net>
parents:
46666
diff
changeset
|
402 }, |
93e9f448273c
rhg: Add support for automatic fallback to Python
Simon Sapin <simon.sapin@octobus.net>
parents:
46666
diff
changeset
|
403 None => Self::DEFAULT, |
46666
33f2d56acc73
rhg: Add a `rhg.on-unsupported` configuration key
Simon Sapin <simon.sapin@octobus.net>
parents:
46665
diff
changeset
|
404 Some(_) => { |
33f2d56acc73
rhg: Add a `rhg.on-unsupported` configuration key
Simon Sapin <simon.sapin@octobus.net>
parents:
46665
diff
changeset
|
405 // TODO: warn about unknown config value |
46667
93e9f448273c
rhg: Add support for automatic fallback to Python
Simon Sapin <simon.sapin@octobus.net>
parents:
46666
diff
changeset
|
406 Self::DEFAULT |
46666
33f2d56acc73
rhg: Add a `rhg.on-unsupported` configuration key
Simon Sapin <simon.sapin@octobus.net>
parents:
46665
diff
changeset
|
407 } |
33f2d56acc73
rhg: Add a `rhg.on-unsupported` configuration key
Simon Sapin <simon.sapin@octobus.net>
parents:
46665
diff
changeset
|
408 } |
33f2d56acc73
rhg: Add a `rhg.on-unsupported` configuration key
Simon Sapin <simon.sapin@octobus.net>
parents:
46665
diff
changeset
|
409 } |
33f2d56acc73
rhg: Add a `rhg.on-unsupported` configuration key
Simon Sapin <simon.sapin@octobus.net>
parents:
46665
diff
changeset
|
410 } |
46733
1bac7764ceef
rhg: Fall back to Python if unsupported extensions are enabled
Simon Sapin <simon.sapin@octobus.net>
parents:
46731
diff
changeset
|
411 |
1bac7764ceef
rhg: Fall back to Python if unsupported extensions are enabled
Simon Sapin <simon.sapin@octobus.net>
parents:
46731
diff
changeset
|
412 const SUPPORTED_EXTENSIONS: &[&[u8]] = &[b"blackbox", b"share"]; |
1bac7764ceef
rhg: Fall back to Python if unsupported extensions are enabled
Simon Sapin <simon.sapin@octobus.net>
parents:
46731
diff
changeset
|
413 |
1bac7764ceef
rhg: Fall back to Python if unsupported extensions are enabled
Simon Sapin <simon.sapin@octobus.net>
parents:
46731
diff
changeset
|
414 fn check_extensions(config: &Config) -> Result<(), CommandError> { |
1bac7764ceef
rhg: Fall back to Python if unsupported extensions are enabled
Simon Sapin <simon.sapin@octobus.net>
parents:
46731
diff
changeset
|
415 let enabled = config.get_section_keys(b"extensions"); |
1bac7764ceef
rhg: Fall back to Python if unsupported extensions are enabled
Simon Sapin <simon.sapin@octobus.net>
parents:
46731
diff
changeset
|
416 |
1bac7764ceef
rhg: Fall back to Python if unsupported extensions are enabled
Simon Sapin <simon.sapin@octobus.net>
parents:
46731
diff
changeset
|
417 let mut unsupported = enabled; |
1bac7764ceef
rhg: Fall back to Python if unsupported extensions are enabled
Simon Sapin <simon.sapin@octobus.net>
parents:
46731
diff
changeset
|
418 for supported in SUPPORTED_EXTENSIONS { |
1bac7764ceef
rhg: Fall back to Python if unsupported extensions are enabled
Simon Sapin <simon.sapin@octobus.net>
parents:
46731
diff
changeset
|
419 unsupported.remove(supported); |
1bac7764ceef
rhg: Fall back to Python if unsupported extensions are enabled
Simon Sapin <simon.sapin@octobus.net>
parents:
46731
diff
changeset
|
420 } |
1bac7764ceef
rhg: Fall back to Python if unsupported extensions are enabled
Simon Sapin <simon.sapin@octobus.net>
parents:
46731
diff
changeset
|
421 |
46734
1a036d33bc18
rhg: Add an allow-list of ignored extensions
Simon Sapin <simon.sapin@octobus.net>
parents:
46733
diff
changeset
|
422 if let Some(ignored_list) = |
1a036d33bc18
rhg: Add an allow-list of ignored extensions
Simon Sapin <simon.sapin@octobus.net>
parents:
46733
diff
changeset
|
423 config.get_simple_list(b"rhg", b"ignored-extensions") |
1a036d33bc18
rhg: Add an allow-list of ignored extensions
Simon Sapin <simon.sapin@octobus.net>
parents:
46733
diff
changeset
|
424 { |
1a036d33bc18
rhg: Add an allow-list of ignored extensions
Simon Sapin <simon.sapin@octobus.net>
parents:
46733
diff
changeset
|
425 for ignored in ignored_list { |
1a036d33bc18
rhg: Add an allow-list of ignored extensions
Simon Sapin <simon.sapin@octobus.net>
parents:
46733
diff
changeset
|
426 unsupported.remove(ignored); |
1a036d33bc18
rhg: Add an allow-list of ignored extensions
Simon Sapin <simon.sapin@octobus.net>
parents:
46733
diff
changeset
|
427 } |
1a036d33bc18
rhg: Add an allow-list of ignored extensions
Simon Sapin <simon.sapin@octobus.net>
parents:
46733
diff
changeset
|
428 } |
1a036d33bc18
rhg: Add an allow-list of ignored extensions
Simon Sapin <simon.sapin@octobus.net>
parents:
46733
diff
changeset
|
429 |
46733
1bac7764ceef
rhg: Fall back to Python if unsupported extensions are enabled
Simon Sapin <simon.sapin@octobus.net>
parents:
46731
diff
changeset
|
430 if unsupported.is_empty() { |
1bac7764ceef
rhg: Fall back to Python if unsupported extensions are enabled
Simon Sapin <simon.sapin@octobus.net>
parents:
46731
diff
changeset
|
431 Ok(()) |
1bac7764ceef
rhg: Fall back to Python if unsupported extensions are enabled
Simon Sapin <simon.sapin@octobus.net>
parents:
46731
diff
changeset
|
432 } else { |
1bac7764ceef
rhg: Fall back to Python if unsupported extensions are enabled
Simon Sapin <simon.sapin@octobus.net>
parents:
46731
diff
changeset
|
433 Err(CommandError::UnsupportedFeature { |
1bac7764ceef
rhg: Fall back to Python if unsupported extensions are enabled
Simon Sapin <simon.sapin@octobus.net>
parents:
46731
diff
changeset
|
434 message: format_bytes!( |
46734
1a036d33bc18
rhg: Add an allow-list of ignored extensions
Simon Sapin <simon.sapin@octobus.net>
parents:
46733
diff
changeset
|
435 b"extensions: {} (consider adding them to 'rhg.ignored-extensions' config)", |
46733
1bac7764ceef
rhg: Fall back to Python if unsupported extensions are enabled
Simon Sapin <simon.sapin@octobus.net>
parents:
46731
diff
changeset
|
436 join(unsupported, b", ") |
1bac7764ceef
rhg: Fall back to Python if unsupported extensions are enabled
Simon Sapin <simon.sapin@octobus.net>
parents:
46731
diff
changeset
|
437 ), |
1bac7764ceef
rhg: Fall back to Python if unsupported extensions are enabled
Simon Sapin <simon.sapin@octobus.net>
parents:
46731
diff
changeset
|
438 }) |
1bac7764ceef
rhg: Fall back to Python if unsupported extensions are enabled
Simon Sapin <simon.sapin@octobus.net>
parents:
46731
diff
changeset
|
439 } |
1bac7764ceef
rhg: Fall back to Python if unsupported extensions are enabled
Simon Sapin <simon.sapin@octobus.net>
parents:
46731
diff
changeset
|
440 } |