rust/rhg/src/ui.rs
author Pierre-Yves David <pierre-yves.david@octobus.net>
Thu, 02 Jan 2025 14:50:06 +0100
changeset 52592 87ceb51d124c
parent 52309 56e8841a454c
child 52726 65839176cea9
permissions -rw-r--r--
run-tests: drop jython support I don't think we heard anything about jython support for the past 15 years, so let's drop special support for it in run-tests.py it is most probably broken at that point.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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;
48731
f591b377375f rhg: Make Ui::new falliable, add Ui::new_infallible
Simon Sapin <simon.sapin@octobus.net>
parents: 48730
diff changeset
     8
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
     9
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
    10
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
    11
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
    12
use hg::utils::files::get_bytes_from_path;
45528
66756b34c06e rhg: add a `DebugData` `Command` to prepare the `rhg debugdata` subcommand
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45440
diff changeset
    13
use std::borrow::Cow;
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;
52309
56e8841a454c rust: remove `atty` dependency
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52303
diff changeset
    15
use std::io::IsTerminal;
45362
eb55274d3650 rhg: add buffered stdout writing possibility
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45049
diff changeset
    16
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
    17
45362
eb55274d3650 rhg: add buffered stdout writing possibility
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45049
diff changeset
    18
pub struct Ui {
eb55274d3650 rhg: add buffered stdout writing possibility
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45049
diff changeset
    19
    stdout: std::io::Stdout,
eb55274d3650 rhg: add buffered stdout writing possibility
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45049
diff changeset
    20
    stderr: std::io::Stderr,
48733
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
    21
    colors: Option<ColorConfig>,
45362
eb55274d3650 rhg: add buffered stdout writing possibility
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45049
diff changeset
    22
}
45049
513b3ef277a3 rhg: add RootCommand using hg-core FindRoot operation to prepare `hg root`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
    23
513b3ef277a3 rhg: add RootCommand using hg-core FindRoot operation to prepare `hg root`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
    24
/// 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
    25
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
    26
    /// 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
    27
    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
    28
    /// 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
    29
    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
    30
}
513b3ef277a3 rhg: add RootCommand using hg-core FindRoot operation to prepare `hg root`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
    31
513b3ef277a3 rhg: add RootCommand using hg-core FindRoot operation to prepare `hg root`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
    32
/// 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
    33
impl Ui {
48733
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
    34
    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
    35
        Ok(Ui {
48733
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
    36
            // 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
    37
            stdout: std::io::stdout(),
48733
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
    38
48731
f591b377375f rhg: Make Ui::new falliable, add Ui::new_infallible
Simon Sapin <simon.sapin@octobus.net>
parents: 48730
diff changeset
    39
            stderr: std::io::stderr(),
48733
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
    40
            colors: ColorConfig::new(config)?,
48731
f591b377375f rhg: Make Ui::new falliable, add Ui::new_infallible
Simon Sapin <simon.sapin@octobus.net>
parents: 48730
diff changeset
    41
        })
f591b377375f rhg: Make Ui::new falliable, add Ui::new_infallible
Simon Sapin <simon.sapin@octobus.net>
parents: 48730
diff changeset
    42
    }
f591b377375f rhg: Make Ui::new falliable, add Ui::new_infallible
Simon Sapin <simon.sapin@octobus.net>
parents: 48730
diff changeset
    43
f591b377375f rhg: Make Ui::new falliable, add Ui::new_infallible
Simon Sapin <simon.sapin@octobus.net>
parents: 48730
diff changeset
    44
    /// 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
    45
    ///
f591b377375f rhg: Make Ui::new falliable, add Ui::new_infallible
Simon Sapin <simon.sapin@octobus.net>
parents: 48730
diff changeset
    46
    /// 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
    47
    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
    48
        Ui {
48733
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
    49
            // 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
    50
            stdout: std::io::stdout(),
48733
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
    51
45362
eb55274d3650 rhg: add buffered stdout writing possibility
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45049
diff changeset
    52
            stderr: std::io::stderr(),
48733
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
    53
            colors: ColorConfig::new(config).unwrap_or(None),
45362
eb55274d3650 rhg: add buffered stdout writing possibility
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45049
diff changeset
    54
        }
eb55274d3650 rhg: add buffered stdout writing possibility
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45049
diff changeset
    55
    }
eb55274d3650 rhg: add buffered stdout writing possibility
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45049
diff changeset
    56
eb55274d3650 rhg: add buffered stdout writing possibility
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45049
diff changeset
    57
    /// 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
    58
    /// operations.
eb55274d3650 rhg: add buffered stdout writing possibility
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45049
diff changeset
    59
    pub fn stdout_buffer(&self) -> StdoutBuffer<std::io::StdoutLock> {
eb55274d3650 rhg: add buffered stdout writing possibility
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45049
diff changeset
    60
        StdoutBuffer::new(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
    61
    }
513b3ef277a3 rhg: add RootCommand using hg-core FindRoot operation to prepare `hg root`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
    62
513b3ef277a3 rhg: add RootCommand using hg-core FindRoot operation to prepare `hg root`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
    63
    /// 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
    64
    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
    65
        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
    66
45439
fbc373b7cbc3 rhg: fix `clippy` warnings
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45367
diff changeset
    67
        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
    68
45439
fbc373b7cbc3 rhg: fix `clippy` warnings
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45367
diff changeset
    69
        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
    70
    }
513b3ef277a3 rhg: add RootCommand using hg-core FindRoot operation to prepare `hg root`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
    71
513b3ef277a3 rhg: add RootCommand using hg-core FindRoot operation to prepare `hg root`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
    72
    /// 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
    73
    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
    74
        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
    75
45439
fbc373b7cbc3 rhg: fix `clippy` warnings
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45367
diff changeset
    76
        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
    77
45439
fbc373b7cbc3 rhg: fix `clippy` warnings
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45367
diff changeset
    78
        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
    79
    }
48176
38deb65d4441 rhg: add ui.plain() and check it before showing relative paths in status
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46591
diff changeset
    80
48733
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
    81
    /// 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
    82
    ///
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
    83
    /// 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
    84
    /// 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
    85
    pub fn write_stdout_labelled(
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
    86
        &self,
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
    87
        bytes: &[u8],
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
    88
        label: &str,
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
    89
    ) -> Result<(), UiError> {
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
    90
        if let Some(colors) = &self.colors {
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
    91
            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
    92
                if !effects.is_empty() {
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
    93
                    return self
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
    94
                        .write_stdout_with_effects(bytes, effects)
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
    95
                        .or_else(handle_stdout_error);
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
    96
                }
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
    97
            }
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
    98
        }
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
    99
        self.write_stdout(bytes)
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
   100
    }
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
   101
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
   102
    fn write_stdout_with_effects(
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
   103
        &self,
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
   104
        bytes: &[u8],
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
   105
        effects: &[Effect],
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
   106
    ) -> io::Result<()> {
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
   107
        let stdout = &mut self.stdout.lock();
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
   108
        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
   109
            // `line` does not include the newline delimiter
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
   110
            if !first {
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
   111
                stdout.write_all(b"\n")?;
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
   112
            }
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
   113
            if line.is_empty() {
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
   114
                return Ok(());
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
   115
            }
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
   116
            /// 0x1B == 27 == 0o33
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
   117
            const ASCII_ESCAPE: &[u8] = b"\x1b";
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
   118
            write_bytes!(stdout, b"{}[0", ASCII_ESCAPE)?;
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
   119
            for effect in effects {
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
   120
                write_bytes!(stdout, b";{}", effect)?;
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
   121
            }
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
   122
            write_bytes!(stdout, b"m")?;
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
   123
            stdout.write_all(line)?;
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
   124
            write_bytes!(stdout, b"{}[0m", ASCII_ESCAPE)
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
   125
        };
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
   126
        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
   127
        if let Some(first) = lines.next() {
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
   128
            write_line(first, true)?;
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
   129
            for line in lines {
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
   130
                write_line(line, false)?
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
   131
            }
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
   132
        }
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
   133
        stdout.flush()
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
   134
    }
48729
99b1dfc06571 rhg: Add support for HGPLAINEXPECT
Simon Sapin <simon.sapin@octobus.net>
parents: 48513
diff changeset
   135
}
99b1dfc06571 rhg: Add support for HGPLAINEXPECT
Simon Sapin <simon.sapin@octobus.net>
parents: 48513
diff changeset
   136
49513
467d9df98c68 rhg: centralize PlainInfo
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 49512
diff changeset
   137
// TODO: pass the PlainInfo to call sites directly and
467d9df98c68 rhg: centralize PlainInfo
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 49512
diff changeset
   138
// delete this function
48733
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
   139
pub fn plain(opt_feature: Option<&str>) -> bool {
49513
467d9df98c68 rhg: centralize PlainInfo
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 49512
diff changeset
   140
    let plain_info = PlainInfo::from_env();
467d9df98c68 rhg: centralize PlainInfo
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 49512
diff changeset
   141
    match opt_feature {
467d9df98c68 rhg: centralize PlainInfo
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 49512
diff changeset
   142
        None => plain_info.is_plain(),
467d9df98c68 rhg: centralize PlainInfo
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 49512
diff changeset
   143
        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
   144
    }
45049
513b3ef277a3 rhg: add RootCommand using hg-core FindRoot operation to prepare `hg root`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   145
}
45362
eb55274d3650 rhg: add buffered stdout writing possibility
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45049
diff changeset
   146
eb55274d3650 rhg: add buffered stdout writing possibility
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45049
diff changeset
   147
/// A buffered stdout writer for faster batch printing operations.
eb55274d3650 rhg: add buffered stdout writing possibility
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45049
diff changeset
   148
pub struct StdoutBuffer<W: Write> {
eb55274d3650 rhg: add buffered stdout writing possibility
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45049
diff changeset
   149
    buf: io::BufWriter<W>,
eb55274d3650 rhg: add buffered stdout writing possibility
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45049
diff changeset
   150
}
eb55274d3650 rhg: add buffered stdout writing possibility
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45049
diff changeset
   151
eb55274d3650 rhg: add buffered stdout writing possibility
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45049
diff changeset
   152
impl<W: Write> StdoutBuffer<W> {
eb55274d3650 rhg: add buffered stdout writing possibility
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45049
diff changeset
   153
    pub fn new(writer: W) -> Self {
eb55274d3650 rhg: add buffered stdout writing possibility
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45049
diff changeset
   154
        let buf = io::BufWriter::new(writer);
eb55274d3650 rhg: add buffered stdout writing possibility
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45049
diff changeset
   155
        Self { buf }
eb55274d3650 rhg: add buffered stdout writing possibility
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45049
diff changeset
   156
    }
eb55274d3650 rhg: add buffered stdout writing possibility
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45049
diff changeset
   157
eb55274d3650 rhg: add buffered stdout writing possibility
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45049
diff changeset
   158
    /// Write bytes to stdout buffer
eb55274d3650 rhg: add buffered stdout writing possibility
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45049
diff changeset
   159
    pub fn write_all(&mut self, bytes: &[u8]) -> Result<(), UiError> {
45439
fbc373b7cbc3 rhg: fix `clippy` warnings
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45367
diff changeset
   160
        self.buf.write_all(bytes).or_else(handle_stdout_error)
45362
eb55274d3650 rhg: add buffered stdout writing possibility
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45049
diff changeset
   161
    }
eb55274d3650 rhg: add buffered stdout writing possibility
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45049
diff changeset
   162
eb55274d3650 rhg: add buffered stdout writing possibility
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45049
diff changeset
   163
    /// Flush bytes to stdout
eb55274d3650 rhg: add buffered stdout writing possibility
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45049
diff changeset
   164
    pub fn flush(&mut self) -> Result<(), UiError> {
45439
fbc373b7cbc3 rhg: fix `clippy` warnings
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45367
diff changeset
   165
        self.buf.flush().or_else(handle_stdout_error)
45362
eb55274d3650 rhg: add buffered stdout writing possibility
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45049
diff changeset
   166
    }
eb55274d3650 rhg: add buffered stdout writing possibility
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45049
diff changeset
   167
}
45366
10c36ead86f8 rhg: extract function handle_stdout_error
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45362
diff changeset
   168
10c36ead86f8 rhg: extract function handle_stdout_error
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45362
diff changeset
   169
/// 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
   170
/// signal that failure, otherwise just bail.
10c36ead86f8 rhg: extract function handle_stdout_error
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45362
diff changeset
   171
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
   172
    if let ErrorKind::BrokenPipe = error.kind() {
10c36ead86f8 rhg: extract function handle_stdout_error
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45362
diff changeset
   173
        // This makes `| head` work for example
10c36ead86f8 rhg: extract function handle_stdout_error
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45362
diff changeset
   174
        return Ok(());
10c36ead86f8 rhg: extract function handle_stdout_error
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45362
diff changeset
   175
    }
10c36ead86f8 rhg: extract function handle_stdout_error
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45362
diff changeset
   176
    let mut stderr = io::stderr();
10c36ead86f8 rhg: extract function handle_stdout_error
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45362
diff changeset
   177
10c36ead86f8 rhg: extract function handle_stdout_error
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45362
diff changeset
   178
    stderr
45984
fada33872b5b rhg: use `format_bytes!` for error messages
Rapha?l Gom?s <rgomes@octobus.net>
parents: 45528
diff changeset
   179
        .write_all(&format_bytes!(
fada33872b5b rhg: use `format_bytes!` for error messages
Rapha?l Gom?s <rgomes@octobus.net>
parents: 45528
diff changeset
   180
            b"abort: {}\n",
fada33872b5b rhg: use `format_bytes!` for error messages
Rapha?l Gom?s <rgomes@octobus.net>
parents: 45528
diff changeset
   181
            error.to_string().as_bytes()
fada33872b5b rhg: use `format_bytes!` for error messages
Rapha?l Gom?s <rgomes@octobus.net>
parents: 45528
diff changeset
   182
        ))
45439
fbc373b7cbc3 rhg: fix `clippy` warnings
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45367
diff changeset
   183
        .map_err(UiError::StderrError)?;
45366
10c36ead86f8 rhg: extract function handle_stdout_error
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45362
diff changeset
   184
45439
fbc373b7cbc3 rhg: fix `clippy` warnings
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45367
diff changeset
   185
    stderr.flush().map_err(UiError::StderrError)?;
45366
10c36ead86f8 rhg: extract function handle_stdout_error
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45362
diff changeset
   186
10c36ead86f8 rhg: extract function handle_stdout_error
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45362
diff changeset
   187
    Err(UiError::StdoutError(error))
10c36ead86f8 rhg: extract function handle_stdout_error
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45362
diff changeset
   188
}
45367
53af26aa5951 rhg: handle broken pipe error for stderr
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45366
diff changeset
   189
53af26aa5951 rhg: handle broken pipe error for stderr
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45366
diff changeset
   190
/// 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
   191
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
   192
    // 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
   193
    // like with `| head` for example
53af26aa5951 rhg: handle broken pipe error for stderr
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45366
diff changeset
   194
    if let ErrorKind::BrokenPipe = error.kind() {
53af26aa5951 rhg: handle broken pipe error for stderr
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45366
diff changeset
   195
        return Ok(());
53af26aa5951 rhg: handle broken pipe error for stderr
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45366
diff changeset
   196
    }
53af26aa5951 rhg: handle broken pipe error for stderr
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45366
diff changeset
   197
    Err(UiError::StdoutError(error))
53af26aa5951 rhg: handle broken pipe error for stderr
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45366
diff changeset
   198
}
45528
66756b34c06e rhg: add a `DebugData` `Command` to prepare the `rhg debugdata` subcommand
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45440
diff changeset
   199
66756b34c06e rhg: add a `DebugData` `Command` to prepare the `rhg debugdata` subcommand
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45440
diff changeset
   200
/// Encode rust strings according to the user system.
66756b34c06e rhg: add a `DebugData` `Command` to prepare the `rhg debugdata` subcommand
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45440
diff changeset
   201
pub fn utf8_to_local(s: &str) -> Cow<[u8]> {
66756b34c06e rhg: add a `DebugData` `Command` to prepare the `rhg debugdata` subcommand
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45440
diff changeset
   202
    // TODO encode for the user's system //
66756b34c06e rhg: add a `DebugData` `Command` to prepare the `rhg debugdata` subcommand
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45440
diff changeset
   203
    let bytes = s.as_bytes();
66756b34c06e rhg: add a `DebugData` `Command` to prepare the `rhg debugdata` subcommand
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45440
diff changeset
   204
    Cow::Borrowed(bytes)
66756b34c06e rhg: add a `DebugData` `Command` to prepare the `rhg debugdata` subcommand
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45440
diff changeset
   205
}
48733
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
   206
48770
f19be290756a rhg: signal when falling back in logs
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48734
diff changeset
   207
/// Decode user system bytes to Rust string.
f19be290756a rhg: signal when falling back in logs
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48734
diff changeset
   208
pub fn local_to_utf8(s: &[u8]) -> Cow<str> {
f19be290756a rhg: signal when falling back in logs
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48734
diff changeset
   209
    // TODO decode from the user's system
f19be290756a rhg: signal when falling back in logs
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48734
diff changeset
   210
    String::from_utf8_lossy(s)
f19be290756a rhg: signal when falling back in logs
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48734
diff changeset
   211
}
f19be290756a rhg: signal when falling back in logs
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48734
diff changeset
   212
48733
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
   213
/// Should formatted output be used?
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
   214
///
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
   215
/// 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
   216
/// 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
   217
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
   218
    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
   219
        Ok(formatted)
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
   220
    } else {
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
   221
        isatty(config)
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
   222
    }
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
   223
}
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
   224
50536
74e4dbb0fcd5 rhg: make `rhg files` work if `ui.relative-files=true` is specified
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 49981
diff changeset
   225
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
   226
    Legacy,
74e4dbb0fcd5 rhg: make `rhg files` work if `ui.relative-files=true` is specified
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 49981
diff changeset
   227
    Bool(bool),
74e4dbb0fcd5 rhg: make `rhg files` work if `ui.relative-files=true` is specified
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 49981
diff changeset
   228
}
74e4dbb0fcd5 rhg: make `rhg files` work if `ui.relative-files=true` is specified
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 49981
diff changeset
   229
74e4dbb0fcd5 rhg: make `rhg files` work if `ui.relative-files=true` is specified
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 49981
diff changeset
   230
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
   231
    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
   232
        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
   233
        _ => 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
   234
    })
74e4dbb0fcd5 rhg: make `rhg files` work if `ui.relative-files=true` is specified
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 49981
diff changeset
   235
}
74e4dbb0fcd5 rhg: make `rhg files` work if `ui.relative-files=true` is specified
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 49981
diff changeset
   236
48733
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
   237
fn isatty(config: &Config) -> Result<bool, HgError> {
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
   238
    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
   239
        false
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
   240
    } else {
52309
56e8841a454c rust: remove `atty` dependency
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52303
diff changeset
   241
        std::io::stdout().is_terminal()
48733
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
   242
    })
39c447e03dbc rhg: Add support for colored output
Simon Sapin <simon.sapin@octobus.net>
parents: 48731
diff changeset
   243
}
49981
364e78389653 rust-ui: refactor ui code for printing narrow/sparse warnings
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49513
diff changeset
   244
364e78389653 rust-ui: refactor ui code for printing narrow/sparse warnings
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49513
diff changeset
   245
/// 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
   246
/// 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
   247
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
   248
    warning: &PatternFileWarning,
364e78389653 rust-ui: refactor ui code for printing narrow/sparse warnings
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49513
diff changeset
   249
    repo: &Repo,
364e78389653 rust-ui: refactor ui code for printing narrow/sparse warnings
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49513
diff changeset
   250
) -> Vec<u8> {
364e78389653 rust-ui: refactor ui code for printing narrow/sparse warnings
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49513
diff changeset
   251
    match warning {
364e78389653 rust-ui: refactor ui code for printing narrow/sparse warnings
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49513
diff changeset
   252
        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
   253
            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
   254
            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
   255
            syntax
49981
364e78389653 rust-ui: refactor ui code for printing narrow/sparse warnings
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49513
diff changeset
   256
        ),
364e78389653 rust-ui: refactor ui code for printing narrow/sparse warnings
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49513
diff changeset
   257
        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
   258
            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
   259
                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
   260
            {
364e78389653 rust-ui: refactor ui code for printing narrow/sparse warnings
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49513
diff changeset
   261
                relative
364e78389653 rust-ui: refactor ui code for printing narrow/sparse warnings
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49513
diff changeset
   262
            } else {
51117
532e74ad3ff6 rust: run a clippy pass with the latest stable version
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50536
diff changeset
   263
                path
49981
364e78389653 rust-ui: refactor ui code for printing narrow/sparse warnings
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49513
diff changeset
   264
            };
364e78389653 rust-ui: refactor ui code for printing narrow/sparse warnings
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49513
diff changeset
   265
            format_bytes!(
364e78389653 rust-ui: refactor ui code for printing narrow/sparse warnings
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49513
diff changeset
   266
                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
   267
                    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
   268
                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
   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
    }
364e78389653 rust-ui: refactor ui code for printing narrow/sparse warnings
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49513
diff changeset
   272
}
364e78389653 rust-ui: refactor ui code for printing narrow/sparse warnings
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49513
diff changeset
   273
364e78389653 rust-ui: refactor ui code for printing narrow/sparse warnings
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49513
diff changeset
   274
/// 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
   275
/// 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
   276
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
   277
    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
   278
    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
   279
    ui: &Ui,
364e78389653 rust-ui: refactor ui code for printing narrow/sparse warnings
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49513
diff changeset
   280
    repo: &Repo,
364e78389653 rust-ui: refactor ui code for printing narrow/sparse warnings
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49513
diff changeset
   281
) -> Result<(), CommandError> {
364e78389653 rust-ui: refactor ui code for printing narrow/sparse warnings
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49513
diff changeset
   282
    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
   283
        match &warning {
364e78389653 rust-ui: refactor ui code for printing narrow/sparse warnings
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49513
diff changeset
   284
            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
   285
                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
   286
                    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
   287
                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
   288
                    context,
364e78389653 rust-ui: refactor ui code for printing narrow/sparse warnings
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49513
diff changeset
   289
                    line
364e78389653 rust-ui: refactor ui code for printing narrow/sparse warnings
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49513
diff changeset
   290
                );
364e78389653 rust-ui: refactor ui code for printing narrow/sparse warnings
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49513
diff changeset
   291
                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
   292
            }
364e78389653 rust-ui: refactor ui code for printing narrow/sparse warnings
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49513
diff changeset
   293
            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
   294
                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
   295
                    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
   296
                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
   297
                    profile,
364e78389653 rust-ui: refactor ui code for printing narrow/sparse warnings
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49513
diff changeset
   298
                    rev
364e78389653 rust-ui: refactor ui code for printing narrow/sparse warnings
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49513
diff changeset
   299
                );
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(&msg)?;
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
            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
   303
                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
   304
            }
364e78389653 rust-ui: refactor ui code for printing narrow/sparse warnings
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49513
diff changeset
   305
        }
364e78389653 rust-ui: refactor ui code for printing narrow/sparse warnings
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49513
diff changeset
   306
    }
364e78389653 rust-ui: refactor ui code for printing narrow/sparse warnings
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49513
diff changeset
   307
    Ok(())
364e78389653 rust-ui: refactor ui code for printing narrow/sparse warnings
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49513
diff changeset
   308
}