##// END OF EJS Templates
rhg: centralize PlainInfo
Arseniy Alekseyev -
r50408:467d9df9 default
parent child Browse files
Show More
@@ -0,0 +1,79 b''
1 use crate::utils::files::get_bytes_from_os_string;
2 use std::env;
3
4 /// Keeps information on whether plain mode is active.
5 ///
6 /// Plain mode means that all configuration variables which affect
7 /// the behavior and output of Mercurial should be
8 /// ignored. Additionally, the output should be stable,
9 /// reproducible and suitable for use in scripts or applications.
10 ///
11 /// The only way to trigger plain mode is by setting either the
12 /// `HGPLAIN' or `HGPLAINEXCEPT' environment variables.
13 ///
14 /// The return value can either be
15 /// - False if HGPLAIN is not set, or feature is in HGPLAINEXCEPT
16 /// - False if feature is disabled by default and not included in HGPLAIN
17 /// - True otherwise
18 #[derive(Clone)]
19 pub struct PlainInfo {
20 is_plain: bool,
21 except: Vec<Vec<u8>>,
22 }
23
24 impl PlainInfo {
25 fn plain_except(except: Vec<Vec<u8>>) -> Self {
26 PlainInfo {
27 is_plain: true,
28 except,
29 }
30 }
31
32 pub fn empty() -> PlainInfo {
33 PlainInfo {
34 is_plain: false,
35 except: vec![],
36 }
37 }
38
39 pub fn from_env() -> PlainInfo {
40 if let Some(except) = env::var_os("HGPLAINEXCEPT") {
41 PlainInfo::plain_except(
42 get_bytes_from_os_string(except)
43 .split(|&byte| byte == b',')
44 .map(|x| x.to_vec())
45 .collect(),
46 )
47 } else {
48 PlainInfo {
49 is_plain: env::var_os("HGPLAIN").is_some(),
50 except: vec![],
51 }
52 }
53 }
54
55 pub fn is_feature_plain(&self, feature: &str) -> bool {
56 return self.is_plain
57 && !self
58 .except
59 .iter()
60 .any(|exception| exception.as_slice() == feature.as_bytes());
61 }
62
63 pub fn is_plain(&self) -> bool {
64 self.is_plain
65 }
66
67 pub fn plainalias(&self) -> bool {
68 self.is_feature_plain("alias")
69 }
70 pub fn plainrevsetalias(&self) -> bool {
71 self.is_feature_plain("revsetalias")
72 }
73 pub fn plaintemplatealias(&self) -> bool {
74 self.is_feature_plain("templatealias")
75 }
76 pub fn plaintweakdefaults(&self) -> bool {
77 self.is_feature_plain("tweakdefaults")
78 }
79 }
@@ -11,6 +11,8 b''
11 11
12 12 mod config;
13 13 mod layer;
14 mod plain_info;
14 15 mod values;
15 pub use config::{Config, ConfigSource, ConfigValueParseError, PlainInfo};
16 pub use config::{Config, ConfigSource, ConfigValueParseError};
16 17 pub use layer::{ConfigError, ConfigOrigin, ConfigParseError};
18 pub use plain_info::PlainInfo;
@@ -12,6 +12,7 b' use super::values;'
12 12 use crate::config::layer::{
13 13 ConfigError, ConfigLayer, ConfigOrigin, ConfigValue,
14 14 };
15 use crate::config::plain_info::PlainInfo;
15 16 use crate::utils::files::get_bytes_from_os_str;
16 17 use format_bytes::{write_bytes, DisplayBytes};
17 18 use std::collections::HashSet;
@@ -22,14 +23,6 b' use std::str;'
22 23
23 24 use crate::errors::{HgResultExt, IoResultExt};
24 25
25 #[derive(Clone)]
26 pub struct PlainInfo {
27 pub plain: bool,
28 pub plainalias: bool,
29 pub plainrevsetalias: bool,
30 pub plaintemplatealias: bool,
31 }
32
33 26 /// Holds the config values for the current repository
34 27 /// TODO update this docstring once we support more sources
35 28 #[derive(Clone)]
@@ -92,21 +85,21 b' impl fmt::Display for ConfigValueParseEr'
92 85 }
93 86 }
94 87
88 /// Returns true if the config item is disabled by PLAIN or PLAINEXCEPT
95 89 fn should_ignore(plain: &PlainInfo, section: &[u8], item: &[u8]) -> bool {
96 90 // duplication with [_applyconfig] in [ui.py],
97 if !plain.plain {
91 if !plain.is_plain() {
98 92 return false;
99 93 }
100 94 if section == b"alias" {
101 return plain.plainalias;
95 return plain.plainalias();
102 96 }
103 97 if section == b"revsetalias" {
104 return plain.plainrevsetalias;
98 return plain.plainrevsetalias();
105 99 }
106 100 if section == b"templatealias" {
107 return plain.plaintemplatealias;
101 return plain.plaintemplatealias();
108 102 }
109
110 103 if section == b"ui" {
111 104 let to_delete: &[&[u8]] = &[
112 105 b"debug",
@@ -127,16 +120,6 b' fn should_ignore(plain: &PlainInfo, sect'
127 120 return sections_to_delete.contains(&section);
128 121 }
129 122
130 impl PlainInfo {
131 pub fn empty() -> Self {
132 Self {
133 plain: false,
134 plainalias: false,
135 plainrevsetalias: false,
136 plaintemplatealias: false,
137 }
138 }
139 }
140 123 impl Config {
141 124 /// The configuration to use when printing configuration-loading errors
142 125 pub fn empty() -> Self {
@@ -478,6 +461,8 b' impl Config {'
478 461 section: &[u8],
479 462 item: &[u8],
480 463 ) -> Option<(&ConfigLayer, &ConfigValue)> {
464 // Filter out the config items that are hidden by [PLAIN].
465 // This differs from python hg where we delete them from the config.
481 466 if should_ignore(&self.plain, &section, &item) {
482 467 return None;
483 468 }
@@ -329,14 +329,7 b' fn rhg_main(argv: Vec<OsString>) -> ! {'
329 329 };
330 330
331 331 let mut config_cow = Cow::Borrowed(config);
332 if ui::plain(None) {
333 config_cow.to_mut().apply_plain(PlainInfo {
334 plain: true,
335 plainalias: ui::plain(Some("alias")),
336 plainrevsetalias: ui::plain(Some("revsetalias")),
337 plaintemplatealias: ui::plain(Some("templatealias")),
338 })
339 };
332 config_cow.to_mut().apply_plain(PlainInfo::from_env());
340 333 let config = config_cow.as_ref();
341 334
342 335 let ui = Ui::new(&config).unwrap_or_else(|error| {
@@ -3,10 +3,9 b' use crate::color::Effect;'
3 3 use format_bytes::format_bytes;
4 4 use format_bytes::write_bytes;
5 5 use hg::config::Config;
6 use hg::config::PlainInfo;
6 7 use hg::errors::HgError;
7 use hg::utils::files::get_bytes_from_os_string;
8 8 use std::borrow::Cow;
9 use std::env;
10 9 use std::io;
11 10 use std::io::{ErrorKind, Write};
12 11
@@ -129,29 +128,13 b' impl Ui {'
129 128 }
130 129 }
131 130
132 /// Return whether plain mode is active.
133 ///
134 /// Plain mode means that all configuration variables which affect
135 /// the behavior and output of Mercurial should be
136 /// ignored. Additionally, the output should be stable,
137 /// reproducible and suitable for use in scripts or applications.
138 ///
139 /// The only way to trigger plain mode is by setting either the
140 /// `HGPLAIN' or `HGPLAINEXCEPT' environment variables.
141 ///
142 /// The return value can either be
143 /// - False if HGPLAIN is not set, or feature is in HGPLAINEXCEPT
144 /// - False if feature is disabled by default and not included in HGPLAIN
145 /// - True otherwise
131 // TODO: pass the PlainInfo to call sites directly and
132 // delete this function
146 133 pub fn plain(opt_feature: Option<&str>) -> bool {
147 if let Some(except) = env::var_os("HGPLAINEXCEPT") {
148 opt_feature.map_or(true, |feature| {
149 get_bytes_from_os_string(except)
150 .split(|&byte| byte == b',')
151 .all(|exception| exception != feature.as_bytes())
152 })
153 } else {
154 env::var_os("HGPLAIN").is_some()
134 let plain_info = PlainInfo::from_env();
135 match opt_feature {
136 None => plain_info.is_plain(),
137 Some(feature) => plain_info.is_feature_plain(feature),
155 138 }
156 139 }
157 140
General Comments 0
You need to be logged in to leave comments. Login now