annotate rust/rhg/src/ui.rs @ 52760:94e2547e6f3d

rust: move code from utils to utils::strings This moves string-related functions in hg::utils into the recently added hg::utils::strings module.
author Mitchell Kember <mkember@janestreet.com>
date Thu, 16 Jan 2025 13:15:02 -0500
parents bbf1c52252ae
children 6183949219b2
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: 48731
diff changeset
1 use crate::color::ColorConfig;
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
2 use crate::color::Effect;
49981
364e78389653 rust-ui: refactor ui code for printing narrow/sparse warnings
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49513
diff changeset
3 use crate::error::CommandError;
45984
fada33872b5b rhg: use `format_bytes!` for error messages
Rapha?l Gom?s <rgomes@octobus.net>
parents: 45528
diff changeset
4 use format_bytes::format_bytes;
48733
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
5 use format_bytes::write_bytes;
48730
1aaf11e35aec rhg: Pass a &Config to Ui::new
Simon Sapin <simon.sapin@octobus.net>
parents: 48729
diff changeset
6 use hg::config::Config;
49513
467d9df98c68 rhg: centralize PlainInfo
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 49512
diff changeset
7 use hg::config::PlainInfo;
52756
bbf1c52252ae rust: add encoding.rs
Mitchell Kember <mkember@janestreet.com>
parents: 52726
diff changeset
8 use hg::encoding::Encoder;
48731
f591b377375f rhg: Make Ui::new falliable, add Ui::new_infallible
Simon Sapin <simon.sapin@octobus.net>
parents: 48730
diff changeset
9 use hg::errors::HgError;
52303
22d24f6d6411 rust-lib: remove exports for not too common pattern-related types
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51117
diff changeset
10 use hg::filepatterns::PatternFileWarning;
49981
364e78389653 rust-ui: refactor ui code for printing narrow/sparse warnings
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49513
diff changeset
11 use hg::repo::Repo;
364e78389653 rust-ui: refactor ui code for printing narrow/sparse warnings
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49513
diff changeset
12 use hg::sparse;
364e78389653 rust-ui: refactor ui code for printing narrow/sparse warnings
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49513
diff changeset
13 use hg::utils::files::get_bytes_from_path;
45049
513b3ef277a3 rhg: add RootCommand using hg-core FindRoot operation to prepare `hg root`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
14 use std::io;
52726
65839176cea9 rhg: buffer the output of `rhg status`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 52309
diff changeset
15 use std::io::BufWriter;
52309
56e8841a454c rust: remove `atty` dependency
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52303
diff changeset
16 use std::io::IsTerminal;
52726
65839176cea9 rhg: buffer the output of `rhg status`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 52309
diff changeset
17 use std::io::StdoutLock;
45362
eb55274d3650 rhg: add buffered stdout writing possibility
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45049
diff changeset
18 use std::io::{ErrorKind, Write};
45049
513b3ef277a3 rhg: add RootCommand using hg-core FindRoot operation to prepare `hg root`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
19
45362
eb55274d3650 rhg: add buffered stdout writing possibility
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45049
diff changeset
20 pub struct Ui {
eb55274d3650 rhg: add buffered stdout writing possibility
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45049
diff changeset
21 stdout: std::io::Stdout,
eb55274d3650 rhg: add buffered stdout writing possibility
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45049
diff changeset
22 stderr: std::io::Stderr,
48733
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
23 colors: Option<ColorConfig>,
52756
bbf1c52252ae rust: add encoding.rs
Mitchell Kember <mkember@janestreet.com>
parents: 52726
diff changeset
24 encoder: Encoder,
45362
eb55274d3650 rhg: add buffered stdout writing possibility
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45049
diff changeset
25 }
45049
513b3ef277a3 rhg: add RootCommand using hg-core FindRoot operation to prepare `hg root`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
26
513b3ef277a3 rhg: add RootCommand using hg-core FindRoot operation to prepare `hg root`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
27 /// The kind of user interface error
513b3ef277a3 rhg: add RootCommand using hg-core FindRoot operation to prepare `hg root`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
28 pub enum UiError {
513b3ef277a3 rhg: add RootCommand using hg-core FindRoot operation to prepare `hg root`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
29 /// The standard output stream cannot be written to
513b3ef277a3 rhg: add RootCommand using hg-core FindRoot operation to prepare `hg root`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
30 StdoutError(io::Error),
513b3ef277a3 rhg: add RootCommand using hg-core FindRoot operation to prepare `hg root`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
31 /// The standard error stream cannot be written to
513b3ef277a3 rhg: add RootCommand using hg-core FindRoot operation to prepare `hg root`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
32 StderrError(io::Error),
513b3ef277a3 rhg: add RootCommand using hg-core FindRoot operation to prepare `hg root`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
33 }
513b3ef277a3 rhg: add RootCommand using hg-core FindRoot operation to prepare `hg root`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
34
513b3ef277a3 rhg: add RootCommand using hg-core FindRoot operation to prepare `hg root`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
35 /// The commandline user interface
513b3ef277a3 rhg: add RootCommand using hg-core FindRoot operation to prepare `hg root`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
36 impl Ui {
48733
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
37 pub fn new(config: &Config) -> Result<Self, HgError> {
48731
f591b377375f rhg: Make Ui::new falliable, add Ui::new_infallible
Simon Sapin <simon.sapin@octobus.net>
parents: 48730
diff changeset
38 Ok(Ui {
48733
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
39 // If using something else, also adapt `isatty()` below.
48731
f591b377375f rhg: Make Ui::new falliable, add Ui::new_infallible
Simon Sapin <simon.sapin@octobus.net>
parents: 48730
diff changeset
40 stdout: std::io::stdout(),
48733
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
41
48731
f591b377375f rhg: Make Ui::new falliable, add Ui::new_infallible
Simon Sapin <simon.sapin@octobus.net>
parents: 48730
diff changeset
42 stderr: std::io::stderr(),
48733
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
43 colors: ColorConfig::new(config)?,
52756
bbf1c52252ae rust: add encoding.rs
Mitchell Kember <mkember@janestreet.com>
parents: 52726
diff changeset
44 encoder: Encoder::from_env()?,
48731
f591b377375f rhg: Make Ui::new falliable, add Ui::new_infallible
Simon Sapin <simon.sapin@octobus.net>
parents: 48730
diff changeset
45 })
f591b377375f rhg: Make Ui::new falliable, add Ui::new_infallible
Simon Sapin <simon.sapin@octobus.net>
parents: 48730
diff changeset
46 }
f591b377375f rhg: Make Ui::new falliable, add Ui::new_infallible
Simon Sapin <simon.sapin@octobus.net>
parents: 48730
diff changeset
47
f591b377375f rhg: Make Ui::new falliable, add Ui::new_infallible
Simon Sapin <simon.sapin@octobus.net>
parents: 48730
diff changeset
48 /// Default to no color if color configuration errors.
f591b377375f rhg: Make Ui::new falliable, add Ui::new_infallible
Simon Sapin <simon.sapin@octobus.net>
parents: 48730
diff changeset
49 ///
f591b377375f rhg: Make Ui::new falliable, add Ui::new_infallible
Simon Sapin <simon.sapin@octobus.net>
parents: 48730
diff changeset
50 /// Useful when we’re already handling another error.
48733
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
51 pub fn new_infallible(config: &Config) -> Self {
45362
eb55274d3650 rhg: add buffered stdout writing possibility
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45049
diff changeset
52 Ui {
48733
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
53 // If using something else, also adapt `isatty()` below.
45362
eb55274d3650 rhg: add buffered stdout writing possibility
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45049
diff changeset
54 stdout: std::io::stdout(),
48733
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
55
45362
eb55274d3650 rhg: add buffered stdout writing possibility
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45049
diff changeset
56 stderr: std::io::stderr(),
48733
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
57 colors: ColorConfig::new(config).unwrap_or(None),
52756
bbf1c52252ae rust: add encoding.rs
Mitchell Kember <mkember@janestreet.com>
parents: 52726
diff changeset
58 encoder: Encoder::default(),
45362
eb55274d3650 rhg: add buffered stdout writing possibility
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45049
diff changeset
59 }
eb55274d3650 rhg: add buffered stdout writing possibility
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45049
diff changeset
60 }
eb55274d3650 rhg: add buffered stdout writing possibility
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45049
diff changeset
61
eb55274d3650 rhg: add buffered stdout writing possibility
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45049
diff changeset
62 /// Returns a buffered handle on stdout for faster batch printing
eb55274d3650 rhg: add buffered stdout writing possibility
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45049
diff changeset
63 /// operations.
52726
65839176cea9 rhg: buffer the output of `rhg status`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 52309
diff changeset
64 pub fn stdout_buffer(&self) -> StdoutBuffer<'_, BufWriter<StdoutLock>> {
65839176cea9 rhg: buffer the output of `rhg status`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 52309
diff changeset
65 StdoutBuffer {
65839176cea9 rhg: buffer the output of `rhg status`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 52309
diff changeset
66 stdout: BufWriter::new(self.stdout.lock()),
65839176cea9 rhg: buffer the output of `rhg status`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 52309
diff changeset
67 colors: &self.colors,
65839176cea9 rhg: buffer the output of `rhg status`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 52309
diff changeset
68 }
45049
513b3ef277a3 rhg: add RootCommand using hg-core FindRoot operation to prepare `hg root`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
69 }
513b3ef277a3 rhg: add RootCommand using hg-core FindRoot operation to prepare `hg root`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
70
513b3ef277a3 rhg: add RootCommand using hg-core FindRoot operation to prepare `hg root`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
71 /// Write bytes to stdout
513b3ef277a3 rhg: add RootCommand using hg-core FindRoot operation to prepare `hg root`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
72 pub fn write_stdout(&self, bytes: &[u8]) -> Result<(), UiError> {
45362
eb55274d3650 rhg: add buffered stdout writing possibility
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45049
diff changeset
73 let mut stdout = self.stdout.lock();
45049
513b3ef277a3 rhg: add RootCommand using hg-core FindRoot operation to prepare `hg root`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
74
45439
fbc373b7cbc3 rhg: fix `clippy` warnings
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45367
diff changeset
75 stdout.write_all(bytes).or_else(handle_stdout_error)?;
45049
513b3ef277a3 rhg: add RootCommand using hg-core FindRoot operation to prepare `hg root`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
76
45439
fbc373b7cbc3 rhg: fix `clippy` warnings
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45367
diff changeset
77 stdout.flush().or_else(handle_stdout_error)
45049
513b3ef277a3 rhg: add RootCommand using hg-core FindRoot operation to prepare `hg root`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
78 }
513b3ef277a3 rhg: add RootCommand using hg-core FindRoot operation to prepare `hg root`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
79
513b3ef277a3 rhg: add RootCommand using hg-core FindRoot operation to prepare `hg root`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
80 /// Write bytes to stderr
513b3ef277a3 rhg: add RootCommand using hg-core FindRoot operation to prepare `hg root`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
81 pub fn write_stderr(&self, bytes: &[u8]) -> Result<(), UiError> {
45362
eb55274d3650 rhg: add buffered stdout writing possibility
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45049
diff changeset
82 let mut stderr = self.stderr.lock();
45049
513b3ef277a3 rhg: add RootCommand using hg-core FindRoot operation to prepare `hg root`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
83
45439
fbc373b7cbc3 rhg: fix `clippy` warnings
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45367
diff changeset
84 stderr.write_all(bytes).or_else(handle_stderr_error)?;
45049
513b3ef277a3 rhg: add RootCommand using hg-core FindRoot operation to prepare `hg root`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
85
45439
fbc373b7cbc3 rhg: fix `clippy` warnings
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45367
diff changeset
86 stderr.flush().or_else(handle_stderr_error)
45049
513b3ef277a3 rhg: add RootCommand using hg-core FindRoot operation to prepare `hg root`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
87 }
52756
bbf1c52252ae rust: add encoding.rs
Mitchell Kember <mkember@janestreet.com>
parents: 52726
diff changeset
88
bbf1c52252ae rust: add encoding.rs
Mitchell Kember <mkember@janestreet.com>
parents: 52726
diff changeset
89 // TODO: use this
bbf1c52252ae rust: add encoding.rs
Mitchell Kember <mkember@janestreet.com>
parents: 52726
diff changeset
90 #[allow(dead_code)]
bbf1c52252ae rust: add encoding.rs
Mitchell Kember <mkember@janestreet.com>
parents: 52726
diff changeset
91 pub fn encoder(&self) -> &Encoder {
bbf1c52252ae rust: add encoding.rs
Mitchell Kember <mkember@janestreet.com>
parents: 52726
diff changeset
92 &self.encoder
bbf1c52252ae rust: add encoding.rs
Mitchell Kember <mkember@janestreet.com>
parents: 52726
diff changeset
93 }
52726
65839176cea9 rhg: buffer the output of `rhg status`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 52309
diff changeset
94 }
48176
38deb65d4441 rhg: add ui.plain() and check it before showing relative paths in status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46591
diff changeset
95
52726
65839176cea9 rhg: buffer the output of `rhg status`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 52309
diff changeset
96 /// A buffered stdout writer for faster batch printing operations.
65839176cea9 rhg: buffer the output of `rhg status`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 52309
diff changeset
97 pub struct StdoutBuffer<'a, W> {
65839176cea9 rhg: buffer the output of `rhg status`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 52309
diff changeset
98 colors: &'a Option<ColorConfig>,
65839176cea9 rhg: buffer the output of `rhg status`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 52309
diff changeset
99 stdout: W,
65839176cea9 rhg: buffer the output of `rhg status`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 52309
diff changeset
100 }
65839176cea9 rhg: buffer the output of `rhg status`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 52309
diff changeset
101
65839176cea9 rhg: buffer the output of `rhg status`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 52309
diff changeset
102 impl<'a, W: Write> StdoutBuffer<'a, W> {
48733
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
103 /// Write bytes to stdout with the given label
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
104 ///
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
105 /// Like the optional `label` parameter in `mercurial/ui.py`,
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
106 /// this label influences the color used for this output.
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
107 pub fn write_stdout_labelled(
52726
65839176cea9 rhg: buffer the output of `rhg status`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 52309
diff changeset
108 &mut self,
48733
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
109 bytes: &[u8],
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
110 label: &str,
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
111 ) -> Result<(), UiError> {
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
112 if let Some(colors) = &self.colors {
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
113 if let Some(effects) = colors.styles.get(label.as_bytes()) {
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
114 if !effects.is_empty() {
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
115 return self
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
116 .write_stdout_with_effects(bytes, effects)
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
117 .or_else(handle_stdout_error);
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
118 }
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
119 }
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
120 }
52726
65839176cea9 rhg: buffer the output of `rhg status`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 52309
diff changeset
121 self.write_all(bytes)
48733
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
122 }
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
123
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
124 fn write_stdout_with_effects(
52726
65839176cea9 rhg: buffer the output of `rhg status`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 52309
diff changeset
125 &mut self,
48733
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
126 bytes: &[u8],
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
127 effects: &[Effect],
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
128 ) -> io::Result<()> {
52726
65839176cea9 rhg: buffer the output of `rhg status`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 52309
diff changeset
129 let stdout = &mut self.stdout;
48733
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
130 let mut write_line = |line: &[u8], first: bool| {
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
131 // `line` does not include the newline delimiter
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
132 if !first {
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
133 stdout.write_all(b"\n")?;
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
134 }
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
135 if line.is_empty() {
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
136 return Ok(());
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
137 }
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
138 /// 0x1B == 27 == 0o33
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
139 const ASCII_ESCAPE: &[u8] = b"\x1b";
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
140 write_bytes!(stdout, b"{}[0", ASCII_ESCAPE)?;
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
141 for effect in effects {
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
142 write_bytes!(stdout, b";{}", effect)?;
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
143 }
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
144 write_bytes!(stdout, b"m")?;
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
145 stdout.write_all(line)?;
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
146 write_bytes!(stdout, b"{}[0m", ASCII_ESCAPE)
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
147 };
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
148 let mut lines = bytes.split(|&byte| byte == b'\n');
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
149 if let Some(first) = lines.next() {
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
150 write_line(first, true)?;
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
151 for line in lines {
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
152 write_line(line, false)?
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
153 }
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
154 }
52726
65839176cea9 rhg: buffer the output of `rhg status`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 52309
diff changeset
155 Ok(())
65839176cea9 rhg: buffer the output of `rhg status`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 52309
diff changeset
156 }
65839176cea9 rhg: buffer the output of `rhg status`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 52309
diff changeset
157
65839176cea9 rhg: buffer the output of `rhg status`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 52309
diff changeset
158 /// Write bytes to stdout buffer
65839176cea9 rhg: buffer the output of `rhg status`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 52309
diff changeset
159 pub fn write_all(&mut self, bytes: &[u8]) -> Result<(), UiError> {
65839176cea9 rhg: buffer the output of `rhg status`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 52309
diff changeset
160 self.stdout.write_all(bytes).or_else(handle_stdout_error)
65839176cea9 rhg: buffer the output of `rhg status`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 52309
diff changeset
161 }
65839176cea9 rhg: buffer the output of `rhg status`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 52309
diff changeset
162
65839176cea9 rhg: buffer the output of `rhg status`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 52309
diff changeset
163 /// Flush bytes to stdout
65839176cea9 rhg: buffer the output of `rhg status`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 52309
diff changeset
164 pub fn flush(&mut self) -> Result<(), UiError> {
65839176cea9 rhg: buffer the output of `rhg status`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 52309
diff changeset
165 self.stdout.flush().or_else(handle_stdout_error)
48733
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
166 }
48729
99b1dfc06571 rhg: Add support for HGPLAINEXPECT
Simon Sapin <simon.sapin@octobus.net>
parents: 48513
diff changeset
167 }
99b1dfc06571 rhg: Add support for HGPLAINEXPECT
Simon Sapin <simon.sapin@octobus.net>
parents: 48513
diff changeset
168
49513
467d9df98c68 rhg: centralize PlainInfo
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 49512
diff changeset
169 // TODO: pass the PlainInfo to call sites directly and
467d9df98c68 rhg: centralize PlainInfo
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 49512
diff changeset
170 // delete this function
48733
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
171 pub fn plain(opt_feature: Option<&str>) -> bool {
49513
467d9df98c68 rhg: centralize PlainInfo
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 49512
diff changeset
172 let plain_info = PlainInfo::from_env();
467d9df98c68 rhg: centralize PlainInfo
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 49512
diff changeset
173 match opt_feature {
467d9df98c68 rhg: centralize PlainInfo
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 49512
diff changeset
174 None => plain_info.is_plain(),
467d9df98c68 rhg: centralize PlainInfo
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 49512
diff changeset
175 Some(feature) => plain_info.is_feature_plain(feature),
48176
38deb65d4441 rhg: add ui.plain() and check it before showing relative paths in status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46591
diff changeset
176 }
45049
513b3ef277a3 rhg: add RootCommand using hg-core FindRoot operation to prepare `hg root`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
177 }
45362
eb55274d3650 rhg: add buffered stdout writing possibility
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45049
diff changeset
178
45366
10c36ead86f8 rhg: extract function handle_stdout_error
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45362
diff changeset
179 /// Sometimes writing to stdout is not possible, try writing to stderr to
10c36ead86f8 rhg: extract function handle_stdout_error
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45362
diff changeset
180 /// signal that failure, otherwise just bail.
10c36ead86f8 rhg: extract function handle_stdout_error
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45362
diff changeset
181 fn handle_stdout_error(error: io::Error) -> Result<(), UiError> {
10c36ead86f8 rhg: extract function handle_stdout_error
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45362
diff changeset
182 if let ErrorKind::BrokenPipe = error.kind() {
10c36ead86f8 rhg: extract function handle_stdout_error
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45362
diff changeset
183 // This makes `| head` work for example
10c36ead86f8 rhg: extract function handle_stdout_error
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45362
diff changeset
184 return Ok(());
10c36ead86f8 rhg: extract function handle_stdout_error
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45362
diff changeset
185 }
10c36ead86f8 rhg: extract function handle_stdout_error
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45362
diff changeset
186 let mut stderr = io::stderr();
10c36ead86f8 rhg: extract function handle_stdout_error
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45362
diff changeset
187
10c36ead86f8 rhg: extract function handle_stdout_error
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45362
diff changeset
188 stderr
45984
fada33872b5b rhg: use `format_bytes!` for error messages
Rapha?l Gom?s <rgomes@octobus.net>
parents: 45528
diff changeset
189 .write_all(&format_bytes!(
fada33872b5b rhg: use `format_bytes!` for error messages
Rapha?l Gom?s <rgomes@octobus.net>
parents: 45528
diff changeset
190 b"abort: {}\n",
fada33872b5b rhg: use `format_bytes!` for error messages
Rapha?l Gom?s <rgomes@octobus.net>
parents: 45528
diff changeset
191 error.to_string().as_bytes()
fada33872b5b rhg: use `format_bytes!` for error messages
Rapha?l Gom?s <rgomes@octobus.net>
parents: 45528
diff changeset
192 ))
45439
fbc373b7cbc3 rhg: fix `clippy` warnings
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45367
diff changeset
193 .map_err(UiError::StderrError)?;
45366
10c36ead86f8 rhg: extract function handle_stdout_error
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45362
diff changeset
194
45439
fbc373b7cbc3 rhg: fix `clippy` warnings
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45367
diff changeset
195 stderr.flush().map_err(UiError::StderrError)?;
45366
10c36ead86f8 rhg: extract function handle_stdout_error
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45362
diff changeset
196
10c36ead86f8 rhg: extract function handle_stdout_error
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45362
diff changeset
197 Err(UiError::StdoutError(error))
10c36ead86f8 rhg: extract function handle_stdout_error
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45362
diff changeset
198 }
45367
53af26aa5951 rhg: handle broken pipe error for stderr
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45366
diff changeset
199
53af26aa5951 rhg: handle broken pipe error for stderr
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45366
diff changeset
200 /// Sometimes writing to stderr is not possible.
53af26aa5951 rhg: handle broken pipe error for stderr
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45366
diff changeset
201 fn handle_stderr_error(error: io::Error) -> Result<(), UiError> {
53af26aa5951 rhg: handle broken pipe error for stderr
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45366
diff changeset
202 // A broken pipe should not result in a error
53af26aa5951 rhg: handle broken pipe error for stderr
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45366
diff changeset
203 // like with `| head` for example
53af26aa5951 rhg: handle broken pipe error for stderr
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45366
diff changeset
204 if let ErrorKind::BrokenPipe = error.kind() {
53af26aa5951 rhg: handle broken pipe error for stderr
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45366
diff changeset
205 return Ok(());
53af26aa5951 rhg: handle broken pipe error for stderr
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45366
diff changeset
206 }
53af26aa5951 rhg: handle broken pipe error for stderr
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45366
diff changeset
207 Err(UiError::StdoutError(error))
53af26aa5951 rhg: handle broken pipe error for stderr
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45366
diff changeset
208 }
45528
66756b34c06e rhg: add a `DebugData` `Command` to prepare the `rhg debugdata` subcommand
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45440
diff changeset
209
48733
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
210 /// Should formatted output be used?
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
211 ///
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
212 /// Note: rhg does not have the formatter mechanism yet,
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
213 /// but this is also used when deciding whether to use color.
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
214 pub fn formatted(config: &Config) -> Result<bool, HgError> {
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
215 if let Some(formatted) = config.get_option(b"ui", b"formatted")? {
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
216 Ok(formatted)
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
217 } else {
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
218 isatty(config)
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
219 }
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
220 }
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
221
50536
74e4dbb0fcd5 rhg: make `rhg files` work if `ui.relative-files=true` is specified
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 49981
diff changeset
222 pub enum RelativePaths {
74e4dbb0fcd5 rhg: make `rhg files` work if `ui.relative-files=true` is specified
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 49981
diff changeset
223 Legacy,
74e4dbb0fcd5 rhg: make `rhg files` work if `ui.relative-files=true` is specified
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 49981
diff changeset
224 Bool(bool),
74e4dbb0fcd5 rhg: make `rhg files` work if `ui.relative-files=true` is specified
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 49981
diff changeset
225 }
74e4dbb0fcd5 rhg: make `rhg files` work if `ui.relative-files=true` is specified
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 49981
diff changeset
226
74e4dbb0fcd5 rhg: make `rhg files` work if `ui.relative-files=true` is specified
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 49981
diff changeset
227 pub fn relative_paths(config: &Config) -> Result<RelativePaths, HgError> {
74e4dbb0fcd5 rhg: make `rhg files` work if `ui.relative-files=true` is specified
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 49981
diff changeset
228 Ok(match config.get(b"ui", b"relative-paths") {
74e4dbb0fcd5 rhg: make `rhg files` work if `ui.relative-files=true` is specified
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 49981
diff changeset
229 None | Some(b"legacy") => RelativePaths::Legacy,
74e4dbb0fcd5 rhg: make `rhg files` work if `ui.relative-files=true` is specified
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 49981
diff changeset
230 _ => RelativePaths::Bool(config.get_bool(b"ui", b"relative-paths")?),
74e4dbb0fcd5 rhg: make `rhg files` work if `ui.relative-files=true` is specified
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 49981
diff changeset
231 })
74e4dbb0fcd5 rhg: make `rhg files` work if `ui.relative-files=true` is specified
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 49981
diff changeset
232 }
74e4dbb0fcd5 rhg: make `rhg files` work if `ui.relative-files=true` is specified
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 49981
diff changeset
233
48733
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
234 fn isatty(config: &Config) -> Result<bool, HgError> {
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
235 Ok(if config.get_bool(b"ui", b"nontty")? {
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
236 false
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
237 } else {
52309
56e8841a454c rust: remove `atty` dependency
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52303
diff changeset
238 std::io::stdout().is_terminal()
48733
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
239 })
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
240 }
49981
364e78389653 rust-ui: refactor ui code for printing narrow/sparse warnings
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49513
diff changeset
241
364e78389653 rust-ui: refactor ui code for printing narrow/sparse warnings
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49513
diff changeset
242 /// Return the formatted bytestring corresponding to a pattern file warning,
364e78389653 rust-ui: refactor ui code for printing narrow/sparse warnings
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49513
diff changeset
243 /// as expected by the CLI.
364e78389653 rust-ui: refactor ui code for printing narrow/sparse warnings
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49513
diff changeset
244 pub(crate) fn format_pattern_file_warning(
364e78389653 rust-ui: refactor ui code for printing narrow/sparse warnings
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49513
diff changeset
245 warning: &PatternFileWarning,
364e78389653 rust-ui: refactor ui code for printing narrow/sparse warnings
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49513
diff changeset
246 repo: &Repo,
364e78389653 rust-ui: refactor ui code for printing narrow/sparse warnings
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49513
diff changeset
247 ) -> Vec<u8> {
364e78389653 rust-ui: refactor ui code for printing narrow/sparse warnings
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49513
diff changeset
248 match warning {
364e78389653 rust-ui: refactor ui code for printing narrow/sparse warnings
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49513
diff changeset
249 PatternFileWarning::InvalidSyntax(path, syntax) => format_bytes!(
364e78389653 rust-ui: refactor ui code for printing narrow/sparse warnings
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49513
diff changeset
250 b"{}: ignoring invalid syntax '{}'\n",
364e78389653 rust-ui: refactor ui code for printing narrow/sparse warnings
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49513
diff changeset
251 get_bytes_from_path(path),
51117
532e74ad3ff6 rust: run a clippy pass with the latest stable version
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50536
diff changeset
252 syntax
49981
364e78389653 rust-ui: refactor ui code for printing narrow/sparse warnings
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49513
diff changeset
253 ),
364e78389653 rust-ui: refactor ui code for printing narrow/sparse warnings
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49513
diff changeset
254 PatternFileWarning::NoSuchFile(path) => {
364e78389653 rust-ui: refactor ui code for printing narrow/sparse warnings
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49513
diff changeset
255 let path = if let Ok(relative) =
364e78389653 rust-ui: refactor ui code for printing narrow/sparse warnings
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49513
diff changeset
256 path.strip_prefix(repo.working_directory_path())
364e78389653 rust-ui: refactor ui code for printing narrow/sparse warnings
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49513
diff changeset
257 {
364e78389653 rust-ui: refactor ui code for printing narrow/sparse warnings
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49513
diff changeset
258 relative
364e78389653 rust-ui: refactor ui code for printing narrow/sparse warnings
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49513
diff changeset
259 } else {
51117
532e74ad3ff6 rust: run a clippy pass with the latest stable version
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50536
diff changeset
260 path
49981
364e78389653 rust-ui: refactor ui code for printing narrow/sparse warnings
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49513
diff changeset
261 };
364e78389653 rust-ui: refactor ui code for printing narrow/sparse warnings
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49513
diff changeset
262 format_bytes!(
364e78389653 rust-ui: refactor ui code for printing narrow/sparse warnings
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49513
diff changeset
263 b"skipping unreadable pattern file '{}': \
364e78389653 rust-ui: refactor ui code for printing narrow/sparse warnings
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49513
diff changeset
264 No such file or directory\n",
364e78389653 rust-ui: refactor ui code for printing narrow/sparse warnings
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49513
diff changeset
265 get_bytes_from_path(path),
364e78389653 rust-ui: refactor ui code for printing narrow/sparse warnings
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49513
diff changeset
266 )
364e78389653 rust-ui: refactor ui code for printing narrow/sparse warnings
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49513
diff changeset
267 }
364e78389653 rust-ui: refactor ui code for printing narrow/sparse warnings
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49513
diff changeset
268 }
364e78389653 rust-ui: refactor ui code for printing narrow/sparse warnings
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49513
diff changeset
269 }
364e78389653 rust-ui: refactor ui code for printing narrow/sparse warnings
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49513
diff changeset
270
364e78389653 rust-ui: refactor ui code for printing narrow/sparse warnings
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49513
diff changeset
271 /// Print with `Ui` the formatted bytestring corresponding to a
364e78389653 rust-ui: refactor ui code for printing narrow/sparse warnings
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49513
diff changeset
272 /// sparse/narrow warning, as expected by the CLI.
364e78389653 rust-ui: refactor ui code for printing narrow/sparse warnings
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49513
diff changeset
273 pub(crate) fn print_narrow_sparse_warnings(
364e78389653 rust-ui: refactor ui code for printing narrow/sparse warnings
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49513
diff changeset
274 narrow_warnings: &[sparse::SparseWarning],
364e78389653 rust-ui: refactor ui code for printing narrow/sparse warnings
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49513
diff changeset
275 sparse_warnings: &[sparse::SparseWarning],
364e78389653 rust-ui: refactor ui code for printing narrow/sparse warnings
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49513
diff changeset
276 ui: &Ui,
364e78389653 rust-ui: refactor ui code for printing narrow/sparse warnings
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49513
diff changeset
277 repo: &Repo,
364e78389653 rust-ui: refactor ui code for printing narrow/sparse warnings
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49513
diff changeset
278 ) -> Result<(), CommandError> {
364e78389653 rust-ui: refactor ui code for printing narrow/sparse warnings
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49513
diff changeset
279 for warning in narrow_warnings.iter().chain(sparse_warnings) {
364e78389653 rust-ui: refactor ui code for printing narrow/sparse warnings
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49513
diff changeset
280 match &warning {
364e78389653 rust-ui: refactor ui code for printing narrow/sparse warnings
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49513
diff changeset
281 sparse::SparseWarning::RootWarning { context, line } => {
364e78389653 rust-ui: refactor ui code for printing narrow/sparse warnings
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49513
diff changeset
282 let msg = format_bytes!(
364e78389653 rust-ui: refactor ui code for printing narrow/sparse warnings
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49513
diff changeset
283 b"warning: {} profile cannot use paths \"
364e78389653 rust-ui: refactor ui code for printing narrow/sparse warnings
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49513
diff changeset
284 starting with /, ignoring {}\n",
364e78389653 rust-ui: refactor ui code for printing narrow/sparse warnings
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49513
diff changeset
285 context,
364e78389653 rust-ui: refactor ui code for printing narrow/sparse warnings
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49513
diff changeset
286 line
364e78389653 rust-ui: refactor ui code for printing narrow/sparse warnings
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49513
diff changeset
287 );
364e78389653 rust-ui: refactor ui code for printing narrow/sparse warnings
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49513
diff changeset
288 ui.write_stderr(&msg)?;
364e78389653 rust-ui: refactor ui code for printing narrow/sparse warnings
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49513
diff changeset
289 }
364e78389653 rust-ui: refactor ui code for printing narrow/sparse warnings
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49513
diff changeset
290 sparse::SparseWarning::ProfileNotFound { profile, rev } => {
364e78389653 rust-ui: refactor ui code for printing narrow/sparse warnings
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49513
diff changeset
291 let msg = format_bytes!(
364e78389653 rust-ui: refactor ui code for printing narrow/sparse warnings
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49513
diff changeset
292 b"warning: sparse profile '{}' not found \"
364e78389653 rust-ui: refactor ui code for printing narrow/sparse warnings
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49513
diff changeset
293 in rev {} - ignoring it\n",
364e78389653 rust-ui: refactor ui code for printing narrow/sparse warnings
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49513
diff changeset
294 profile,
364e78389653 rust-ui: refactor ui code for printing narrow/sparse warnings
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49513
diff changeset
295 rev
364e78389653 rust-ui: refactor ui code for printing narrow/sparse warnings
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49513
diff changeset
296 );
364e78389653 rust-ui: refactor ui code for printing narrow/sparse warnings
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49513
diff changeset
297 ui.write_stderr(&msg)?;
364e78389653 rust-ui: refactor ui code for printing narrow/sparse warnings
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49513
diff changeset
298 }
364e78389653 rust-ui: refactor ui code for printing narrow/sparse warnings
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49513
diff changeset
299 sparse::SparseWarning::Pattern(e) => {
364e78389653 rust-ui: refactor ui code for printing narrow/sparse warnings
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49513
diff changeset
300 ui.write_stderr(&format_pattern_file_warning(e, repo))?;
364e78389653 rust-ui: refactor ui code for printing narrow/sparse warnings
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49513
diff changeset
301 }
364e78389653 rust-ui: refactor ui code for printing narrow/sparse warnings
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49513
diff changeset
302 }
364e78389653 rust-ui: refactor ui code for printing narrow/sparse warnings
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49513
diff changeset
303 }
364e78389653 rust-ui: refactor ui code for printing narrow/sparse warnings
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49513
diff changeset
304 Ok(())
364e78389653 rust-ui: refactor ui code for printing narrow/sparse warnings
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49513
diff changeset
305 }