Mercurial > public > mercurial-scm > hg
diff rust/rhg/src/commands/debugdata.rs @ 45528:66756b34c06e
rhg: add a `DebugData` `Command` to prepare the `rhg debugdata` subcommand
Differential Revision: https://phab.mercurial-scm.org/D8960
author | Antoine Cezar <antoine.cezar@octobus.net> |
---|---|
date | Wed, 09 Sep 2020 12:07:05 +0200 |
parents | |
children | b1cea0dc9db0 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/rust/rhg/src/commands/debugdata.rs Wed Sep 09 12:07:05 2020 +0200 @@ -0,0 +1,80 @@ +use crate::commands::Command; +use crate::error::{CommandError, CommandErrorKind}; +use crate::ui::utf8_to_local; +use crate::ui::Ui; +use hg::operations::{ + DebugData, DebugDataError, DebugDataErrorKind, DebugDataKind, +}; + +pub const HELP_TEXT: &str = " +Dump the contents of a data file revision +"; + +pub struct DebugDataCommand<'a> { + rev: &'a str, + kind: DebugDataKind, +} + +impl<'a> DebugDataCommand<'a> { + pub fn new(rev: &'a str, kind: DebugDataKind) -> Self { + DebugDataCommand { rev, kind } + } +} + +impl<'a> Command for DebugDataCommand<'a> { + fn run(&self, ui: &Ui) -> Result<(), CommandError> { + let mut operation = DebugData::new(self.rev, self.kind); + let data = + operation.run().map_err(|e| to_command_error(self.rev, e))?; + + let mut stdout = ui.stdout_buffer(); + stdout.write_all(&data)?; + stdout.flush()?; + + Ok(()) + } +} + +/// Convert operation errors to command errors +fn to_command_error(rev: &str, err: DebugDataError) -> CommandError { + match err.kind { + DebugDataErrorKind::FindRootError(err) => CommandError::from(err), + DebugDataErrorKind::IoError(err) => CommandError { + kind: CommandErrorKind::Abort(Some( + utf8_to_local(&format!("abort: {}\n", err)).into(), + )), + }, + DebugDataErrorKind::InvalidRevision => CommandError { + kind: CommandErrorKind::Abort(Some( + utf8_to_local(&format!( + "abort: invalid revision identifier{}\n", + rev + )) + .into(), + )), + }, + DebugDataErrorKind::UnsuportedRevlogVersion(version) => CommandError { + kind: CommandErrorKind::Abort(Some( + utf8_to_local(&format!( + "abort: unsupported revlog version {}\n", + version + )) + .into(), + )), + }, + DebugDataErrorKind::CorruptedRevlog => CommandError { + kind: CommandErrorKind::Abort(Some( + "abort: corrupted revlog\n".into(), + )), + }, + DebugDataErrorKind::UnknowRevlogDataFormat(format) => CommandError { + kind: CommandErrorKind::Abort(Some( + utf8_to_local(&format!( + "abort: unknow revlog dataformat {:?}\n", + format + )) + .into(), + )), + }, + } +}