Mercurial > hg
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 |
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 } |