annotate rust/rhg/src/color.rs @ 51602:68929cf3c0c6

match: avoid rust fast path if the matcher was tampered with Otherwise the fast path does not respect the modifications made by the extension (concretely largefiles, but other extensions can start using that too)
author Arseniy Alekseyev <aalekseyev@janestreet.com>
date Tue, 09 Apr 2024 11:12:24 +0100
parents fba29deebfe7
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
48733
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
1 use crate::ui::formatted;
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
2 use crate::ui::plain;
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
3 use format_bytes::write_bytes;
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
4 use hg::config::Config;
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
5 use hg::config::ConfigOrigin;
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
6 use hg::errors::HgError;
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
7 use std::collections::HashMap;
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
8
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
9 pub type Effect = u32;
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
10
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
11 pub type EffectsMap = HashMap<Vec<u8>, Vec<Effect>>;
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
12
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
13 macro_rules! effects {
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
14 ($( $name: ident: $value: expr ,)+) => {
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
15
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
16 #[allow(non_upper_case_globals)]
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
17 mod effects {
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
18 $(
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
19 pub const $name: super::Effect = $value;
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
20 )+
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
21 }
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
22
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
23 fn effect(name: &[u8]) -> Option<Effect> {
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
24 $(
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
25 if name == stringify!($name).as_bytes() {
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
26 Some(effects::$name)
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
27 } else
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
28 )+
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
29 {
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
30 None
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
31 }
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
32 }
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
33 };
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
34 }
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
35
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
36 effects! {
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
37 none: 0,
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
38 black: 30,
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
39 red: 31,
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
40 green: 32,
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
41 yellow: 33,
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
42 blue: 34,
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
43 magenta: 35,
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
44 cyan: 36,
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
45 white: 37,
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
46 bold: 1,
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
47 italic: 3,
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
48 underline: 4,
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
49 inverse: 7,
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
50 dim: 2,
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
51 black_background: 40,
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
52 red_background: 41,
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
53 green_background: 42,
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
54 yellow_background: 43,
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
55 blue_background: 44,
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
56 purple_background: 45,
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
57 cyan_background: 46,
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
58 white_background: 47,
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
59 }
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
60
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
61 macro_rules! default_styles {
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
62 ($( $key: expr => [$($value: expr),*],)+) => {
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
63 fn default_styles() -> EffectsMap {
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
64 use effects::*;
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
65 let mut map = HashMap::new();
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
66 $(
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
67 map.insert($key[..].to_owned(), vec![$( $value ),*]);
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
68 )+
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
69 map
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
70 }
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
71 };
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
72 }
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
73
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
74 default_styles! {
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
75 b"grep.match" => [red, bold],
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
76 b"grep.linenumber" => [green],
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
77 b"grep.rev" => [blue],
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
78 b"grep.sep" => [cyan],
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
79 b"grep.filename" => [magenta],
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
80 b"grep.user" => [magenta],
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
81 b"grep.date" => [magenta],
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
82 b"grep.inserted" => [green, bold],
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
83 b"grep.deleted" => [red, bold],
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
84 b"bookmarks.active" => [green],
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
85 b"branches.active" => [none],
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
86 b"branches.closed" => [black, bold],
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
87 b"branches.current" => [green],
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
88 b"branches.inactive" => [none],
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
89 b"diff.changed" => [white],
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
90 b"diff.deleted" => [red],
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
91 b"diff.deleted.changed" => [red, bold, underline],
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
92 b"diff.deleted.unchanged" => [red],
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
93 b"diff.diffline" => [bold],
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
94 b"diff.extended" => [cyan, bold],
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
95 b"diff.file_a" => [red, bold],
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
96 b"diff.file_b" => [green, bold],
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
97 b"diff.hunk" => [magenta],
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
98 b"diff.inserted" => [green],
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
99 b"diff.inserted.changed" => [green, bold, underline],
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
100 b"diff.inserted.unchanged" => [green],
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
101 b"diff.tab" => [],
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
102 b"diff.trailingwhitespace" => [bold, red_background],
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
103 b"changeset.public" => [],
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
104 b"changeset.draft" => [],
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
105 b"changeset.secret" => [],
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
106 b"diffstat.deleted" => [red],
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
107 b"diffstat.inserted" => [green],
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
108 b"formatvariant.name.mismatchconfig" => [red],
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
109 b"formatvariant.name.mismatchdefault" => [yellow],
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
110 b"formatvariant.name.uptodate" => [green],
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
111 b"formatvariant.repo.mismatchconfig" => [red],
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
112 b"formatvariant.repo.mismatchdefault" => [yellow],
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
113 b"formatvariant.repo.uptodate" => [green],
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
114 b"formatvariant.config.special" => [yellow],
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
115 b"formatvariant.config.default" => [green],
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
116 b"formatvariant.default" => [],
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
117 b"histedit.remaining" => [red, bold],
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
118 b"ui.addremove.added" => [green],
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
119 b"ui.addremove.removed" => [red],
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
120 b"ui.error" => [red],
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
121 b"ui.prompt" => [yellow],
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
122 b"log.changeset" => [yellow],
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
123 b"patchbomb.finalsummary" => [],
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
124 b"patchbomb.from" => [magenta],
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
125 b"patchbomb.to" => [cyan],
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
126 b"patchbomb.subject" => [green],
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
127 b"patchbomb.diffstats" => [],
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
128 b"rebase.rebased" => [blue],
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
129 b"rebase.remaining" => [red, bold],
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
130 b"resolve.resolved" => [green, bold],
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
131 b"resolve.unresolved" => [red, bold],
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
132 b"shelve.age" => [cyan],
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
133 b"shelve.newest" => [green, bold],
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
134 b"shelve.name" => [blue, bold],
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
135 b"status.added" => [green, bold],
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
136 b"status.clean" => [none],
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
137 b"status.copied" => [none],
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
138 b"status.deleted" => [cyan, bold, underline],
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
139 b"status.ignored" => [black, bold],
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
140 b"status.modified" => [blue, bold],
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
141 b"status.removed" => [red, bold],
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
142 b"status.unknown" => [magenta, bold, underline],
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
143 b"tags.normal" => [green],
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
144 b"tags.local" => [black, bold],
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
145 b"upgrade-repo.requirement.preserved" => [cyan],
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
146 b"upgrade-repo.requirement.added" => [green],
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
147 b"upgrade-repo.requirement.removed" => [red],
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
148 }
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
149
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
150 fn parse_effect(config_key: &[u8], effect_name: &[u8]) -> Option<Effect> {
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
151 let found = effect(effect_name);
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
152 if found.is_none() {
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
153 // TODO: have some API for warnings
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
154 // TODO: handle IO errors during warnings
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
155 let stderr = std::io::stderr();
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
156 let _ = write_bytes!(
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
157 &mut stderr.lock(),
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
158 b"ignoring unknown color/effect '{}' \
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
159 (configured in color.{})\n",
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
160 effect_name,
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
161 config_key,
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
162 );
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
163 }
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
164 found
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
165 }
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
166
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
167 fn effects_from_config(config: &Config) -> EffectsMap {
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
168 let mut styles = default_styles();
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
169 for (key, _value) in config.iter_section(b"color") {
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
170 if !key.contains(&b'.')
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
171 || key.starts_with(b"color.")
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
172 || key.starts_with(b"terminfo.")
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
173 {
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
174 continue;
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
175 }
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
176 // `unwrap` shouldn’t panic since we just got this key from
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
177 // iteration
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
178 let list = config.get_list(b"color", key).unwrap();
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
179 let parsed = list
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
180 .iter()
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
181 .filter_map(|name| parse_effect(key, name))
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
182 .collect();
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
183 styles.insert(key.to_owned(), parsed);
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
184 }
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
185 styles
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
186 }
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
187
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
188 enum ColorMode {
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
189 // TODO: support other modes
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
190 Ansi,
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
191 }
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
192
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
193 impl ColorMode {
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
194 // Similar to _modesetup in mercurial/color.py
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
195 fn get(config: &Config) -> Result<Option<Self>, HgError> {
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
196 if plain(Some("color")) {
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
197 return Ok(None);
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
198 }
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
199 let enabled_default = b"auto";
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
200 // `origin` is only used when `!auto`, so its default doesn’t matter
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
201 let (enabled, origin) = config
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
202 .get_with_origin(b"ui", b"color")
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
203 .unwrap_or((enabled_default, &ConfigOrigin::CommandLineColor));
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
204 if enabled == b"debug" {
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
205 return Err(HgError::unsupported("debug color mode"));
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
206 }
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
207 let auto = enabled == b"auto";
49931
fba29deebfe7 rust-clippy: fix remaining warnings in `rhg`
Raphaël Gomès <rgomes@octobus.net>
parents: 49914
diff changeset
208 let always = if !auto {
48733
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
209 let enabled_bool = config.get_bool(b"ui", b"color")?;
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
210 if !enabled_bool {
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
211 return Ok(None);
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
212 }
49931
fba29deebfe7 rust-clippy: fix remaining warnings in `rhg`
Raphaël Gomès <rgomes@octobus.net>
parents: 49914
diff changeset
213 enabled == b"always" || *origin == ConfigOrigin::CommandLineColor
48733
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
214 } else {
49931
fba29deebfe7 rust-clippy: fix remaining warnings in `rhg`
Raphaël Gomès <rgomes@octobus.net>
parents: 49914
diff changeset
215 false
48733
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
216 };
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
217 let formatted = always
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
218 || (std::env::var_os("TERM").unwrap_or_default() != "dumb"
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
219 && formatted(config)?);
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
220
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
221 let mode_default = b"auto";
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
222 let mode = config.get(b"color", b"mode").unwrap_or(mode_default);
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
223
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
224 if formatted {
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
225 match mode {
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
226 b"ansi" | b"auto" => Ok(Some(ColorMode::Ansi)),
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
227 // TODO: support other modes
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
228 _ => Err(HgError::UnsupportedFeature(format!(
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
229 "color mode {}",
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
230 String::from_utf8_lossy(mode)
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
231 ))),
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
232 }
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
233 } else {
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
234 Ok(None)
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
235 }
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
236 }
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
237 }
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
238
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
239 pub struct ColorConfig {
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
240 pub styles: EffectsMap,
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
241 }
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
242
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
243 impl ColorConfig {
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
244 // Similar to _modesetup in mercurial/color.py
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
245 pub fn new(config: &Config) -> Result<Option<Self>, HgError> {
49914
58074252db3c rust: run `cargo clippy`
Raphaël Gomès <rgomes@octobus.net>
parents: 48733
diff changeset
246 Ok(ColorMode::get(config)?.map(|ColorMode::Ansi| ColorConfig {
58074252db3c rust: run `cargo clippy`
Raphaël Gomès <rgomes@octobus.net>
parents: 48733
diff changeset
247 styles: effects_from_config(config),
58074252db3c rust: run `cargo clippy`
Raphaël Gomès <rgomes@octobus.net>
parents: 48733
diff changeset
248 }))
48733
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
249 }
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
250 }