Mercurial > hg-stable
changeset 45384:5fe25f8ef5d9
rhg: add a `Files` `Command` to prepare the `rhg files` subcommand
Differential Revision: https://phab.mercurial-scm.org/D8868
author | Antoine Cezar <antoine.cezar@octobus.net> |
---|---|
date | Wed, 29 Jul 2020 10:21:17 +0200 |
parents | 5dbf875b3275 |
children | 26440adbe3e9 |
files | rust/hg-core/src/lib.rs rust/rhg/src/commands.rs rust/rhg/src/commands/files.rs rust/rhg/src/error.rs |
diffstat | 4 files changed, 56 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/rust/hg-core/src/lib.rs Wed Jul 29 15:49:44 2020 +0200 +++ b/rust/hg-core/src/lib.rs Wed Jul 29 10:21:17 2020 +0200 @@ -57,6 +57,7 @@ pub enum DirstateParseError { TooLittleData, Overflow, + // TODO refactor to use bytes instead of String CorruptedEntry(String), Damaged, }
--- a/rust/rhg/src/commands.rs Wed Jul 29 15:49:44 2020 +0200 +++ b/rust/rhg/src/commands.rs Wed Jul 29 10:21:17 2020 +0200 @@ -1,3 +1,4 @@ +pub mod files; pub mod root; use crate::error::CommandError;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/rust/rhg/src/commands/files.rs Wed Jul 29 10:21:17 2020 +0200 @@ -0,0 +1,50 @@ +use crate::commands::Command; +use crate::error::{CommandError, CommandErrorKind}; +use crate::ui::Ui; +use hg::operations::{ListTrackedFiles, ListTrackedFilesErrorKind}; + +pub const HELP_TEXT: &str = " +List tracked files. + +Returns 0 on success. +"; + +pub struct FilesCommand<'a> { + ui: &'a Ui, +} + +impl<'a> FilesCommand<'a> { + pub fn new(ui: &'a Ui) -> Self { + FilesCommand { ui } + } +} + +impl<'a> Command<'a> for FilesCommand<'a> { + fn run(&self) -> Result<(), CommandError> { + let operation_builder = ListTrackedFiles::new()?; + let operation = operation_builder.load().map_err(|err| { + CommandErrorKind::Abort(Some( + [b"abort: ", err.to_string().as_bytes(), b"\n"] + .concat() + .to_vec(), + )) + })?; + let files = operation.run().map_err(|err| match err.kind { + ListTrackedFilesErrorKind::ParseError(_) => { + CommandErrorKind::Abort(Some( + // TODO find a better error message + b"abort: parse error\n".to_vec(), + )) + } + })?; + + let mut stdout = self.ui.stdout_buffer(); + for file in files { + stdout.write_all(file.as_bytes())?; + stdout.write_all(b"\n")?; + } + stdout.flush()?; + + Ok(()) + } +}
--- a/rust/rhg/src/error.rs Wed Jul 29 15:49:44 2020 +0200 +++ b/rust/rhg/src/error.rs Wed Jul 29 10:21:17 2020 +0200 @@ -16,6 +16,8 @@ StdoutError, /// The standard error stream cannot be written to StderrError, + /// The command aborted + Abort(Option<Vec<u8>>), } impl CommandErrorKind { @@ -25,6 +27,7 @@ CommandErrorKind::CurrentDirNotFound(_) => exitcode::ABORT, CommandErrorKind::StdoutError => exitcode::ABORT, CommandErrorKind::StderrError => exitcode::ABORT, + CommandErrorKind::Abort(_) => exitcode::ABORT, } } @@ -52,6 +55,7 @@ ] .concat(), ), + CommandErrorKind::Abort(message) => message.to_owned(), _ => None, } }