Mercurial > hg
annotate rust/rhg/src/main.rs @ 49149:006688e36e12 stable
rhg: use `Command::exec` instead of `Command::status`
`rhg` is supposed to be a transparent executable, using a subprocess defeats
that purpose. See inline comments for more details.
This also introduces the `which` crate to check if the fallback executable
actually exists to help debugging (plain `execve` doesn't give much
information).
The error code 253 is used to signify that the fallback is not found, but may
mean in the future that it is otherwise invalid if we start being more
specific.
Differential Revision: https://phab.mercurial-scm.org/D12578
author | Raphaël Gomès <rgomes@octobus.net> |
---|---|
date | Tue, 19 Apr 2022 12:27:40 +0200 |
parents | f19be290756a |
children | a932cad26d37 |
rev | line source |
---|---|
45530
b1cea0dc9db0
rhg: Add debug timing
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45529
diff
changeset
|
1 extern crate log; |
48336
5b9865032533
rhg: $HG_PENDING is not supported
Simon Sapin <simon.sapin@octobus.net>
parents:
48174
diff
changeset
|
2 use crate::error::CommandError; |
48770
f19be290756a
rhg: signal when falling back in logs
Raphaël Gomès <rgomes@octobus.net>
parents:
48734
diff
changeset
|
3 use crate::ui::{local_to_utf8, Ui}; |
45050
18f8d3b31baa
rhg: add a limited `rhg root` subcommand
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45049
diff
changeset
|
4 use clap::App; |
18f8d3b31baa
rhg: add a limited `rhg root` subcommand
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45049
diff
changeset
|
5 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
|
6 use clap::Arg; |
45529
f17caf8f3fef
rhg: add a limited `rhg debugdata` subcommand
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45440
diff
changeset
|
7 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
|
8 use format_bytes::{format_bytes, join}; |
47404
ebdef6283798
rhg: read [paths] for `--repository` value
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46822
diff
changeset
|
9 use hg::config::{Config, ConfigSource}; |
47407
6e49769b7f97
rhg: add exit code to HgError::Abort()
Pulkit Goyal <7895pulkit@gmail.com>
parents:
47406
diff
changeset
|
10 use hg::exit_codes; |
46593
5ce2aa7c2ad5
rhg: Move `Repo` object creation into `main()`
Simon Sapin <simon.sapin@octobus.net>
parents:
46592
diff
changeset
|
11 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
|
12 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
|
13 use hg::utils::SliceExt; |
48439
9cf5ac8c7109
rhg: support the new extension suboptions syntax
Raphaël Gomès <rgomes@octobus.net>
parents:
48415
diff
changeset
|
14 use std::collections::HashSet; |
46665
7284b524b441
rhg: Make configuration available as early as possible in main()
Simon Sapin <simon.sapin@octobus.net>
parents:
46608
diff
changeset
|
15 use std::ffi::OsString; |
49149
006688e36e12
rhg: use `Command::exec` instead of `Command::status`
Raphaël Gomès <rgomes@octobus.net>
parents:
48770
diff
changeset
|
16 use std::os::unix::prelude::CommandExt; |
46665
7284b524b441
rhg: Make configuration available as early as possible in main()
Simon Sapin <simon.sapin@octobus.net>
parents:
46608
diff
changeset
|
17 use std::path::PathBuf; |
46667
93e9f448273c
rhg: Add support for automatic fallback to Python
Simon Sapin <simon.sapin@octobus.net>
parents:
46666
diff
changeset
|
18 use std::process::Command; |
45050
18f8d3b31baa
rhg: add a limited `rhg root` subcommand
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45049
diff
changeset
|
19 |
46601
755c31a1caf9
rhg: Add support for the blackbox extension
Simon Sapin <simon.sapin@octobus.net>
parents:
46596
diff
changeset
|
20 mod blackbox; |
48733
39c447e03dbc
rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
48732
diff
changeset
|
21 mod color; |
44982
bacf6c7ef01b
rhg: add Command trait for subcommands implemented by rhg
Antoine Cezar <antoine.cezar@octobus.net>
parents:
44981
diff
changeset
|
22 mod error; |
45049
513b3ef277a3
rhg: add RootCommand using hg-core FindRoot operation to prepare `hg root`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
44982
diff
changeset
|
23 mod ui; |
48174
9ecf802b06e0
rhg: refactor function to relativize paths in utils
Pulkit Goyal <7895pulkit@gmail.com>
parents:
48077
diff
changeset
|
24 pub mod utils { |
9ecf802b06e0
rhg: refactor function to relativize paths in utils
Pulkit Goyal <7895pulkit@gmail.com>
parents:
48077
diff
changeset
|
25 pub mod path_utils; |
9ecf802b06e0
rhg: refactor function to relativize paths in utils
Pulkit Goyal <7895pulkit@gmail.com>
parents:
48077
diff
changeset
|
26 } |
44981 | 27 |
46601
755c31a1caf9
rhg: Add support for the blackbox extension
Simon Sapin <simon.sapin@octobus.net>
parents:
46596
diff
changeset
|
28 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
|
29 process_start_time: &blackbox::ProcessStartTime, |
46601
755c31a1caf9
rhg: Add support for the blackbox extension
Simon Sapin <simon.sapin@octobus.net>
parents:
46596
diff
changeset
|
30 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
|
31 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
|
32 config: &Config, |
46601
755c31a1caf9
rhg: Add support for the blackbox extension
Simon Sapin <simon.sapin@octobus.net>
parents:
46596
diff
changeset
|
33 ) -> Result<(), CommandError> { |
48734
3e2b4bb286e7
rhg: Colorize `rhg status` output when appropriate
Simon Sapin <simon.sapin@octobus.net>
parents:
48733
diff
changeset
|
34 check_unsupported(config, repo)?; |
46733
1bac7764ceef
rhg: Fall back to Python if unsupported extensions are enabled
Simon Sapin <simon.sapin@octobus.net>
parents:
46731
diff
changeset
|
35 |
45529
f17caf8f3fef
rhg: add a limited `rhg debugdata` subcommand
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45440
diff
changeset
|
36 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
|
37 .global_setting(AppSettings::AllowInvalidUtf8) |
46746
eb14264b98e8
rhg: Fall back to Python for --version
Simon Sapin <simon.sapin@octobus.net>
parents:
46744
diff
changeset
|
38 .global_setting(AppSettings::DisableVersion) |
45050
18f8d3b31baa
rhg: add a limited `rhg root` subcommand
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45049
diff
changeset
|
39 .setting(AppSettings::SubcommandRequired) |
18f8d3b31baa
rhg: add a limited `rhg root` subcommand
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45049
diff
changeset
|
40 .setting(AppSettings::VersionlessSubcommands) |
46608
4e4c70401028
rhg: Use clap’s support for global CLI arguments
Simon Sapin <simon.sapin@octobus.net>
parents:
46601
diff
changeset
|
41 .arg( |
4e4c70401028
rhg: Use clap’s support for global CLI arguments
Simon Sapin <simon.sapin@octobus.net>
parents:
46601
diff
changeset
|
42 Arg::with_name("repository") |
4e4c70401028
rhg: Use clap’s support for global CLI arguments
Simon Sapin <simon.sapin@octobus.net>
parents:
46601
diff
changeset
|
43 .help("repository root directory") |
4e4c70401028
rhg: Use clap’s support for global CLI arguments
Simon Sapin <simon.sapin@octobus.net>
parents:
46601
diff
changeset
|
44 .short("-R") |
4e4c70401028
rhg: Use clap’s support for global CLI arguments
Simon Sapin <simon.sapin@octobus.net>
parents:
46601
diff
changeset
|
45 .long("--repository") |
4e4c70401028
rhg: Use clap’s support for global CLI arguments
Simon Sapin <simon.sapin@octobus.net>
parents:
46601
diff
changeset
|
46 .value_name("REPO") |
4e4c70401028
rhg: Use clap’s support for global CLI arguments
Simon Sapin <simon.sapin@octobus.net>
parents:
46601
diff
changeset
|
47 .takes_value(true) |
4e4c70401028
rhg: Use clap’s support for global CLI arguments
Simon Sapin <simon.sapin@octobus.net>
parents:
46601
diff
changeset
|
48 // 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
|
49 .global(true), |
4e4c70401028
rhg: Use clap’s support for global CLI arguments
Simon Sapin <simon.sapin@octobus.net>
parents:
46601
diff
changeset
|
50 ) |
4e4c70401028
rhg: Use clap’s support for global CLI arguments
Simon Sapin <simon.sapin@octobus.net>
parents:
46601
diff
changeset
|
51 .arg( |
4e4c70401028
rhg: Use clap’s support for global CLI arguments
Simon Sapin <simon.sapin@octobus.net>
parents:
46601
diff
changeset
|
52 Arg::with_name("config") |
4e4c70401028
rhg: Use clap’s support for global CLI arguments
Simon Sapin <simon.sapin@octobus.net>
parents:
46601
diff
changeset
|
53 .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
|
54 .long("--config") |
4e4c70401028
rhg: Use clap’s support for global CLI arguments
Simon Sapin <simon.sapin@octobus.net>
parents:
46601
diff
changeset
|
55 .value_name("CONFIG") |
4e4c70401028
rhg: Use clap’s support for global CLI arguments
Simon Sapin <simon.sapin@octobus.net>
parents:
46601
diff
changeset
|
56 .takes_value(true) |
4e4c70401028
rhg: Use clap’s support for global CLI arguments
Simon Sapin <simon.sapin@octobus.net>
parents:
46601
diff
changeset
|
57 .global(true) |
4e4c70401028
rhg: Use clap’s support for global CLI arguments
Simon Sapin <simon.sapin@octobus.net>
parents:
46601
diff
changeset
|
58 // 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
|
59 .multiple(true) |
4e4c70401028
rhg: Use clap’s support for global CLI arguments
Simon Sapin <simon.sapin@octobus.net>
parents:
46601
diff
changeset
|
60 // 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
|
61 .number_of_values(1), |
4e4c70401028
rhg: Use clap’s support for global CLI arguments
Simon Sapin <simon.sapin@octobus.net>
parents:
46601
diff
changeset
|
62 ) |
46736
2255e7eb39e5
rhg: Add support for --cwd
Simon Sapin <simon.sapin@octobus.net>
parents:
46734
diff
changeset
|
63 .arg( |
2255e7eb39e5
rhg: Add support for --cwd
Simon Sapin <simon.sapin@octobus.net>
parents:
46734
diff
changeset
|
64 Arg::with_name("cwd") |
2255e7eb39e5
rhg: Add support for --cwd
Simon Sapin <simon.sapin@octobus.net>
parents:
46734
diff
changeset
|
65 .help("change working directory") |
2255e7eb39e5
rhg: Add support for --cwd
Simon Sapin <simon.sapin@octobus.net>
parents:
46734
diff
changeset
|
66 .long("--cwd") |
2255e7eb39e5
rhg: Add support for --cwd
Simon Sapin <simon.sapin@octobus.net>
parents:
46734
diff
changeset
|
67 .value_name("DIR") |
2255e7eb39e5
rhg: Add support for --cwd
Simon Sapin <simon.sapin@octobus.net>
parents:
46734
diff
changeset
|
68 .takes_value(true) |
2255e7eb39e5
rhg: Add support for --cwd
Simon Sapin <simon.sapin@octobus.net>
parents:
46734
diff
changeset
|
69 .global(true), |
2255e7eb39e5
rhg: Add support for --cwd
Simon Sapin <simon.sapin@octobus.net>
parents:
46734
diff
changeset
|
70 ) |
48732
d4a5c2197208
rhg: Add parsing for the --color global CLI argument
Simon Sapin <simon.sapin@octobus.net>
parents:
48731
diff
changeset
|
71 .arg( |
d4a5c2197208
rhg: Add parsing for the --color global CLI argument
Simon Sapin <simon.sapin@octobus.net>
parents:
48731
diff
changeset
|
72 Arg::with_name("color") |
d4a5c2197208
rhg: Add parsing for the --color global CLI argument
Simon Sapin <simon.sapin@octobus.net>
parents:
48731
diff
changeset
|
73 .help("when to colorize (boolean, always, auto, never, or debug)") |
d4a5c2197208
rhg: Add parsing for the --color global CLI argument
Simon Sapin <simon.sapin@octobus.net>
parents:
48731
diff
changeset
|
74 .long("--color") |
d4a5c2197208
rhg: Add parsing for the --color global CLI argument
Simon Sapin <simon.sapin@octobus.net>
parents:
48731
diff
changeset
|
75 .value_name("TYPE") |
d4a5c2197208
rhg: Add parsing for the --color global CLI argument
Simon Sapin <simon.sapin@octobus.net>
parents:
48731
diff
changeset
|
76 .takes_value(true) |
d4a5c2197208
rhg: Add parsing for the --color global CLI argument
Simon Sapin <simon.sapin@octobus.net>
parents:
48731
diff
changeset
|
77 .global(true), |
d4a5c2197208
rhg: Add parsing for the --color global CLI argument
Simon Sapin <simon.sapin@octobus.net>
parents:
48731
diff
changeset
|
78 ) |
46502
95d37db31479
rhg: Replace subcommand boilerplate with a macro
Simon Sapin <simon.sapin@octobus.net>
parents:
46501
diff
changeset
|
79 .version("0.0.1"); |
95d37db31479
rhg: Replace subcommand boilerplate with a macro
Simon Sapin <simon.sapin@octobus.net>
parents:
46501
diff
changeset
|
80 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
|
81 |
46591
21d3b40b4c0e
rhg: Remove error message on unsupported CLI arguments
Simon Sapin <simon.sapin@octobus.net>
parents:
46505
diff
changeset
|
82 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
|
83 |
46502
95d37db31479
rhg: Replace subcommand boilerplate with a macro
Simon Sapin <simon.sapin@octobus.net>
parents:
46501
diff
changeset
|
84 let (subcommand_name, subcommand_matches) = matches.subcommand(); |
48075
f11f233546ce
rhg: fallback if the current command has any generic hook defined
Raphaël Gomès <rgomes@octobus.net>
parents:
47951
diff
changeset
|
85 |
48076
b44e1184b7e1
rhg: fallback if `defaults` config is set for the current command
Raphaël Gomès <rgomes@octobus.net>
parents:
48075
diff
changeset
|
86 // Mercurial allows users to define "defaults" for commands, fallback |
b44e1184b7e1
rhg: fallback if `defaults` config is set for the current command
Raphaël Gomès <rgomes@octobus.net>
parents:
48075
diff
changeset
|
87 // if a default is detected for the current command |
b44e1184b7e1
rhg: fallback if `defaults` config is set for the current command
Raphaël Gomès <rgomes@octobus.net>
parents:
48075
diff
changeset
|
88 let defaults = config.get_str(b"defaults", subcommand_name.as_bytes()); |
b44e1184b7e1
rhg: fallback if `defaults` config is set for the current command
Raphaël Gomès <rgomes@octobus.net>
parents:
48075
diff
changeset
|
89 if defaults?.is_some() { |
b44e1184b7e1
rhg: fallback if `defaults` config is set for the current command
Raphaël Gomès <rgomes@octobus.net>
parents:
48075
diff
changeset
|
90 let msg = "`defaults` config set"; |
b44e1184b7e1
rhg: fallback if `defaults` config is set for the current command
Raphaël Gomès <rgomes@octobus.net>
parents:
48075
diff
changeset
|
91 return Err(CommandError::unsupported(msg)); |
b44e1184b7e1
rhg: fallback if `defaults` config is set for the current command
Raphaël Gomès <rgomes@octobus.net>
parents:
48075
diff
changeset
|
92 } |
b44e1184b7e1
rhg: fallback if `defaults` config is set for the current command
Raphaël Gomès <rgomes@octobus.net>
parents:
48075
diff
changeset
|
93 |
48075
f11f233546ce
rhg: fallback if the current command has any generic hook defined
Raphaël Gomès <rgomes@octobus.net>
parents:
47951
diff
changeset
|
94 for prefix in ["pre", "post", "fail"].iter() { |
f11f233546ce
rhg: fallback if the current command has any generic hook defined
Raphaël Gomès <rgomes@octobus.net>
parents:
47951
diff
changeset
|
95 // Mercurial allows users to define generic hooks for commands, |
f11f233546ce
rhg: fallback if the current command has any generic hook defined
Raphaël Gomès <rgomes@octobus.net>
parents:
47951
diff
changeset
|
96 // fallback if any are detected |
f11f233546ce
rhg: fallback if the current command has any generic hook defined
Raphaël Gomès <rgomes@octobus.net>
parents:
47951
diff
changeset
|
97 let item = format!("{}-{}", prefix, subcommand_name); |
f11f233546ce
rhg: fallback if the current command has any generic hook defined
Raphaël Gomès <rgomes@octobus.net>
parents:
47951
diff
changeset
|
98 let hook_for_command = config.get_str(b"hooks", item.as_bytes())?; |
f11f233546ce
rhg: fallback if the current command has any generic hook defined
Raphaël Gomès <rgomes@octobus.net>
parents:
47951
diff
changeset
|
99 if hook_for_command.is_some() { |
f11f233546ce
rhg: fallback if the current command has any generic hook defined
Raphaël Gomès <rgomes@octobus.net>
parents:
47951
diff
changeset
|
100 let msg = format!("{}-{} hook defined", prefix, subcommand_name); |
f11f233546ce
rhg: fallback if the current command has any generic hook defined
Raphaël Gomès <rgomes@octobus.net>
parents:
47951
diff
changeset
|
101 return Err(CommandError::unsupported(msg)); |
f11f233546ce
rhg: fallback if the current command has any generic hook defined
Raphaël Gomès <rgomes@octobus.net>
parents:
47951
diff
changeset
|
102 } |
f11f233546ce
rhg: fallback if the current command has any generic hook defined
Raphaël Gomès <rgomes@octobus.net>
parents:
47951
diff
changeset
|
103 } |
46502
95d37db31479
rhg: Replace subcommand boilerplate with a macro
Simon Sapin <simon.sapin@octobus.net>
parents:
46501
diff
changeset
|
104 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
|
105 .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
|
106 let subcommand_args = subcommand_matches |
46502
95d37db31479
rhg: Replace subcommand boilerplate with a macro
Simon Sapin <simon.sapin@octobus.net>
parents:
46501
diff
changeset
|
107 .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
|
108 |
46601
755c31a1caf9
rhg: Add support for the blackbox extension
Simon Sapin <simon.sapin@octobus.net>
parents:
46596
diff
changeset
|
109 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
|
110 ui, |
80840b651721
rhg: Group values passed to every sub-command into a struct
Simon Sapin <simon.sapin@octobus.net>
parents:
46591
diff
changeset
|
111 subcommand_args, |
46665
7284b524b441
rhg: Make configuration available as early as possible in main()
Simon Sapin <simon.sapin@octobus.net>
parents:
46608
diff
changeset
|
112 config, |
7284b524b441
rhg: Make configuration available as early as possible in main()
Simon Sapin <simon.sapin@octobus.net>
parents:
46608
diff
changeset
|
113 repo, |
46601
755c31a1caf9
rhg: Add support for the blackbox extension
Simon Sapin <simon.sapin@octobus.net>
parents:
46596
diff
changeset
|
114 }; |
48077
ba773bd99203
rhg: fall back if subrepos are detected
Raphaël Gomès <rgomes@octobus.net>
parents:
48076
diff
changeset
|
115 |
ba773bd99203
rhg: fall back if subrepos are detected
Raphaël Gomès <rgomes@octobus.net>
parents:
48076
diff
changeset
|
116 if let Ok(repo) = repo { |
ba773bd99203
rhg: fall back if subrepos are detected
Raphaël Gomès <rgomes@octobus.net>
parents:
48076
diff
changeset
|
117 // We don't support subrepos, fallback if the subrepos file is present |
ba773bd99203
rhg: fall back if subrepos are detected
Raphaël Gomès <rgomes@octobus.net>
parents:
48076
diff
changeset
|
118 if repo.working_directory_vfs().join(".hgsub").exists() { |
ba773bd99203
rhg: fall back if subrepos are detected
Raphaël Gomès <rgomes@octobus.net>
parents:
48076
diff
changeset
|
119 let msg = "subrepos (.hgsub is present)"; |
ba773bd99203
rhg: fall back if subrepos are detected
Raphaël Gomès <rgomes@octobus.net>
parents:
48076
diff
changeset
|
120 return Err(CommandError::unsupported(msg)); |
ba773bd99203
rhg: fall back if subrepos are detected
Raphaël Gomès <rgomes@octobus.net>
parents:
48076
diff
changeset
|
121 } |
ba773bd99203
rhg: fall back if subrepos are detected
Raphaël Gomès <rgomes@octobus.net>
parents:
48076
diff
changeset
|
122 } |
ba773bd99203
rhg: fall back if subrepos are detected
Raphaël Gomès <rgomes@octobus.net>
parents:
48076
diff
changeset
|
123 |
48415
9ff246cd6200
rhg: don't run `blackbox` if not activated
Raphaël Gomès <rgomes@octobus.net>
parents:
48409
diff
changeset
|
124 if config.is_extension_enabled(b"blackbox") { |
9ff246cd6200
rhg: don't run `blackbox` if not activated
Raphaël Gomès <rgomes@octobus.net>
parents:
48409
diff
changeset
|
125 let blackbox = |
9ff246cd6200
rhg: don't run `blackbox` if not activated
Raphaël Gomès <rgomes@octobus.net>
parents:
48409
diff
changeset
|
126 blackbox::Blackbox::new(&invocation, process_start_time)?; |
9ff246cd6200
rhg: don't run `blackbox` if not activated
Raphaël Gomès <rgomes@octobus.net>
parents:
48409
diff
changeset
|
127 blackbox.log_command_start(); |
9ff246cd6200
rhg: don't run `blackbox` if not activated
Raphaël Gomès <rgomes@octobus.net>
parents:
48409
diff
changeset
|
128 let result = run(&invocation); |
9ff246cd6200
rhg: don't run `blackbox` if not activated
Raphaël Gomès <rgomes@octobus.net>
parents:
48409
diff
changeset
|
129 blackbox.log_command_end(exit_code( |
9ff246cd6200
rhg: don't run `blackbox` if not activated
Raphaël Gomès <rgomes@octobus.net>
parents:
48409
diff
changeset
|
130 &result, |
9ff246cd6200
rhg: don't run `blackbox` if not activated
Raphaël Gomès <rgomes@octobus.net>
parents:
48409
diff
changeset
|
131 // TODO: show a warning or combine with original error if |
9ff246cd6200
rhg: don't run `blackbox` if not activated
Raphaël Gomès <rgomes@octobus.net>
parents:
48409
diff
changeset
|
132 // `get_bool` returns an error |
9ff246cd6200
rhg: don't run `blackbox` if not activated
Raphaël Gomès <rgomes@octobus.net>
parents:
48409
diff
changeset
|
133 config |
9ff246cd6200
rhg: don't run `blackbox` if not activated
Raphaël Gomès <rgomes@octobus.net>
parents:
48409
diff
changeset
|
134 .get_bool(b"ui", b"detailed-exit-code") |
9ff246cd6200
rhg: don't run `blackbox` if not activated
Raphaël Gomès <rgomes@octobus.net>
parents:
48409
diff
changeset
|
135 .unwrap_or(false), |
9ff246cd6200
rhg: don't run `blackbox` if not activated
Raphaël Gomès <rgomes@octobus.net>
parents:
48409
diff
changeset
|
136 )); |
9ff246cd6200
rhg: don't run `blackbox` if not activated
Raphaël Gomès <rgomes@octobus.net>
parents:
48409
diff
changeset
|
137 result |
9ff246cd6200
rhg: don't run `blackbox` if not activated
Raphaël Gomès <rgomes@octobus.net>
parents:
48409
diff
changeset
|
138 } else { |
9ff246cd6200
rhg: don't run `blackbox` if not activated
Raphaël Gomès <rgomes@octobus.net>
parents:
48409
diff
changeset
|
139 run(&invocation) |
9ff246cd6200
rhg: don't run `blackbox` if not activated
Raphaël Gomès <rgomes@octobus.net>
parents:
48409
diff
changeset
|
140 } |
46591
21d3b40b4c0e
rhg: Remove error message on unsupported CLI arguments
Simon Sapin <simon.sapin@octobus.net>
parents:
46505
diff
changeset
|
141 } |
46502
95d37db31479
rhg: Replace subcommand boilerplate with a macro
Simon Sapin <simon.sapin@octobus.net>
parents:
46501
diff
changeset
|
142 |
46591
21d3b40b4c0e
rhg: Remove error message on unsupported CLI arguments
Simon Sapin <simon.sapin@octobus.net>
parents:
46505
diff
changeset
|
143 fn main() { |
46601
755c31a1caf9
rhg: Add support for the blackbox extension
Simon Sapin <simon.sapin@octobus.net>
parents:
46596
diff
changeset
|
144 // 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
|
145 // 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
|
146 // 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
|
147 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
|
148 |
46665
7284b524b441
rhg: Make configuration available as early as possible in main()
Simon Sapin <simon.sapin@octobus.net>
parents:
46608
diff
changeset
|
149 env_logger::init(); |
46591
21d3b40b4c0e
rhg: Remove error message on unsupported CLI arguments
Simon Sapin <simon.sapin@octobus.net>
parents:
46505
diff
changeset
|
150 |
46665
7284b524b441
rhg: Make configuration available as early as possible in main()
Simon Sapin <simon.sapin@octobus.net>
parents:
46608
diff
changeset
|
151 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
|
152 |
2255e7eb39e5
rhg: Add support for --cwd
Simon Sapin <simon.sapin@octobus.net>
parents:
46734
diff
changeset
|
153 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
|
154 let cwd = get_path_from_bytes(&cwd); |
2255e7eb39e5
rhg: Add support for --cwd
Simon Sapin <simon.sapin@octobus.net>
parents:
46734
diff
changeset
|
155 std::env::current_dir() |
2255e7eb39e5
rhg: Add support for --cwd
Simon Sapin <simon.sapin@octobus.net>
parents:
46734
diff
changeset
|
156 .and_then(|initial| { |
2255e7eb39e5
rhg: Add support for --cwd
Simon Sapin <simon.sapin@octobus.net>
parents:
46734
diff
changeset
|
157 std::env::set_current_dir(cwd)?; |
2255e7eb39e5
rhg: Add support for --cwd
Simon Sapin <simon.sapin@octobus.net>
parents:
46734
diff
changeset
|
158 Ok(initial) |
2255e7eb39e5
rhg: Add support for --cwd
Simon Sapin <simon.sapin@octobus.net>
parents:
46734
diff
changeset
|
159 }) |
2255e7eb39e5
rhg: Add support for --cwd
Simon Sapin <simon.sapin@octobus.net>
parents:
46734
diff
changeset
|
160 .unwrap_or_else(|error| { |
2255e7eb39e5
rhg: Add support for --cwd
Simon Sapin <simon.sapin@octobus.net>
parents:
46734
diff
changeset
|
161 exit( |
2255e7eb39e5
rhg: Add support for --cwd
Simon Sapin <simon.sapin@octobus.net>
parents:
46734
diff
changeset
|
162 &None, |
48731
f591b377375f
rhg: Make Ui::new falliable, add Ui::new_infallible
Simon Sapin <simon.sapin@octobus.net>
parents:
48730
diff
changeset
|
163 &Ui::new_infallible(&Config::empty()), |
46736
2255e7eb39e5
rhg: Add support for --cwd
Simon Sapin <simon.sapin@octobus.net>
parents:
46734
diff
changeset
|
164 OnUnsupported::Abort, |
2255e7eb39e5
rhg: Add support for --cwd
Simon Sapin <simon.sapin@octobus.net>
parents:
46734
diff
changeset
|
165 Err(CommandError::abort(format!( |
2255e7eb39e5
rhg: Add support for --cwd
Simon Sapin <simon.sapin@octobus.net>
parents:
46734
diff
changeset
|
166 "abort: {}: '{}'", |
2255e7eb39e5
rhg: Add support for --cwd
Simon Sapin <simon.sapin@octobus.net>
parents:
46734
diff
changeset
|
167 error, |
2255e7eb39e5
rhg: Add support for --cwd
Simon Sapin <simon.sapin@octobus.net>
parents:
46734
diff
changeset
|
168 cwd.display() |
2255e7eb39e5
rhg: Add support for --cwd
Simon Sapin <simon.sapin@octobus.net>
parents:
46734
diff
changeset
|
169 ))), |
46820
821929d59e01
rhg: add support for detailed exit code for ConfigParseError
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46748
diff
changeset
|
170 false, |
46736
2255e7eb39e5
rhg: Add support for --cwd
Simon Sapin <simon.sapin@octobus.net>
parents:
46734
diff
changeset
|
171 ) |
2255e7eb39e5
rhg: Add support for --cwd
Simon Sapin <simon.sapin@octobus.net>
parents:
46734
diff
changeset
|
172 }) |
2255e7eb39e5
rhg: Add support for --cwd
Simon Sapin <simon.sapin@octobus.net>
parents:
46734
diff
changeset
|
173 }); |
2255e7eb39e5
rhg: Add support for --cwd
Simon Sapin <simon.sapin@octobus.net>
parents:
46734
diff
changeset
|
174 |
47406
3237ed4dcda4
rhg: split non_repo_config and `--config` loading in different functions
Pulkit Goyal <7895pulkit@gmail.com>
parents:
47405
diff
changeset
|
175 let mut non_repo_config = |
3237ed4dcda4
rhg: split non_repo_config and `--config` loading in different functions
Pulkit Goyal <7895pulkit@gmail.com>
parents:
47405
diff
changeset
|
176 Config::load_non_repo().unwrap_or_else(|error| { |
46666
33f2d56acc73
rhg: Add a `rhg.on-unsupported` configuration key
Simon Sapin <simon.sapin@octobus.net>
parents:
46665
diff
changeset
|
177 // 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
|
178 // 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
|
179 // "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
|
180 let on_unsupported = OnUnsupported::Abort; |
33f2d56acc73
rhg: Add a `rhg.on-unsupported` configuration key
Simon Sapin <simon.sapin@octobus.net>
parents:
46665
diff
changeset
|
181 |
46820
821929d59e01
rhg: add support for detailed exit code for ConfigParseError
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46748
diff
changeset
|
182 exit( |
821929d59e01
rhg: add support for detailed exit code for ConfigParseError
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46748
diff
changeset
|
183 &initial_current_dir, |
48731
f591b377375f
rhg: Make Ui::new falliable, add Ui::new_infallible
Simon Sapin <simon.sapin@octobus.net>
parents:
48730
diff
changeset
|
184 &Ui::new_infallible(&Config::empty()), |
46820
821929d59e01
rhg: add support for detailed exit code for ConfigParseError
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46748
diff
changeset
|
185 on_unsupported, |
821929d59e01
rhg: add support for detailed exit code for ConfigParseError
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46748
diff
changeset
|
186 Err(error.into()), |
821929d59e01
rhg: add support for detailed exit code for ConfigParseError
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46748
diff
changeset
|
187 false, |
821929d59e01
rhg: add support for detailed exit code for ConfigParseError
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46748
diff
changeset
|
188 ) |
46666
33f2d56acc73
rhg: Add a `rhg.on-unsupported` configuration key
Simon Sapin <simon.sapin@octobus.net>
parents:
46665
diff
changeset
|
189 }); |
46665
7284b524b441
rhg: Make configuration available as early as possible in main()
Simon Sapin <simon.sapin@octobus.net>
parents:
46608
diff
changeset
|
190 |
47406
3237ed4dcda4
rhg: split non_repo_config and `--config` loading in different functions
Pulkit Goyal <7895pulkit@gmail.com>
parents:
47405
diff
changeset
|
191 non_repo_config |
48732
d4a5c2197208
rhg: Add parsing for the --color global CLI argument
Simon Sapin <simon.sapin@octobus.net>
parents:
48731
diff
changeset
|
192 .load_cli_args(early_args.config, early_args.color) |
47406
3237ed4dcda4
rhg: split non_repo_config and `--config` loading in different functions
Pulkit Goyal <7895pulkit@gmail.com>
parents:
47405
diff
changeset
|
193 .unwrap_or_else(|error| { |
3237ed4dcda4
rhg: split non_repo_config and `--config` loading in different functions
Pulkit Goyal <7895pulkit@gmail.com>
parents:
47405
diff
changeset
|
194 exit( |
3237ed4dcda4
rhg: split non_repo_config and `--config` loading in different functions
Pulkit Goyal <7895pulkit@gmail.com>
parents:
47405
diff
changeset
|
195 &initial_current_dir, |
48731
f591b377375f
rhg: Make Ui::new falliable, add Ui::new_infallible
Simon Sapin <simon.sapin@octobus.net>
parents:
48730
diff
changeset
|
196 &Ui::new_infallible(&non_repo_config), |
48353
8960295b9246
rhg: only complain about poorly configured fallback when falling back
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48340
diff
changeset
|
197 OnUnsupported::from_config(&non_repo_config), |
47406
3237ed4dcda4
rhg: split non_repo_config and `--config` loading in different functions
Pulkit Goyal <7895pulkit@gmail.com>
parents:
47405
diff
changeset
|
198 Err(error.into()), |
3237ed4dcda4
rhg: split non_repo_config and `--config` loading in different functions
Pulkit Goyal <7895pulkit@gmail.com>
parents:
47405
diff
changeset
|
199 non_repo_config |
3237ed4dcda4
rhg: split non_repo_config and `--config` loading in different functions
Pulkit Goyal <7895pulkit@gmail.com>
parents:
47405
diff
changeset
|
200 .get_bool(b"ui", b"detailed-exit-code") |
3237ed4dcda4
rhg: split non_repo_config and `--config` loading in different functions
Pulkit Goyal <7895pulkit@gmail.com>
parents:
47405
diff
changeset
|
201 .unwrap_or(false), |
3237ed4dcda4
rhg: split non_repo_config and `--config` loading in different functions
Pulkit Goyal <7895pulkit@gmail.com>
parents:
47405
diff
changeset
|
202 ) |
3237ed4dcda4
rhg: split non_repo_config and `--config` loading in different functions
Pulkit Goyal <7895pulkit@gmail.com>
parents:
47405
diff
changeset
|
203 }); |
3237ed4dcda4
rhg: split non_repo_config and `--config` loading in different functions
Pulkit Goyal <7895pulkit@gmail.com>
parents:
47405
diff
changeset
|
204 |
46729
6cd9f53aaed8
rhg: Fall back to Python on --repository with an URL
Simon Sapin <simon.sapin@octobus.net>
parents:
46667
diff
changeset
|
205 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
|
206 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
|
207 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
|
208 // 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
|
209 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
|
210 } |
6cd9f53aaed8
rhg: Fall back to Python on --repository with an URL
Simon Sapin <simon.sapin@octobus.net>
parents:
46667
diff
changeset
|
211 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
|
212 exit( |
46736
2255e7eb39e5
rhg: Add support for --cwd
Simon Sapin <simon.sapin@octobus.net>
parents:
46734
diff
changeset
|
213 &initial_current_dir, |
48731
f591b377375f
rhg: Make Ui::new falliable, add Ui::new_infallible
Simon Sapin <simon.sapin@octobus.net>
parents:
48730
diff
changeset
|
214 &Ui::new_infallible(&non_repo_config), |
48353
8960295b9246
rhg: only complain about poorly configured fallback when falling back
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48340
diff
changeset
|
215 OnUnsupported::from_config(&non_repo_config), |
46729
6cd9f53aaed8
rhg: Fall back to Python on --repository with an URL
Simon Sapin <simon.sapin@octobus.net>
parents:
46667
diff
changeset
|
216 Err(CommandError::UnsupportedFeature { |
6cd9f53aaed8
rhg: Fall back to Python on --repository with an URL
Simon Sapin <simon.sapin@octobus.net>
parents:
46667
diff
changeset
|
217 message: format_bytes!( |
6cd9f53aaed8
rhg: Fall back to Python on --repository with an URL
Simon Sapin <simon.sapin@octobus.net>
parents:
46667
diff
changeset
|
218 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
|
219 repo_path_bytes |
6cd9f53aaed8
rhg: Fall back to Python on --repository with an URL
Simon Sapin <simon.sapin@octobus.net>
parents:
46667
diff
changeset
|
220 ), |
6cd9f53aaed8
rhg: Fall back to Python on --repository with an URL
Simon Sapin <simon.sapin@octobus.net>
parents:
46667
diff
changeset
|
221 }), |
46820
821929d59e01
rhg: add support for detailed exit code for ConfigParseError
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46748
diff
changeset
|
222 // TODO: show a warning or combine with original error if |
821929d59e01
rhg: add support for detailed exit code for ConfigParseError
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46748
diff
changeset
|
223 // `get_bool` returns an error |
821929d59e01
rhg: add support for detailed exit code for ConfigParseError
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46748
diff
changeset
|
224 non_repo_config |
821929d59e01
rhg: add support for detailed exit code for ConfigParseError
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46748
diff
changeset
|
225 .get_bool(b"ui", b"detailed-exit-code") |
821929d59e01
rhg: add support for detailed exit code for ConfigParseError
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46748
diff
changeset
|
226 .unwrap_or(false), |
46729
6cd9f53aaed8
rhg: Fall back to Python on --repository with an URL
Simon Sapin <simon.sapin@octobus.net>
parents:
46667
diff
changeset
|
227 ) |
6cd9f53aaed8
rhg: Fall back to Python on --repository with an URL
Simon Sapin <simon.sapin@octobus.net>
parents:
46667
diff
changeset
|
228 } |
6cd9f53aaed8
rhg: Fall back to Python on --repository with an URL
Simon Sapin <simon.sapin@octobus.net>
parents:
46667
diff
changeset
|
229 } |
47404
ebdef6283798
rhg: read [paths] for `--repository` value
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46822
diff
changeset
|
230 let repo_arg = early_args.repo.unwrap_or(Vec::new()); |
ebdef6283798
rhg: read [paths] for `--repository` value
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46822
diff
changeset
|
231 let repo_path: Option<PathBuf> = { |
ebdef6283798
rhg: read [paths] for `--repository` value
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46822
diff
changeset
|
232 if repo_arg.is_empty() { |
ebdef6283798
rhg: read [paths] for `--repository` value
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46822
diff
changeset
|
233 None |
ebdef6283798
rhg: read [paths] for `--repository` value
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46822
diff
changeset
|
234 } else { |
ebdef6283798
rhg: read [paths] for `--repository` value
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46822
diff
changeset
|
235 let local_config = { |
ebdef6283798
rhg: read [paths] for `--repository` value
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46822
diff
changeset
|
236 if std::env::var_os("HGRCSKIPREPO").is_none() { |
47405
88119fffecc8
rhg: look for repository in ancestors also instead of cwd only
Pulkit Goyal <7895pulkit@gmail.com>
parents:
47404
diff
changeset
|
237 // TODO: handle errors from find_repo_root |
88119fffecc8
rhg: look for repository in ancestors also instead of cwd only
Pulkit Goyal <7895pulkit@gmail.com>
parents:
47404
diff
changeset
|
238 if let Ok(current_dir_path) = Repo::find_repo_root() { |
47404
ebdef6283798
rhg: read [paths] for `--repository` value
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46822
diff
changeset
|
239 let config_files = vec![ |
ebdef6283798
rhg: read [paths] for `--repository` value
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46822
diff
changeset
|
240 ConfigSource::AbsPath( |
ebdef6283798
rhg: read [paths] for `--repository` value
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46822
diff
changeset
|
241 current_dir_path.join(".hg/hgrc"), |
ebdef6283798
rhg: read [paths] for `--repository` value
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46822
diff
changeset
|
242 ), |
ebdef6283798
rhg: read [paths] for `--repository` value
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46822
diff
changeset
|
243 ConfigSource::AbsPath( |
ebdef6283798
rhg: read [paths] for `--repository` value
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46822
diff
changeset
|
244 current_dir_path.join(".hg/hgrc-not-shared"), |
ebdef6283798
rhg: read [paths] for `--repository` value
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46822
diff
changeset
|
245 ), |
ebdef6283798
rhg: read [paths] for `--repository` value
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46822
diff
changeset
|
246 ]; |
ebdef6283798
rhg: read [paths] for `--repository` value
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46822
diff
changeset
|
247 // TODO: handle errors from |
ebdef6283798
rhg: read [paths] for `--repository` value
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46822
diff
changeset
|
248 // `load_from_explicit_sources` |
ebdef6283798
rhg: read [paths] for `--repository` value
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46822
diff
changeset
|
249 Config::load_from_explicit_sources(config_files).ok() |
ebdef6283798
rhg: read [paths] for `--repository` value
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46822
diff
changeset
|
250 } else { |
ebdef6283798
rhg: read [paths] for `--repository` value
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46822
diff
changeset
|
251 None |
ebdef6283798
rhg: read [paths] for `--repository` value
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46822
diff
changeset
|
252 } |
ebdef6283798
rhg: read [paths] for `--repository` value
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46822
diff
changeset
|
253 } else { |
ebdef6283798
rhg: read [paths] for `--repository` value
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46822
diff
changeset
|
254 None |
ebdef6283798
rhg: read [paths] for `--repository` value
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46822
diff
changeset
|
255 } |
ebdef6283798
rhg: read [paths] for `--repository` value
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46822
diff
changeset
|
256 }; |
ebdef6283798
rhg: read [paths] for `--repository` value
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46822
diff
changeset
|
257 |
ebdef6283798
rhg: read [paths] for `--repository` value
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46822
diff
changeset
|
258 let non_repo_config_val = { |
ebdef6283798
rhg: read [paths] for `--repository` value
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46822
diff
changeset
|
259 let non_repo_val = non_repo_config.get(b"paths", &repo_arg); |
ebdef6283798
rhg: read [paths] for `--repository` value
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46822
diff
changeset
|
260 match &non_repo_val { |
ebdef6283798
rhg: read [paths] for `--repository` value
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46822
diff
changeset
|
261 Some(val) if val.len() > 0 => home::home_dir() |
ebdef6283798
rhg: read [paths] for `--repository` value
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46822
diff
changeset
|
262 .unwrap_or_else(|| PathBuf::from("~")) |
ebdef6283798
rhg: read [paths] for `--repository` value
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46822
diff
changeset
|
263 .join(get_path_from_bytes(val)) |
ebdef6283798
rhg: read [paths] for `--repository` value
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46822
diff
changeset
|
264 .canonicalize() |
ebdef6283798
rhg: read [paths] for `--repository` value
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46822
diff
changeset
|
265 // TODO: handle error and make it similar to python |
ebdef6283798
rhg: read [paths] for `--repository` value
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46822
diff
changeset
|
266 // implementation maybe? |
ebdef6283798
rhg: read [paths] for `--repository` value
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46822
diff
changeset
|
267 .ok(), |
ebdef6283798
rhg: read [paths] for `--repository` value
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46822
diff
changeset
|
268 _ => None, |
ebdef6283798
rhg: read [paths] for `--repository` value
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46822
diff
changeset
|
269 } |
ebdef6283798
rhg: read [paths] for `--repository` value
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46822
diff
changeset
|
270 }; |
ebdef6283798
rhg: read [paths] for `--repository` value
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46822
diff
changeset
|
271 |
ebdef6283798
rhg: read [paths] for `--repository` value
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46822
diff
changeset
|
272 let config_val = match &local_config { |
ebdef6283798
rhg: read [paths] for `--repository` value
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46822
diff
changeset
|
273 None => non_repo_config_val, |
ebdef6283798
rhg: read [paths] for `--repository` value
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46822
diff
changeset
|
274 Some(val) => { |
ebdef6283798
rhg: read [paths] for `--repository` value
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46822
diff
changeset
|
275 let local_config_val = val.get(b"paths", &repo_arg); |
ebdef6283798
rhg: read [paths] for `--repository` value
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46822
diff
changeset
|
276 match &local_config_val { |
ebdef6283798
rhg: read [paths] for `--repository` value
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46822
diff
changeset
|
277 Some(val) if val.len() > 0 => { |
ebdef6283798
rhg: read [paths] for `--repository` value
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46822
diff
changeset
|
278 // presence of a local_config assures that |
ebdef6283798
rhg: read [paths] for `--repository` value
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46822
diff
changeset
|
279 // current_dir |
ebdef6283798
rhg: read [paths] for `--repository` value
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46822
diff
changeset
|
280 // wont result in an Error |
ebdef6283798
rhg: read [paths] for `--repository` value
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46822
diff
changeset
|
281 let canpath = hg::utils::current_dir() |
ebdef6283798
rhg: read [paths] for `--repository` value
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46822
diff
changeset
|
282 .unwrap() |
ebdef6283798
rhg: read [paths] for `--repository` value
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46822
diff
changeset
|
283 .join(get_path_from_bytes(val)) |
ebdef6283798
rhg: read [paths] for `--repository` value
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46822
diff
changeset
|
284 .canonicalize(); |
ebdef6283798
rhg: read [paths] for `--repository` value
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46822
diff
changeset
|
285 canpath.ok().or(non_repo_config_val) |
ebdef6283798
rhg: read [paths] for `--repository` value
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46822
diff
changeset
|
286 } |
ebdef6283798
rhg: read [paths] for `--repository` value
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46822
diff
changeset
|
287 _ => non_repo_config_val, |
ebdef6283798
rhg: read [paths] for `--repository` value
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46822
diff
changeset
|
288 } |
ebdef6283798
rhg: read [paths] for `--repository` value
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46822
diff
changeset
|
289 } |
ebdef6283798
rhg: read [paths] for `--repository` value
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46822
diff
changeset
|
290 }; |
ebdef6283798
rhg: read [paths] for `--repository` value
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46822
diff
changeset
|
291 config_val.or(Some(get_path_from_bytes(&repo_arg).to_path_buf())) |
ebdef6283798
rhg: read [paths] for `--repository` value
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46822
diff
changeset
|
292 } |
ebdef6283798
rhg: read [paths] for `--repository` value
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46822
diff
changeset
|
293 }; |
ebdef6283798
rhg: read [paths] for `--repository` value
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46822
diff
changeset
|
294 |
ebdef6283798
rhg: read [paths] for `--repository` value
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46822
diff
changeset
|
295 let repo_result = match Repo::find(&non_repo_config, repo_path.to_owned()) |
ebdef6283798
rhg: read [paths] for `--repository` value
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46822
diff
changeset
|
296 { |
46665
7284b524b441
rhg: Make configuration available as early as possible in main()
Simon Sapin <simon.sapin@octobus.net>
parents:
46608
diff
changeset
|
297 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
|
298 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
|
299 // 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
|
300 Err(NoRepoInCwdError { cwd: at }) |
46601
755c31a1caf9
rhg: Add support for the blackbox extension
Simon Sapin <simon.sapin@octobus.net>
parents:
46596
diff
changeset
|
301 } |
46666
33f2d56acc73
rhg: Add a `rhg.on-unsupported` configuration key
Simon Sapin <simon.sapin@octobus.net>
parents:
46665
diff
changeset
|
302 Err(error) => exit( |
46736
2255e7eb39e5
rhg: Add support for --cwd
Simon Sapin <simon.sapin@octobus.net>
parents:
46734
diff
changeset
|
303 &initial_current_dir, |
48731
f591b377375f
rhg: Make Ui::new falliable, add Ui::new_infallible
Simon Sapin <simon.sapin@octobus.net>
parents:
48730
diff
changeset
|
304 &Ui::new_infallible(&non_repo_config), |
48353
8960295b9246
rhg: only complain about poorly configured fallback when falling back
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48340
diff
changeset
|
305 OnUnsupported::from_config(&non_repo_config), |
46666
33f2d56acc73
rhg: Add a `rhg.on-unsupported` configuration key
Simon Sapin <simon.sapin@octobus.net>
parents:
46665
diff
changeset
|
306 Err(error.into()), |
46820
821929d59e01
rhg: add support for detailed exit code for ConfigParseError
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46748
diff
changeset
|
307 // TODO: show a warning or combine with original error if |
821929d59e01
rhg: add support for detailed exit code for ConfigParseError
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46748
diff
changeset
|
308 // `get_bool` returns an error |
821929d59e01
rhg: add support for detailed exit code for ConfigParseError
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46748
diff
changeset
|
309 non_repo_config |
821929d59e01
rhg: add support for detailed exit code for ConfigParseError
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46748
diff
changeset
|
310 .get_bool(b"ui", b"detailed-exit-code") |
821929d59e01
rhg: add support for detailed exit code for ConfigParseError
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46748
diff
changeset
|
311 .unwrap_or(false), |
46666
33f2d56acc73
rhg: Add a `rhg.on-unsupported` configuration key
Simon Sapin <simon.sapin@octobus.net>
parents:
46665
diff
changeset
|
312 ), |
46665
7284b524b441
rhg: Make configuration available as early as possible in main()
Simon Sapin <simon.sapin@octobus.net>
parents:
46608
diff
changeset
|
313 }; |
7284b524b441
rhg: Make configuration available as early as possible in main()
Simon Sapin <simon.sapin@octobus.net>
parents:
46608
diff
changeset
|
314 |
7284b524b441
rhg: Make configuration available as early as possible in main()
Simon Sapin <simon.sapin@octobus.net>
parents:
46608
diff
changeset
|
315 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
|
316 repo.config() |
7284b524b441
rhg: Make configuration available as early as possible in main()
Simon Sapin <simon.sapin@octobus.net>
parents:
46608
diff
changeset
|
317 } else { |
7284b524b441
rhg: Make configuration available as early as possible in main()
Simon Sapin <simon.sapin@octobus.net>
parents:
46608
diff
changeset
|
318 &non_repo_config |
7284b524b441
rhg: Make configuration available as early as possible in main()
Simon Sapin <simon.sapin@octobus.net>
parents:
46608
diff
changeset
|
319 }; |
48731
f591b377375f
rhg: Make Ui::new falliable, add Ui::new_infallible
Simon Sapin <simon.sapin@octobus.net>
parents:
48730
diff
changeset
|
320 let ui = Ui::new(&config).unwrap_or_else(|error| { |
f591b377375f
rhg: Make Ui::new falliable, add Ui::new_infallible
Simon Sapin <simon.sapin@octobus.net>
parents:
48730
diff
changeset
|
321 exit( |
f591b377375f
rhg: Make Ui::new falliable, add Ui::new_infallible
Simon Sapin <simon.sapin@octobus.net>
parents:
48730
diff
changeset
|
322 &initial_current_dir, |
f591b377375f
rhg: Make Ui::new falliable, add Ui::new_infallible
Simon Sapin <simon.sapin@octobus.net>
parents:
48730
diff
changeset
|
323 &Ui::new_infallible(&config), |
f591b377375f
rhg: Make Ui::new falliable, add Ui::new_infallible
Simon Sapin <simon.sapin@octobus.net>
parents:
48730
diff
changeset
|
324 OnUnsupported::from_config(&config), |
f591b377375f
rhg: Make Ui::new falliable, add Ui::new_infallible
Simon Sapin <simon.sapin@octobus.net>
parents:
48730
diff
changeset
|
325 Err(error.into()), |
f591b377375f
rhg: Make Ui::new falliable, add Ui::new_infallible
Simon Sapin <simon.sapin@octobus.net>
parents:
48730
diff
changeset
|
326 config |
f591b377375f
rhg: Make Ui::new falliable, add Ui::new_infallible
Simon Sapin <simon.sapin@octobus.net>
parents:
48730
diff
changeset
|
327 .get_bool(b"ui", b"detailed-exit-code") |
f591b377375f
rhg: Make Ui::new falliable, add Ui::new_infallible
Simon Sapin <simon.sapin@octobus.net>
parents:
48730
diff
changeset
|
328 .unwrap_or(false), |
f591b377375f
rhg: Make Ui::new falliable, add Ui::new_infallible
Simon Sapin <simon.sapin@octobus.net>
parents:
48730
diff
changeset
|
329 ) |
f591b377375f
rhg: Make Ui::new falliable, add Ui::new_infallible
Simon Sapin <simon.sapin@octobus.net>
parents:
48730
diff
changeset
|
330 }); |
48353
8960295b9246
rhg: only complain about poorly configured fallback when falling back
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48340
diff
changeset
|
331 let on_unsupported = OnUnsupported::from_config(config); |
46665
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 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
|
334 &process_start_time, |
7284b524b441
rhg: Make configuration available as early as possible in main()
Simon Sapin <simon.sapin@octobus.net>
parents:
46608
diff
changeset
|
335 &ui, |
7284b524b441
rhg: Make configuration available as early as possible in main()
Simon Sapin <simon.sapin@octobus.net>
parents:
46608
diff
changeset
|
336 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
|
337 config, |
7284b524b441
rhg: Make configuration available as early as possible in main()
Simon Sapin <simon.sapin@octobus.net>
parents:
46608
diff
changeset
|
338 ); |
46820
821929d59e01
rhg: add support for detailed exit code for ConfigParseError
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46748
diff
changeset
|
339 exit( |
821929d59e01
rhg: add support for detailed exit code for ConfigParseError
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46748
diff
changeset
|
340 &initial_current_dir, |
821929d59e01
rhg: add support for detailed exit code for ConfigParseError
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46748
diff
changeset
|
341 &ui, |
821929d59e01
rhg: add support for detailed exit code for ConfigParseError
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46748
diff
changeset
|
342 on_unsupported, |
821929d59e01
rhg: add support for detailed exit code for ConfigParseError
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46748
diff
changeset
|
343 result, |
821929d59e01
rhg: add support for detailed exit code for ConfigParseError
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46748
diff
changeset
|
344 // TODO: show a warning or combine with original error if `get_bool` |
821929d59e01
rhg: add support for detailed exit code for ConfigParseError
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46748
diff
changeset
|
345 // returns an error |
821929d59e01
rhg: add support for detailed exit code for ConfigParseError
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46748
diff
changeset
|
346 config |
821929d59e01
rhg: add support for detailed exit code for ConfigParseError
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46748
diff
changeset
|
347 .get_bool(b"ui", b"detailed-exit-code") |
821929d59e01
rhg: add support for detailed exit code for ConfigParseError
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46748
diff
changeset
|
348 .unwrap_or(false), |
821929d59e01
rhg: add support for detailed exit code for ConfigParseError
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46748
diff
changeset
|
349 ) |
46601
755c31a1caf9
rhg: Add support for the blackbox extension
Simon Sapin <simon.sapin@octobus.net>
parents:
46596
diff
changeset
|
350 } |
755c31a1caf9
rhg: Add support for the blackbox extension
Simon Sapin <simon.sapin@octobus.net>
parents:
46596
diff
changeset
|
351 |
46820
821929d59e01
rhg: add support for detailed exit code for ConfigParseError
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46748
diff
changeset
|
352 fn exit_code( |
821929d59e01
rhg: add support for detailed exit code for ConfigParseError
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46748
diff
changeset
|
353 result: &Result<(), CommandError>, |
821929d59e01
rhg: add support for detailed exit code for ConfigParseError
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46748
diff
changeset
|
354 use_detailed_exit_code: bool, |
821929d59e01
rhg: add support for detailed exit code for ConfigParseError
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46748
diff
changeset
|
355 ) -> i32 { |
46601
755c31a1caf9
rhg: Add support for the blackbox extension
Simon Sapin <simon.sapin@octobus.net>
parents:
46596
diff
changeset
|
356 match result { |
47407
6e49769b7f97
rhg: add exit code to HgError::Abort()
Pulkit Goyal <7895pulkit@gmail.com>
parents:
47406
diff
changeset
|
357 Ok(()) => exit_codes::OK, |
46820
821929d59e01
rhg: add support for detailed exit code for ConfigParseError
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46748
diff
changeset
|
358 Err(CommandError::Abort { |
821929d59e01
rhg: add support for detailed exit code for ConfigParseError
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46748
diff
changeset
|
359 message: _, |
821929d59e01
rhg: add support for detailed exit code for ConfigParseError
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46748
diff
changeset
|
360 detailed_exit_code, |
821929d59e01
rhg: add support for detailed exit code for ConfigParseError
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46748
diff
changeset
|
361 }) => { |
821929d59e01
rhg: add support for detailed exit code for ConfigParseError
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46748
diff
changeset
|
362 if use_detailed_exit_code { |
821929d59e01
rhg: add support for detailed exit code for ConfigParseError
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46748
diff
changeset
|
363 *detailed_exit_code |
821929d59e01
rhg: add support for detailed exit code for ConfigParseError
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46748
diff
changeset
|
364 } else { |
47407
6e49769b7f97
rhg: add exit code to HgError::Abort()
Pulkit Goyal <7895pulkit@gmail.com>
parents:
47406
diff
changeset
|
365 exit_codes::ABORT |
46820
821929d59e01
rhg: add support for detailed exit code for ConfigParseError
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46748
diff
changeset
|
366 } |
821929d59e01
rhg: add support for detailed exit code for ConfigParseError
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46748
diff
changeset
|
367 } |
47407
6e49769b7f97
rhg: add exit code to HgError::Abort()
Pulkit Goyal <7895pulkit@gmail.com>
parents:
47406
diff
changeset
|
368 Err(CommandError::Unsuccessful) => exit_codes::UNSUCCESSFUL, |
46445
ca3f73cc3cf4
rhg: Simplify CommandError based on its use
Simon Sapin <simon.sapin@octobus.net>
parents:
45923
diff
changeset
|
369 // 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
|
370 // 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
|
371 Err(CommandError::UnsupportedFeature { .. }) => { |
47407
6e49769b7f97
rhg: add exit code to HgError::Abort()
Pulkit Goyal <7895pulkit@gmail.com>
parents:
47406
diff
changeset
|
372 exit_codes::UNIMPLEMENTED |
46666
33f2d56acc73
rhg: Add a `rhg.on-unsupported` configuration key
Simon Sapin <simon.sapin@octobus.net>
parents:
46665
diff
changeset
|
373 } |
49149
006688e36e12
rhg: use `Command::exec` instead of `Command::status`
Raphaël Gomès <rgomes@octobus.net>
parents:
48770
diff
changeset
|
374 Err(CommandError::InvalidFallback { .. }) => { |
006688e36e12
rhg: use `Command::exec` instead of `Command::status`
Raphaël Gomès <rgomes@octobus.net>
parents:
48770
diff
changeset
|
375 exit_codes::INVALID_FALLBACK |
006688e36e12
rhg: use `Command::exec` instead of `Command::status`
Raphaël Gomès <rgomes@octobus.net>
parents:
48770
diff
changeset
|
376 } |
46601
755c31a1caf9
rhg: Add support for the blackbox extension
Simon Sapin <simon.sapin@octobus.net>
parents:
46596
diff
changeset
|
377 } |
44981 | 378 } |
45529
f17caf8f3fef
rhg: add a limited `rhg debugdata` subcommand
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45440
diff
changeset
|
379 |
46666
33f2d56acc73
rhg: Add a `rhg.on-unsupported` configuration key
Simon Sapin <simon.sapin@octobus.net>
parents:
46665
diff
changeset
|
380 fn exit( |
46736
2255e7eb39e5
rhg: Add support for --cwd
Simon Sapin <simon.sapin@octobus.net>
parents:
46734
diff
changeset
|
381 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
|
382 ui: &Ui, |
46667
93e9f448273c
rhg: Add support for automatic fallback to Python
Simon Sapin <simon.sapin@octobus.net>
parents:
46666
diff
changeset
|
383 mut on_unsupported: OnUnsupported, |
46666
33f2d56acc73
rhg: Add a `rhg.on-unsupported` configuration key
Simon Sapin <simon.sapin@octobus.net>
parents:
46665
diff
changeset
|
384 result: Result<(), CommandError>, |
46820
821929d59e01
rhg: add support for detailed exit code for ConfigParseError
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46748
diff
changeset
|
385 use_detailed_exit_code: bool, |
46666
33f2d56acc73
rhg: Add a `rhg.on-unsupported` configuration key
Simon Sapin <simon.sapin@octobus.net>
parents:
46665
diff
changeset
|
386 ) -> ! { |
46667
93e9f448273c
rhg: Add support for automatic fallback to Python
Simon Sapin <simon.sapin@octobus.net>
parents:
46666
diff
changeset
|
387 if let ( |
93e9f448273c
rhg: Add support for automatic fallback to Python
Simon Sapin <simon.sapin@octobus.net>
parents:
46666
diff
changeset
|
388 OnUnsupported::Fallback { executable }, |
48770
f19be290756a
rhg: signal when falling back in logs
Raphaël Gomès <rgomes@octobus.net>
parents:
48734
diff
changeset
|
389 Err(CommandError::UnsupportedFeature { message }), |
46667
93e9f448273c
rhg: Add support for automatic fallback to Python
Simon Sapin <simon.sapin@octobus.net>
parents:
46666
diff
changeset
|
390 ) = (&on_unsupported, &result) |
93e9f448273c
rhg: Add support for automatic fallback to Python
Simon Sapin <simon.sapin@octobus.net>
parents:
46666
diff
changeset
|
391 { |
93e9f448273c
rhg: Add support for automatic fallback to Python
Simon Sapin <simon.sapin@octobus.net>
parents:
46666
diff
changeset
|
392 let mut args = std::env::args_os(); |
48353
8960295b9246
rhg: only complain about poorly configured fallback when falling back
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48340
diff
changeset
|
393 let executable = match executable { |
8960295b9246
rhg: only complain about poorly configured fallback when falling back
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48340
diff
changeset
|
394 None => { |
8960295b9246
rhg: only complain about poorly configured fallback when falling back
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48340
diff
changeset
|
395 exit_no_fallback( |
8960295b9246
rhg: only complain about poorly configured fallback when falling back
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48340
diff
changeset
|
396 ui, |
8960295b9246
rhg: only complain about poorly configured fallback when falling back
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48340
diff
changeset
|
397 OnUnsupported::Abort, |
8960295b9246
rhg: only complain about poorly configured fallback when falling back
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48340
diff
changeset
|
398 Err(CommandError::abort( |
8960295b9246
rhg: only complain about poorly configured fallback when falling back
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48340
diff
changeset
|
399 "abort: 'rhg.on-unsupported=fallback' without \ |
8960295b9246
rhg: only complain about poorly configured fallback when falling back
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48340
diff
changeset
|
400 'rhg.fallback-executable' set.", |
8960295b9246
rhg: only complain about poorly configured fallback when falling back
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48340
diff
changeset
|
401 )), |
8960295b9246
rhg: only complain about poorly configured fallback when falling back
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48340
diff
changeset
|
402 false, |
8960295b9246
rhg: only complain about poorly configured fallback when falling back
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48340
diff
changeset
|
403 ); |
8960295b9246
rhg: only complain about poorly configured fallback when falling back
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48340
diff
changeset
|
404 } |
8960295b9246
rhg: only complain about poorly configured fallback when falling back
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48340
diff
changeset
|
405 Some(executable) => executable, |
8960295b9246
rhg: only complain about poorly configured fallback when falling back
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48340
diff
changeset
|
406 }; |
46667
93e9f448273c
rhg: Add support for automatic fallback to Python
Simon Sapin <simon.sapin@octobus.net>
parents:
46666
diff
changeset
|
407 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
|
408 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
|
409 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
|
410 // 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
|
411 // exhaustion. |
93e9f448273c
rhg: Add support for automatic fallback to Python
Simon Sapin <simon.sapin@octobus.net>
parents:
46666
diff
changeset
|
412 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
|
413 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
|
414 points to `rhg` itself.\n", |
93e9f448273c
rhg: Add support for automatic fallback to Python
Simon Sapin <simon.sapin@octobus.net>
parents:
46666
diff
changeset
|
415 executable |
93e9f448273c
rhg: Add support for automatic fallback to Python
Simon Sapin <simon.sapin@octobus.net>
parents:
46666
diff
changeset
|
416 )); |
93e9f448273c
rhg: Add support for automatic fallback to Python
Simon Sapin <simon.sapin@octobus.net>
parents:
46666
diff
changeset
|
417 on_unsupported = OnUnsupported::Abort |
93e9f448273c
rhg: Add support for automatic fallback to Python
Simon Sapin <simon.sapin@octobus.net>
parents:
46666
diff
changeset
|
418 } else { |
48770
f19be290756a
rhg: signal when falling back in logs
Raphaël Gomès <rgomes@octobus.net>
parents:
48734
diff
changeset
|
419 log::debug!("falling back (see trace-level log)"); |
f19be290756a
rhg: signal when falling back in logs
Raphaël Gomès <rgomes@octobus.net>
parents:
48734
diff
changeset
|
420 log::trace!("{}", local_to_utf8(message)); |
49149
006688e36e12
rhg: use `Command::exec` instead of `Command::status`
Raphaël Gomès <rgomes@octobus.net>
parents:
48770
diff
changeset
|
421 if let Err(err) = which::which(executable_path) { |
006688e36e12
rhg: use `Command::exec` instead of `Command::status`
Raphaël Gomès <rgomes@octobus.net>
parents:
48770
diff
changeset
|
422 exit_no_fallback( |
006688e36e12
rhg: use `Command::exec` instead of `Command::status`
Raphaël Gomès <rgomes@octobus.net>
parents:
48770
diff
changeset
|
423 ui, |
006688e36e12
rhg: use `Command::exec` instead of `Command::status`
Raphaël Gomès <rgomes@octobus.net>
parents:
48770
diff
changeset
|
424 OnUnsupported::Abort, |
006688e36e12
rhg: use `Command::exec` instead of `Command::status`
Raphaël Gomès <rgomes@octobus.net>
parents:
48770
diff
changeset
|
425 Err(CommandError::InvalidFallback { |
006688e36e12
rhg: use `Command::exec` instead of `Command::status`
Raphaël Gomès <rgomes@octobus.net>
parents:
48770
diff
changeset
|
426 path: executable.to_owned(), |
006688e36e12
rhg: use `Command::exec` instead of `Command::status`
Raphaël Gomès <rgomes@octobus.net>
parents:
48770
diff
changeset
|
427 err: err.to_string(), |
006688e36e12
rhg: use `Command::exec` instead of `Command::status`
Raphaël Gomès <rgomes@octobus.net>
parents:
48770
diff
changeset
|
428 }), |
006688e36e12
rhg: use `Command::exec` instead of `Command::status`
Raphaël Gomès <rgomes@octobus.net>
parents:
48770
diff
changeset
|
429 use_detailed_exit_code, |
006688e36e12
rhg: use `Command::exec` instead of `Command::status`
Raphaël Gomès <rgomes@octobus.net>
parents:
48770
diff
changeset
|
430 ) |
006688e36e12
rhg: use `Command::exec` instead of `Command::status`
Raphaël Gomès <rgomes@octobus.net>
parents:
48770
diff
changeset
|
431 } |
48353
8960295b9246
rhg: only complain about poorly configured fallback when falling back
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48340
diff
changeset
|
432 // `args` is now `argv[1..]` since we’ve already consumed |
8960295b9246
rhg: only complain about poorly configured fallback when falling back
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48340
diff
changeset
|
433 // `argv[0]` |
46736
2255e7eb39e5
rhg: Add support for --cwd
Simon Sapin <simon.sapin@octobus.net>
parents:
46734
diff
changeset
|
434 let mut command = Command::new(executable_path); |
2255e7eb39e5
rhg: Add support for --cwd
Simon Sapin <simon.sapin@octobus.net>
parents:
46734
diff
changeset
|
435 command.args(args); |
2255e7eb39e5
rhg: Add support for --cwd
Simon Sapin <simon.sapin@octobus.net>
parents:
46734
diff
changeset
|
436 if let Some(initial) = initial_current_dir { |
2255e7eb39e5
rhg: Add support for --cwd
Simon Sapin <simon.sapin@octobus.net>
parents:
46734
diff
changeset
|
437 command.current_dir(initial); |
2255e7eb39e5
rhg: Add support for --cwd
Simon Sapin <simon.sapin@octobus.net>
parents:
46734
diff
changeset
|
438 } |
49149
006688e36e12
rhg: use `Command::exec` instead of `Command::status`
Raphaël Gomès <rgomes@octobus.net>
parents:
48770
diff
changeset
|
439 // We don't use subprocess because proper signal handling is harder |
006688e36e12
rhg: use `Command::exec` instead of `Command::status`
Raphaël Gomès <rgomes@octobus.net>
parents:
48770
diff
changeset
|
440 // and we don't want to keep `rhg` around after a fallback anyway. |
006688e36e12
rhg: use `Command::exec` instead of `Command::status`
Raphaël Gomès <rgomes@octobus.net>
parents:
48770
diff
changeset
|
441 // For example, if `rhg` is run in the background and falls back to |
006688e36e12
rhg: use `Command::exec` instead of `Command::status`
Raphaël Gomès <rgomes@octobus.net>
parents:
48770
diff
changeset
|
442 // `hg` which, in turn, waits for a signal, we'll get stuck if |
006688e36e12
rhg: use `Command::exec` instead of `Command::status`
Raphaël Gomès <rgomes@octobus.net>
parents:
48770
diff
changeset
|
443 // we're doing plain subprocess. |
006688e36e12
rhg: use `Command::exec` instead of `Command::status`
Raphaël Gomès <rgomes@octobus.net>
parents:
48770
diff
changeset
|
444 // |
006688e36e12
rhg: use `Command::exec` instead of `Command::status`
Raphaël Gomès <rgomes@octobus.net>
parents:
48770
diff
changeset
|
445 // If `exec` returns, we can only assume our process is very broken |
006688e36e12
rhg: use `Command::exec` instead of `Command::status`
Raphaël Gomès <rgomes@octobus.net>
parents:
48770
diff
changeset
|
446 // (see its documentation), so only try to forward the error code |
006688e36e12
rhg: use `Command::exec` instead of `Command::status`
Raphaël Gomès <rgomes@octobus.net>
parents:
48770
diff
changeset
|
447 // when exiting. |
006688e36e12
rhg: use `Command::exec` instead of `Command::status`
Raphaël Gomès <rgomes@octobus.net>
parents:
48770
diff
changeset
|
448 let err = command.exec(); |
006688e36e12
rhg: use `Command::exec` instead of `Command::status`
Raphaël Gomès <rgomes@octobus.net>
parents:
48770
diff
changeset
|
449 std::process::exit( |
006688e36e12
rhg: use `Command::exec` instead of `Command::status`
Raphaël Gomès <rgomes@octobus.net>
parents:
48770
diff
changeset
|
450 err.raw_os_error().unwrap_or(exit_codes::ABORT), |
006688e36e12
rhg: use `Command::exec` instead of `Command::status`
Raphaël Gomès <rgomes@octobus.net>
parents:
48770
diff
changeset
|
451 ); |
46667
93e9f448273c
rhg: Add support for automatic fallback to Python
Simon Sapin <simon.sapin@octobus.net>
parents:
46666
diff
changeset
|
452 } |
93e9f448273c
rhg: Add support for automatic fallback to Python
Simon Sapin <simon.sapin@octobus.net>
parents:
46666
diff
changeset
|
453 } |
46820
821929d59e01
rhg: add support for detailed exit code for ConfigParseError
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46748
diff
changeset
|
454 exit_no_fallback(ui, on_unsupported, result, use_detailed_exit_code) |
46748
bde90e9b4507
rhg: Remove `rhg.fallback-executable=hg` default configuration
Simon Sapin <simon.sapin@octobus.net>
parents:
46746
diff
changeset
|
455 } |
bde90e9b4507
rhg: Remove `rhg.fallback-executable=hg` default configuration
Simon Sapin <simon.sapin@octobus.net>
parents:
46746
diff
changeset
|
456 |
bde90e9b4507
rhg: Remove `rhg.fallback-executable=hg` default configuration
Simon Sapin <simon.sapin@octobus.net>
parents:
46746
diff
changeset
|
457 fn exit_no_fallback( |
bde90e9b4507
rhg: Remove `rhg.fallback-executable=hg` default configuration
Simon Sapin <simon.sapin@octobus.net>
parents:
46746
diff
changeset
|
458 ui: &Ui, |
bde90e9b4507
rhg: Remove `rhg.fallback-executable=hg` default configuration
Simon Sapin <simon.sapin@octobus.net>
parents:
46746
diff
changeset
|
459 on_unsupported: OnUnsupported, |
bde90e9b4507
rhg: Remove `rhg.fallback-executable=hg` default configuration
Simon Sapin <simon.sapin@octobus.net>
parents:
46746
diff
changeset
|
460 result: Result<(), CommandError>, |
46820
821929d59e01
rhg: add support for detailed exit code for ConfigParseError
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46748
diff
changeset
|
461 use_detailed_exit_code: bool, |
46748
bde90e9b4507
rhg: Remove `rhg.fallback-executable=hg` default configuration
Simon Sapin <simon.sapin@octobus.net>
parents:
46746
diff
changeset
|
462 ) -> ! { |
46666
33f2d56acc73
rhg: Add a `rhg.on-unsupported` configuration key
Simon Sapin <simon.sapin@octobus.net>
parents:
46665
diff
changeset
|
463 match &result { |
33f2d56acc73
rhg: Add a `rhg.on-unsupported` configuration key
Simon Sapin <simon.sapin@octobus.net>
parents:
46665
diff
changeset
|
464 Ok(_) => {} |
46744
b1f2c2b336ec
rhg: `cat` command: print error messages for missing files
Simon Sapin <simon.sapin@octobus.net>
parents:
46736
diff
changeset
|
465 Err(CommandError::Unsuccessful) => {} |
46820
821929d59e01
rhg: add support for detailed exit code for ConfigParseError
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46748
diff
changeset
|
466 Err(CommandError::Abort { |
821929d59e01
rhg: add support for detailed exit code for ConfigParseError
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46748
diff
changeset
|
467 message, |
821929d59e01
rhg: add support for detailed exit code for ConfigParseError
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46748
diff
changeset
|
468 detailed_exit_code: _, |
821929d59e01
rhg: add support for detailed exit code for ConfigParseError
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46748
diff
changeset
|
469 }) => { |
46666
33f2d56acc73
rhg: Add a `rhg.on-unsupported` configuration key
Simon Sapin <simon.sapin@octobus.net>
parents:
46665
diff
changeset
|
470 if !message.is_empty() { |
33f2d56acc73
rhg: Add a `rhg.on-unsupported` configuration key
Simon Sapin <simon.sapin@octobus.net>
parents:
46665
diff
changeset
|
471 // 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
|
472 // 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
|
473 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
|
474 } |
33f2d56acc73
rhg: Add a `rhg.on-unsupported` configuration key
Simon Sapin <simon.sapin@octobus.net>
parents:
46665
diff
changeset
|
475 } |
33f2d56acc73
rhg: Add a `rhg.on-unsupported` configuration key
Simon Sapin <simon.sapin@octobus.net>
parents:
46665
diff
changeset
|
476 Err(CommandError::UnsupportedFeature { message }) => { |
33f2d56acc73
rhg: Add a `rhg.on-unsupported` configuration key
Simon Sapin <simon.sapin@octobus.net>
parents:
46665
diff
changeset
|
477 match on_unsupported { |
33f2d56acc73
rhg: Add a `rhg.on-unsupported` configuration key
Simon Sapin <simon.sapin@octobus.net>
parents:
46665
diff
changeset
|
478 OnUnsupported::Abort => { |
33f2d56acc73
rhg: Add a `rhg.on-unsupported` configuration key
Simon Sapin <simon.sapin@octobus.net>
parents:
46665
diff
changeset
|
479 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
|
480 b"unsupported feature: {}\n", |
33f2d56acc73
rhg: Add a `rhg.on-unsupported` configuration key
Simon Sapin <simon.sapin@octobus.net>
parents:
46665
diff
changeset
|
481 message |
33f2d56acc73
rhg: Add a `rhg.on-unsupported` configuration key
Simon Sapin <simon.sapin@octobus.net>
parents:
46665
diff
changeset
|
482 )); |
33f2d56acc73
rhg: Add a `rhg.on-unsupported` configuration key
Simon Sapin <simon.sapin@octobus.net>
parents:
46665
diff
changeset
|
483 } |
33f2d56acc73
rhg: Add a `rhg.on-unsupported` configuration key
Simon Sapin <simon.sapin@octobus.net>
parents:
46665
diff
changeset
|
484 OnUnsupported::AbortSilent => {} |
46667
93e9f448273c
rhg: Add support for automatic fallback to Python
Simon Sapin <simon.sapin@octobus.net>
parents:
46666
diff
changeset
|
485 OnUnsupported::Fallback { .. } => unreachable!(), |
46666
33f2d56acc73
rhg: Add a `rhg.on-unsupported` configuration key
Simon Sapin <simon.sapin@octobus.net>
parents:
46665
diff
changeset
|
486 } |
46665
7284b524b441
rhg: Make configuration available as early as possible in main()
Simon Sapin <simon.sapin@octobus.net>
parents:
46608
diff
changeset
|
487 } |
49149
006688e36e12
rhg: use `Command::exec` instead of `Command::status`
Raphaël Gomès <rgomes@octobus.net>
parents:
48770
diff
changeset
|
488 Err(CommandError::InvalidFallback { path, err }) => { |
006688e36e12
rhg: use `Command::exec` instead of `Command::status`
Raphaël Gomès <rgomes@octobus.net>
parents:
48770
diff
changeset
|
489 let _ = ui.write_stderr(&format_bytes!( |
006688e36e12
rhg: use `Command::exec` instead of `Command::status`
Raphaël Gomès <rgomes@octobus.net>
parents:
48770
diff
changeset
|
490 b"abort: invalid fallback '{}': {}\n", |
006688e36e12
rhg: use `Command::exec` instead of `Command::status`
Raphaël Gomès <rgomes@octobus.net>
parents:
48770
diff
changeset
|
491 path, |
006688e36e12
rhg: use `Command::exec` instead of `Command::status`
Raphaël Gomès <rgomes@octobus.net>
parents:
48770
diff
changeset
|
492 err.as_bytes(), |
006688e36e12
rhg: use `Command::exec` instead of `Command::status`
Raphaël Gomès <rgomes@octobus.net>
parents:
48770
diff
changeset
|
493 )); |
006688e36e12
rhg: use `Command::exec` instead of `Command::status`
Raphaël Gomès <rgomes@octobus.net>
parents:
48770
diff
changeset
|
494 } |
46665
7284b524b441
rhg: Make configuration available as early as possible in main()
Simon Sapin <simon.sapin@octobus.net>
parents:
46608
diff
changeset
|
495 } |
46820
821929d59e01
rhg: add support for detailed exit code for ConfigParseError
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46748
diff
changeset
|
496 std::process::exit(exit_code(&result, use_detailed_exit_code)) |
46665
7284b524b441
rhg: Make configuration available as early as possible in main()
Simon Sapin <simon.sapin@octobus.net>
parents:
46608
diff
changeset
|
497 } |
7284b524b441
rhg: Make configuration available as early as possible in main()
Simon Sapin <simon.sapin@octobus.net>
parents:
46608
diff
changeset
|
498 |
46502
95d37db31479
rhg: Replace subcommand boilerplate with a macro
Simon Sapin <simon.sapin@octobus.net>
parents:
46501
diff
changeset
|
499 macro_rules! subcommands { |
95d37db31479
rhg: Replace subcommand boilerplate with a macro
Simon Sapin <simon.sapin@octobus.net>
parents:
46501
diff
changeset
|
500 ($( $command: ident )+) => { |
95d37db31479
rhg: Replace subcommand boilerplate with a macro
Simon Sapin <simon.sapin@octobus.net>
parents:
46501
diff
changeset
|
501 mod commands { |
95d37db31479
rhg: Replace subcommand boilerplate with a macro
Simon Sapin <simon.sapin@octobus.net>
parents:
46501
diff
changeset
|
502 $( |
95d37db31479
rhg: Replace subcommand boilerplate with a macro
Simon Sapin <simon.sapin@octobus.net>
parents:
46501
diff
changeset
|
503 pub mod $command; |
95d37db31479
rhg: Replace subcommand boilerplate with a macro
Simon Sapin <simon.sapin@octobus.net>
parents:
46501
diff
changeset
|
504 )+ |
95d37db31479
rhg: Replace subcommand boilerplate with a macro
Simon Sapin <simon.sapin@octobus.net>
parents:
46501
diff
changeset
|
505 } |
95d37db31479
rhg: Replace subcommand boilerplate with a macro
Simon Sapin <simon.sapin@octobus.net>
parents:
46501
diff
changeset
|
506 |
95d37db31479
rhg: Replace subcommand boilerplate with a macro
Simon Sapin <simon.sapin@octobus.net>
parents:
46501
diff
changeset
|
507 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
|
508 app |
95d37db31479
rhg: Replace subcommand boilerplate with a macro
Simon Sapin <simon.sapin@octobus.net>
parents:
46501
diff
changeset
|
509 $( |
46608
4e4c70401028
rhg: Use clap’s support for global CLI arguments
Simon Sapin <simon.sapin@octobus.net>
parents:
46601
diff
changeset
|
510 .subcommand(commands::$command::args()) |
46502
95d37db31479
rhg: Replace subcommand boilerplate with a macro
Simon Sapin <simon.sapin@octobus.net>
parents:
46501
diff
changeset
|
511 )+ |
95d37db31479
rhg: Replace subcommand boilerplate with a macro
Simon Sapin <simon.sapin@octobus.net>
parents:
46501
diff
changeset
|
512 } |
46484
a6e4e4650bac
rhg: Parse system and user configuration at program start
Simon Sapin <simon.sapin@octobus.net>
parents:
46445
diff
changeset
|
513 |
46592
80840b651721
rhg: Group values passed to every sub-command into a struct
Simon Sapin <simon.sapin@octobus.net>
parents:
46591
diff
changeset
|
514 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
|
515 |
80840b651721
rhg: Group values passed to every sub-command into a struct
Simon Sapin <simon.sapin@octobus.net>
parents:
46591
diff
changeset
|
516 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
|
517 match name { |
95d37db31479
rhg: Replace subcommand boilerplate with a macro
Simon Sapin <simon.sapin@octobus.net>
parents:
46501
diff
changeset
|
518 $( |
95d37db31479
rhg: Replace subcommand boilerplate with a macro
Simon Sapin <simon.sapin@octobus.net>
parents:
46501
diff
changeset
|
519 stringify!($command) => Some(commands::$command::run), |
95d37db31479
rhg: Replace subcommand boilerplate with a macro
Simon Sapin <simon.sapin@octobus.net>
parents:
46501
diff
changeset
|
520 )+ |
95d37db31479
rhg: Replace subcommand boilerplate with a macro
Simon Sapin <simon.sapin@octobus.net>
parents:
46501
diff
changeset
|
521 _ => None, |
95d37db31479
rhg: Replace subcommand boilerplate with a macro
Simon Sapin <simon.sapin@octobus.net>
parents:
46501
diff
changeset
|
522 } |
45542
33ded2d3f4fc
rhg: add a limited `rhg cat -r` subcommand
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45537
diff
changeset
|
523 } |
46502
95d37db31479
rhg: Replace subcommand boilerplate with a macro
Simon Sapin <simon.sapin@octobus.net>
parents:
46501
diff
changeset
|
524 }; |
45529
f17caf8f3fef
rhg: add a limited `rhg debugdata` subcommand
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45440
diff
changeset
|
525 } |
46502
95d37db31479
rhg: Replace subcommand boilerplate with a macro
Simon Sapin <simon.sapin@octobus.net>
parents:
46501
diff
changeset
|
526 |
95d37db31479
rhg: Replace subcommand boilerplate with a macro
Simon Sapin <simon.sapin@octobus.net>
parents:
46501
diff
changeset
|
527 subcommands! { |
95d37db31479
rhg: Replace subcommand boilerplate with a macro
Simon Sapin <simon.sapin@octobus.net>
parents:
46501
diff
changeset
|
528 cat |
95d37db31479
rhg: Replace subcommand boilerplate with a macro
Simon Sapin <simon.sapin@octobus.net>
parents:
46501
diff
changeset
|
529 debugdata |
95d37db31479
rhg: Replace subcommand boilerplate with a macro
Simon Sapin <simon.sapin@octobus.net>
parents:
46501
diff
changeset
|
530 debugrequirements |
48355
6d4daf51283c
rhg: implement the debugignorerhg subcommand
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48353
diff
changeset
|
531 debugignorerhg |
46502
95d37db31479
rhg: Replace subcommand boilerplate with a macro
Simon Sapin <simon.sapin@octobus.net>
parents:
46501
diff
changeset
|
532 files |
95d37db31479
rhg: Replace subcommand boilerplate with a macro
Simon Sapin <simon.sapin@octobus.net>
parents:
46501
diff
changeset
|
533 root |
46505
a25033eb43b5
rhg: add limited support for the `config` sub-command
Simon Sapin <simon.sapin@octobus.net>
parents:
46504
diff
changeset
|
534 config |
46822
c71e8d9e7f2a
rhg: Initial support for the 'status' command
Georges Racinet <georges.racinet@octobus.net>
parents:
46820
diff
changeset
|
535 status |
46502
95d37db31479
rhg: Replace subcommand boilerplate with a macro
Simon Sapin <simon.sapin@octobus.net>
parents:
46501
diff
changeset
|
536 } |
46822
c71e8d9e7f2a
rhg: Initial support for the 'status' command
Georges Racinet <georges.racinet@octobus.net>
parents:
46820
diff
changeset
|
537 |
46592
80840b651721
rhg: Group values passed to every sub-command into a struct
Simon Sapin <simon.sapin@octobus.net>
parents:
46591
diff
changeset
|
538 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
|
539 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
|
540 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
|
541 config: &'a Config, |
46593
5ce2aa7c2ad5
rhg: Move `Repo` object creation into `main()`
Simon Sapin <simon.sapin@octobus.net>
parents:
46592
diff
changeset
|
542 /// 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
|
543 /// `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
|
544 /// `Result` type is `Copy`. |
5ce2aa7c2ad5
rhg: Move `Repo` object creation into `main()`
Simon Sapin <simon.sapin@octobus.net>
parents:
46592
diff
changeset
|
545 repo: Result<&'a Repo, &'a NoRepoInCwdError>, |
5ce2aa7c2ad5
rhg: Move `Repo` object creation into `main()`
Simon Sapin <simon.sapin@octobus.net>
parents:
46592
diff
changeset
|
546 } |
5ce2aa7c2ad5
rhg: Move `Repo` object creation into `main()`
Simon Sapin <simon.sapin@octobus.net>
parents:
46592
diff
changeset
|
547 |
5ce2aa7c2ad5
rhg: Move `Repo` object creation into `main()`
Simon Sapin <simon.sapin@octobus.net>
parents:
46592
diff
changeset
|
548 struct NoRepoInCwdError { |
5ce2aa7c2ad5
rhg: Move `Repo` object creation into `main()`
Simon Sapin <simon.sapin@octobus.net>
parents:
46592
diff
changeset
|
549 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
|
550 } |
46593
5ce2aa7c2ad5
rhg: Move `Repo` object creation into `main()`
Simon Sapin <simon.sapin@octobus.net>
parents:
46592
diff
changeset
|
551 |
46665
7284b524b441
rhg: Make configuration available as early as possible in main()
Simon Sapin <simon.sapin@octobus.net>
parents:
46608
diff
changeset
|
552 /// 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
|
553 /// 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
|
554 /// 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
|
555 /// |
7284b524b441
rhg: Make configuration available as early as possible in main()
Simon Sapin <simon.sapin@octobus.net>
parents:
46608
diff
changeset
|
556 /// 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
|
557 /// 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
|
558 struct EarlyArgs { |
7284b524b441
rhg: Make configuration available as early as possible in main()
Simon Sapin <simon.sapin@octobus.net>
parents:
46608
diff
changeset
|
559 /// 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
|
560 config: Vec<Vec<u8>>, |
48732
d4a5c2197208
rhg: Add parsing for the --color global CLI argument
Simon Sapin <simon.sapin@octobus.net>
parents:
48731
diff
changeset
|
561 /// Value of all the `--color` argument, if any. |
d4a5c2197208
rhg: Add parsing for the --color global CLI argument
Simon Sapin <simon.sapin@octobus.net>
parents:
48731
diff
changeset
|
562 color: 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
|
563 /// 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
|
564 repo: Option<Vec<u8>>, |
46736
2255e7eb39e5
rhg: Add support for --cwd
Simon Sapin <simon.sapin@octobus.net>
parents:
46734
diff
changeset
|
565 /// Value of the `--cwd` argument, if any. |
2255e7eb39e5
rhg: Add support for --cwd
Simon Sapin <simon.sapin@octobus.net>
parents:
46734
diff
changeset
|
566 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
|
567 } |
7284b524b441
rhg: Make configuration available as early as possible in main()
Simon Sapin <simon.sapin@octobus.net>
parents:
46608
diff
changeset
|
568 |
7284b524b441
rhg: Make configuration available as early as possible in main()
Simon Sapin <simon.sapin@octobus.net>
parents:
46608
diff
changeset
|
569 impl EarlyArgs { |
7284b524b441
rhg: Make configuration available as early as possible in main()
Simon Sapin <simon.sapin@octobus.net>
parents:
46608
diff
changeset
|
570 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
|
571 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
|
572 let mut config = Vec::new(); |
48732
d4a5c2197208
rhg: Add parsing for the --color global CLI argument
Simon Sapin <simon.sapin@octobus.net>
parents:
48731
diff
changeset
|
573 let mut color = None; |
46665
7284b524b441
rhg: Make configuration available as early as possible in main()
Simon Sapin <simon.sapin@octobus.net>
parents:
46608
diff
changeset
|
574 let mut repo = None; |
46736
2255e7eb39e5
rhg: Add support for --cwd
Simon Sapin <simon.sapin@octobus.net>
parents:
46734
diff
changeset
|
575 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
|
576 // 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
|
577 // `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
|
578 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
|
579 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
|
580 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
|
581 config.push(value) |
7284b524b441
rhg: Make configuration available as early as possible in main()
Simon Sapin <simon.sapin@octobus.net>
parents:
46608
diff
changeset
|
582 } |
7284b524b441
rhg: Make configuration available as early as possible in main()
Simon Sapin <simon.sapin@octobus.net>
parents:
46608
diff
changeset
|
583 } 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
|
584 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
|
585 } |
7284b524b441
rhg: Make configuration available as early as possible in main()
Simon Sapin <simon.sapin@octobus.net>
parents:
46608
diff
changeset
|
586 |
48732
d4a5c2197208
rhg: Add parsing for the --color global CLI argument
Simon Sapin <simon.sapin@octobus.net>
parents:
48731
diff
changeset
|
587 if arg == b"--color" { |
d4a5c2197208
rhg: Add parsing for the --color global CLI argument
Simon Sapin <simon.sapin@octobus.net>
parents:
48731
diff
changeset
|
588 if let Some(value) = args.next() { |
d4a5c2197208
rhg: Add parsing for the --color global CLI argument
Simon Sapin <simon.sapin@octobus.net>
parents:
48731
diff
changeset
|
589 color = Some(value) |
d4a5c2197208
rhg: Add parsing for the --color global CLI argument
Simon Sapin <simon.sapin@octobus.net>
parents:
48731
diff
changeset
|
590 } |
d4a5c2197208
rhg: Add parsing for the --color global CLI argument
Simon Sapin <simon.sapin@octobus.net>
parents:
48731
diff
changeset
|
591 } else if let Some(value) = arg.drop_prefix(b"--color=") { |
d4a5c2197208
rhg: Add parsing for the --color global CLI argument
Simon Sapin <simon.sapin@octobus.net>
parents:
48731
diff
changeset
|
592 color = Some(value.to_owned()) |
d4a5c2197208
rhg: Add parsing for the --color global CLI argument
Simon Sapin <simon.sapin@octobus.net>
parents:
48731
diff
changeset
|
593 } |
d4a5c2197208
rhg: Add parsing for the --color global CLI argument
Simon Sapin <simon.sapin@octobus.net>
parents:
48731
diff
changeset
|
594 |
46736
2255e7eb39e5
rhg: Add support for --cwd
Simon Sapin <simon.sapin@octobus.net>
parents:
46734
diff
changeset
|
595 if arg == b"--cwd" { |
2255e7eb39e5
rhg: Add support for --cwd
Simon Sapin <simon.sapin@octobus.net>
parents:
46734
diff
changeset
|
596 if let Some(value) = args.next() { |
2255e7eb39e5
rhg: Add support for --cwd
Simon Sapin <simon.sapin@octobus.net>
parents:
46734
diff
changeset
|
597 cwd = Some(value) |
2255e7eb39e5
rhg: Add support for --cwd
Simon Sapin <simon.sapin@octobus.net>
parents:
46734
diff
changeset
|
598 } |
2255e7eb39e5
rhg: Add support for --cwd
Simon Sapin <simon.sapin@octobus.net>
parents:
46734
diff
changeset
|
599 } 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
|
600 cwd = Some(value.to_owned()) |
2255e7eb39e5
rhg: Add support for --cwd
Simon Sapin <simon.sapin@octobus.net>
parents:
46734
diff
changeset
|
601 } |
2255e7eb39e5
rhg: Add support for --cwd
Simon Sapin <simon.sapin@octobus.net>
parents:
46734
diff
changeset
|
602 |
46665
7284b524b441
rhg: Make configuration available as early as possible in main()
Simon Sapin <simon.sapin@octobus.net>
parents:
46608
diff
changeset
|
603 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
|
604 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
|
605 repo = Some(value) |
7284b524b441
rhg: Make configuration available as early as possible in main()
Simon Sapin <simon.sapin@octobus.net>
parents:
46608
diff
changeset
|
606 } |
7284b524b441
rhg: Make configuration available as early as possible in main()
Simon Sapin <simon.sapin@octobus.net>
parents:
46608
diff
changeset
|
607 } 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
|
608 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
|
609 } 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
|
610 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
|
611 } |
46593
5ce2aa7c2ad5
rhg: Move `Repo` object creation into `main()`
Simon Sapin <simon.sapin@octobus.net>
parents:
46592
diff
changeset
|
612 } |
48732
d4a5c2197208
rhg: Add parsing for the --color global CLI argument
Simon Sapin <simon.sapin@octobus.net>
parents:
48731
diff
changeset
|
613 Self { |
d4a5c2197208
rhg: Add parsing for the --color global CLI argument
Simon Sapin <simon.sapin@octobus.net>
parents:
48731
diff
changeset
|
614 config, |
d4a5c2197208
rhg: Add parsing for the --color global CLI argument
Simon Sapin <simon.sapin@octobus.net>
parents:
48731
diff
changeset
|
615 color, |
d4a5c2197208
rhg: Add parsing for the --color global CLI argument
Simon Sapin <simon.sapin@octobus.net>
parents:
48731
diff
changeset
|
616 repo, |
d4a5c2197208
rhg: Add parsing for the --color global CLI argument
Simon Sapin <simon.sapin@octobus.net>
parents:
48731
diff
changeset
|
617 cwd, |
d4a5c2197208
rhg: Add parsing for the --color global CLI argument
Simon Sapin <simon.sapin@octobus.net>
parents:
48731
diff
changeset
|
618 } |
46593
5ce2aa7c2ad5
rhg: Move `Repo` object creation into `main()`
Simon Sapin <simon.sapin@octobus.net>
parents:
46592
diff
changeset
|
619 } |
5ce2aa7c2ad5
rhg: Move `Repo` object creation into `main()`
Simon Sapin <simon.sapin@octobus.net>
parents:
46592
diff
changeset
|
620 } |
46666
33f2d56acc73
rhg: Add a `rhg.on-unsupported` configuration key
Simon Sapin <simon.sapin@octobus.net>
parents:
46665
diff
changeset
|
621 |
33f2d56acc73
rhg: Add a `rhg.on-unsupported` configuration key
Simon Sapin <simon.sapin@octobus.net>
parents:
46665
diff
changeset
|
622 /// 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
|
623 /// |
33f2d56acc73
rhg: Add a `rhg.on-unsupported` configuration key
Simon Sapin <simon.sapin@octobus.net>
parents:
46665
diff
changeset
|
624 /// 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
|
625 enum OnUnsupported { |
33f2d56acc73
rhg: Add a `rhg.on-unsupported` configuration key
Simon Sapin <simon.sapin@octobus.net>
parents:
46665
diff
changeset
|
626 /// 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
|
627 /// and exit with code 252. |
33f2d56acc73
rhg: Add a `rhg.on-unsupported` configuration key
Simon Sapin <simon.sapin@octobus.net>
parents:
46665
diff
changeset
|
628 Abort, |
33f2d56acc73
rhg: Add a `rhg.on-unsupported` configuration key
Simon Sapin <simon.sapin@octobus.net>
parents:
46665
diff
changeset
|
629 /// Silently exit with code 252. |
33f2d56acc73
rhg: Add a `rhg.on-unsupported` configuration key
Simon Sapin <simon.sapin@octobus.net>
parents:
46665
diff
changeset
|
630 AbortSilent, |
46667
93e9f448273c
rhg: Add support for automatic fallback to Python
Simon Sapin <simon.sapin@octobus.net>
parents:
46666
diff
changeset
|
631 /// Try running a Python implementation |
48353
8960295b9246
rhg: only complain about poorly configured fallback when falling back
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48340
diff
changeset
|
632 Fallback { executable: Option<Vec<u8>> }, |
46666
33f2d56acc73
rhg: Add a `rhg.on-unsupported` configuration key
Simon Sapin <simon.sapin@octobus.net>
parents:
46665
diff
changeset
|
633 } |
33f2d56acc73
rhg: Add a `rhg.on-unsupported` configuration key
Simon Sapin <simon.sapin@octobus.net>
parents:
46665
diff
changeset
|
634 |
33f2d56acc73
rhg: Add a `rhg.on-unsupported` configuration key
Simon Sapin <simon.sapin@octobus.net>
parents:
46665
diff
changeset
|
635 impl OnUnsupported { |
46667
93e9f448273c
rhg: Add support for automatic fallback to Python
Simon Sapin <simon.sapin@octobus.net>
parents:
46666
diff
changeset
|
636 const DEFAULT: Self = OnUnsupported::Abort; |
93e9f448273c
rhg: Add support for automatic fallback to Python
Simon Sapin <simon.sapin@octobus.net>
parents:
46666
diff
changeset
|
637 |
48353
8960295b9246
rhg: only complain about poorly configured fallback when falling back
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48340
diff
changeset
|
638 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
|
639 match config |
93e9f448273c
rhg: Add support for automatic fallback to Python
Simon Sapin <simon.sapin@octobus.net>
parents:
46666
diff
changeset
|
640 .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
|
641 .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
|
642 .as_deref() |
93e9f448273c
rhg: Add support for automatic fallback to Python
Simon Sapin <simon.sapin@octobus.net>
parents:
46666
diff
changeset
|
643 { |
46666
33f2d56acc73
rhg: Add a `rhg.on-unsupported` configuration key
Simon Sapin <simon.sapin@octobus.net>
parents:
46665
diff
changeset
|
644 Some(b"abort") => OnUnsupported::Abort, |
33f2d56acc73
rhg: Add a `rhg.on-unsupported` configuration key
Simon Sapin <simon.sapin@octobus.net>
parents:
46665
diff
changeset
|
645 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
|
646 Some(b"fallback") => OnUnsupported::Fallback { |
93e9f448273c
rhg: Add support for automatic fallback to Python
Simon Sapin <simon.sapin@octobus.net>
parents:
46666
diff
changeset
|
647 executable: config |
93e9f448273c
rhg: Add support for automatic fallback to Python
Simon Sapin <simon.sapin@octobus.net>
parents:
46666
diff
changeset
|
648 .get(b"rhg", b"fallback-executable") |
48353
8960295b9246
rhg: only complain about poorly configured fallback when falling back
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48340
diff
changeset
|
649 .map(|x| x.to_owned()), |
46667
93e9f448273c
rhg: Add support for automatic fallback to Python
Simon Sapin <simon.sapin@octobus.net>
parents:
46666
diff
changeset
|
650 }, |
93e9f448273c
rhg: Add support for automatic fallback to Python
Simon Sapin <simon.sapin@octobus.net>
parents:
46666
diff
changeset
|
651 None => Self::DEFAULT, |
46666
33f2d56acc73
rhg: Add a `rhg.on-unsupported` configuration key
Simon Sapin <simon.sapin@octobus.net>
parents:
46665
diff
changeset
|
652 Some(_) => { |
33f2d56acc73
rhg: Add a `rhg.on-unsupported` configuration key
Simon Sapin <simon.sapin@octobus.net>
parents:
46665
diff
changeset
|
653 // 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
|
654 Self::DEFAULT |
46666
33f2d56acc73
rhg: Add a `rhg.on-unsupported` configuration key
Simon Sapin <simon.sapin@octobus.net>
parents:
46665
diff
changeset
|
655 } |
33f2d56acc73
rhg: Add a `rhg.on-unsupported` configuration key
Simon Sapin <simon.sapin@octobus.net>
parents:
46665
diff
changeset
|
656 } |
33f2d56acc73
rhg: Add a `rhg.on-unsupported` configuration key
Simon Sapin <simon.sapin@octobus.net>
parents:
46665
diff
changeset
|
657 } |
33f2d56acc73
rhg: Add a `rhg.on-unsupported` configuration key
Simon Sapin <simon.sapin@octobus.net>
parents:
46665
diff
changeset
|
658 } |
46733
1bac7764ceef
rhg: Fall back to Python if unsupported extensions are enabled
Simon Sapin <simon.sapin@octobus.net>
parents:
46731
diff
changeset
|
659 |
48439
9cf5ac8c7109
rhg: support the new extension suboptions syntax
Raphaël Gomès <rgomes@octobus.net>
parents:
48415
diff
changeset
|
660 /// The `*` extension is an edge-case for config sub-options that apply to all |
9cf5ac8c7109
rhg: support the new extension suboptions syntax
Raphaël Gomès <rgomes@octobus.net>
parents:
48415
diff
changeset
|
661 /// extensions. For now, only `:required` exists, but that may change in the |
9cf5ac8c7109
rhg: support the new extension suboptions syntax
Raphaël Gomès <rgomes@octobus.net>
parents:
48415
diff
changeset
|
662 /// future. |
48409
005ae1a343f8
rhg: add support for narrow clones and sparse checkouts
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48355
diff
changeset
|
663 const SUPPORTED_EXTENSIONS: &[&[u8]] = |
48439
9cf5ac8c7109
rhg: support the new extension suboptions syntax
Raphaël Gomès <rgomes@octobus.net>
parents:
48415
diff
changeset
|
664 &[b"blackbox", b"share", b"sparse", b"narrow", b"*"]; |
46733
1bac7764ceef
rhg: Fall back to Python if unsupported extensions are enabled
Simon Sapin <simon.sapin@octobus.net>
parents:
46731
diff
changeset
|
665 |
1bac7764ceef
rhg: Fall back to Python if unsupported extensions are enabled
Simon Sapin <simon.sapin@octobus.net>
parents:
46731
diff
changeset
|
666 fn check_extensions(config: &Config) -> Result<(), CommandError> { |
48439
9cf5ac8c7109
rhg: support the new extension suboptions syntax
Raphaël Gomès <rgomes@octobus.net>
parents:
48415
diff
changeset
|
667 let enabled: HashSet<&[u8]> = config |
9cf5ac8c7109
rhg: support the new extension suboptions syntax
Raphaël Gomès <rgomes@octobus.net>
parents:
48415
diff
changeset
|
668 .get_section_keys(b"extensions") |
9cf5ac8c7109
rhg: support the new extension suboptions syntax
Raphaël Gomès <rgomes@octobus.net>
parents:
48415
diff
changeset
|
669 .into_iter() |
9cf5ac8c7109
rhg: support the new extension suboptions syntax
Raphaël Gomès <rgomes@octobus.net>
parents:
48415
diff
changeset
|
670 .map(|extension| { |
9cf5ac8c7109
rhg: support the new extension suboptions syntax
Raphaël Gomès <rgomes@octobus.net>
parents:
48415
diff
changeset
|
671 // Ignore extension suboptions. Only `required` exists for now. |
9cf5ac8c7109
rhg: support the new extension suboptions syntax
Raphaël Gomès <rgomes@octobus.net>
parents:
48415
diff
changeset
|
672 // `rhg` either supports an extension or doesn't, so it doesn't |
9cf5ac8c7109
rhg: support the new extension suboptions syntax
Raphaël Gomès <rgomes@octobus.net>
parents:
48415
diff
changeset
|
673 // make sense to consider the loading of an extension. |
9cf5ac8c7109
rhg: support the new extension suboptions syntax
Raphaël Gomès <rgomes@octobus.net>
parents:
48415
diff
changeset
|
674 extension.split_2(b':').unwrap_or((extension, b"")).0 |
9cf5ac8c7109
rhg: support the new extension suboptions syntax
Raphaël Gomès <rgomes@octobus.net>
parents:
48415
diff
changeset
|
675 }) |
9cf5ac8c7109
rhg: support the new extension suboptions syntax
Raphaël Gomès <rgomes@octobus.net>
parents:
48415
diff
changeset
|
676 .collect(); |
46733
1bac7764ceef
rhg: Fall back to Python if unsupported extensions are enabled
Simon Sapin <simon.sapin@octobus.net>
parents:
46731
diff
changeset
|
677 |
1bac7764ceef
rhg: Fall back to Python if unsupported extensions are enabled
Simon Sapin <simon.sapin@octobus.net>
parents:
46731
diff
changeset
|
678 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
|
679 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
|
680 unsupported.remove(supported); |
1bac7764ceef
rhg: Fall back to Python if unsupported extensions are enabled
Simon Sapin <simon.sapin@octobus.net>
parents:
46731
diff
changeset
|
681 } |
1bac7764ceef
rhg: Fall back to Python if unsupported extensions are enabled
Simon Sapin <simon.sapin@octobus.net>
parents:
46731
diff
changeset
|
682 |
47951
cff41e168c25
rhg: Switch rhg.ignored-extensions config to Python-compatible list syntax
Simon Sapin <simon.sapin@octobus.net>
parents:
47407
diff
changeset
|
683 if let Some(ignored_list) = config.get_list(b"rhg", b"ignored-extensions") |
46734
1a036d33bc18
rhg: Add an allow-list of ignored extensions
Simon Sapin <simon.sapin@octobus.net>
parents:
46733
diff
changeset
|
684 { |
1a036d33bc18
rhg: Add an allow-list of ignored extensions
Simon Sapin <simon.sapin@octobus.net>
parents:
46733
diff
changeset
|
685 for ignored in ignored_list { |
47951
cff41e168c25
rhg: Switch rhg.ignored-extensions config to Python-compatible list syntax
Simon Sapin <simon.sapin@octobus.net>
parents:
47407
diff
changeset
|
686 unsupported.remove(ignored.as_slice()); |
46734
1a036d33bc18
rhg: Add an allow-list of ignored extensions
Simon Sapin <simon.sapin@octobus.net>
parents:
46733
diff
changeset
|
687 } |
1a036d33bc18
rhg: Add an allow-list of ignored extensions
Simon Sapin <simon.sapin@octobus.net>
parents:
46733
diff
changeset
|
688 } |
1a036d33bc18
rhg: Add an allow-list of ignored extensions
Simon Sapin <simon.sapin@octobus.net>
parents:
46733
diff
changeset
|
689 |
46733
1bac7764ceef
rhg: Fall back to Python if unsupported extensions are enabled
Simon Sapin <simon.sapin@octobus.net>
parents:
46731
diff
changeset
|
690 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
|
691 Ok(()) |
1bac7764ceef
rhg: Fall back to Python if unsupported extensions are enabled
Simon Sapin <simon.sapin@octobus.net>
parents:
46731
diff
changeset
|
692 } else { |
1bac7764ceef
rhg: Fall back to Python if unsupported extensions are enabled
Simon Sapin <simon.sapin@octobus.net>
parents:
46731
diff
changeset
|
693 Err(CommandError::UnsupportedFeature { |
1bac7764ceef
rhg: Fall back to Python if unsupported extensions are enabled
Simon Sapin <simon.sapin@octobus.net>
parents:
46731
diff
changeset
|
694 message: format_bytes!( |
46734
1a036d33bc18
rhg: Add an allow-list of ignored extensions
Simon Sapin <simon.sapin@octobus.net>
parents:
46733
diff
changeset
|
695 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
|
696 join(unsupported, b", ") |
1bac7764ceef
rhg: Fall back to Python if unsupported extensions are enabled
Simon Sapin <simon.sapin@octobus.net>
parents:
46731
diff
changeset
|
697 ), |
1bac7764ceef
rhg: Fall back to Python if unsupported extensions are enabled
Simon Sapin <simon.sapin@octobus.net>
parents:
46731
diff
changeset
|
698 }) |
1bac7764ceef
rhg: Fall back to Python if unsupported extensions are enabled
Simon Sapin <simon.sapin@octobus.net>
parents:
46731
diff
changeset
|
699 } |
1bac7764ceef
rhg: Fall back to Python if unsupported extensions are enabled
Simon Sapin <simon.sapin@octobus.net>
parents:
46731
diff
changeset
|
700 } |
48336
5b9865032533
rhg: $HG_PENDING is not supported
Simon Sapin <simon.sapin@octobus.net>
parents:
48174
diff
changeset
|
701 |
48340
d71b9902e2de
rhg: Colored output is not supported
Simon Sapin <simon.sapin@octobus.net>
parents:
48339
diff
changeset
|
702 fn check_unsupported( |
d71b9902e2de
rhg: Colored output is not supported
Simon Sapin <simon.sapin@octobus.net>
parents:
48339
diff
changeset
|
703 config: &Config, |
48510
7f633432ca92
rhg: Sub-repositories are not supported
Simon Sapin <simon.sapin@octobus.net>
parents:
48439
diff
changeset
|
704 repo: Result<&Repo, &NoRepoInCwdError>, |
48340
d71b9902e2de
rhg: Colored output is not supported
Simon Sapin <simon.sapin@octobus.net>
parents:
48339
diff
changeset
|
705 ) -> Result<(), CommandError> { |
48336
5b9865032533
rhg: $HG_PENDING is not supported
Simon Sapin <simon.sapin@octobus.net>
parents:
48174
diff
changeset
|
706 check_extensions(config)?; |
5b9865032533
rhg: $HG_PENDING is not supported
Simon Sapin <simon.sapin@octobus.net>
parents:
48174
diff
changeset
|
707 |
5b9865032533
rhg: $HG_PENDING is not supported
Simon Sapin <simon.sapin@octobus.net>
parents:
48174
diff
changeset
|
708 if std::env::var_os("HG_PENDING").is_some() { |
5b9865032533
rhg: $HG_PENDING is not supported
Simon Sapin <simon.sapin@octobus.net>
parents:
48174
diff
changeset
|
709 // TODO: only if the value is `== repo.working_directory`? |
5b9865032533
rhg: $HG_PENDING is not supported
Simon Sapin <simon.sapin@octobus.net>
parents:
48174
diff
changeset
|
710 // What about relative v.s. absolute paths? |
5b9865032533
rhg: $HG_PENDING is not supported
Simon Sapin <simon.sapin@octobus.net>
parents:
48174
diff
changeset
|
711 Err(CommandError::unsupported("$HG_PENDING"))? |
5b9865032533
rhg: $HG_PENDING is not supported
Simon Sapin <simon.sapin@octobus.net>
parents:
48174
diff
changeset
|
712 } |
5b9865032533
rhg: $HG_PENDING is not supported
Simon Sapin <simon.sapin@octobus.net>
parents:
48174
diff
changeset
|
713 |
48510
7f633432ca92
rhg: Sub-repositories are not supported
Simon Sapin <simon.sapin@octobus.net>
parents:
48439
diff
changeset
|
714 if let Ok(repo) = repo { |
7f633432ca92
rhg: Sub-repositories are not supported
Simon Sapin <simon.sapin@octobus.net>
parents:
48439
diff
changeset
|
715 if repo.has_subrepos()? { |
7f633432ca92
rhg: Sub-repositories are not supported
Simon Sapin <simon.sapin@octobus.net>
parents:
48439
diff
changeset
|
716 Err(CommandError::unsupported("sub-repositories"))? |
7f633432ca92
rhg: Sub-repositories are not supported
Simon Sapin <simon.sapin@octobus.net>
parents:
48439
diff
changeset
|
717 } |
7f633432ca92
rhg: Sub-repositories are not supported
Simon Sapin <simon.sapin@octobus.net>
parents:
48439
diff
changeset
|
718 } |
7f633432ca92
rhg: Sub-repositories are not supported
Simon Sapin <simon.sapin@octobus.net>
parents:
48439
diff
changeset
|
719 |
48339
a2e278b5e265
rhg: [encode] and [decode] config sections are not supported
Simon Sapin <simon.sapin@octobus.net>
parents:
48336
diff
changeset
|
720 if config.has_non_empty_section(b"encode") { |
a2e278b5e265
rhg: [encode] and [decode] config sections are not supported
Simon Sapin <simon.sapin@octobus.net>
parents:
48336
diff
changeset
|
721 Err(CommandError::unsupported("[encode] config"))? |
a2e278b5e265
rhg: [encode] and [decode] config sections are not supported
Simon Sapin <simon.sapin@octobus.net>
parents:
48336
diff
changeset
|
722 } |
a2e278b5e265
rhg: [encode] and [decode] config sections are not supported
Simon Sapin <simon.sapin@octobus.net>
parents:
48336
diff
changeset
|
723 |
a2e278b5e265
rhg: [encode] and [decode] config sections are not supported
Simon Sapin <simon.sapin@octobus.net>
parents:
48336
diff
changeset
|
724 if config.has_non_empty_section(b"decode") { |
a2e278b5e265
rhg: [encode] and [decode] config sections are not supported
Simon Sapin <simon.sapin@octobus.net>
parents:
48336
diff
changeset
|
725 Err(CommandError::unsupported("[decode] config"))? |
a2e278b5e265
rhg: [encode] and [decode] config sections are not supported
Simon Sapin <simon.sapin@octobus.net>
parents:
48336
diff
changeset
|
726 } |
a2e278b5e265
rhg: [encode] and [decode] config sections are not supported
Simon Sapin <simon.sapin@octobus.net>
parents:
48336
diff
changeset
|
727 |
48336
5b9865032533
rhg: $HG_PENDING is not supported
Simon Sapin <simon.sapin@octobus.net>
parents:
48174
diff
changeset
|
728 Ok(()) |
5b9865032533
rhg: $HG_PENDING is not supported
Simon Sapin <simon.sapin@octobus.net>
parents:
48174
diff
changeset
|
729 } |