##// END OF EJS Templates
rhg: Build in release mode on CI...
rhg: Build in release mode on CI This follows e73b40c790ec which made tests use the release executable. With e73b40c790ec but not this, tests are skipped on CI because the executable is missing. Differential Revision: https://phab.mercurial-scm.org/D9907

File last commit:

r46782:8a491439 default
r47154:0da46578 default
Show More
cat.rs
105 lines | 3.4 KiB | application/rls-services+xml | RustLexer
Antoine Cezar
rhg: add a limited `rhg cat -r` subcommand...
r46113 use crate::commands::Command;
use crate::error::{CommandError, CommandErrorKind};
use crate::ui::utf8_to_local;
use crate::ui::Ui;
Simon Sapin
rust: replace most "operation" structs with functions...
r46751 use hg::operations::{cat, CatRevError, CatRevErrorKind};
Simon Sapin
rust: introduce Repo and Vfs types for filesystem abstraction...
r46782 use hg::repo::Repo;
Antoine Cezar
rhg: add a limited `rhg cat -r` subcommand...
r46113 use hg::utils::hg_path::HgPathBuf;
use micro_timer::timed;
use std::convert::TryFrom;
pub const HELP_TEXT: &str = "
Output the current or given revision of files
";
pub struct CatCommand<'a> {
rev: Option<&'a str>,
files: Vec<&'a str>,
}
impl<'a> CatCommand<'a> {
pub fn new(rev: Option<&'a str>, files: Vec<&'a str>) -> Self {
Self { rev, files }
}
fn display(&self, ui: &Ui, data: &[u8]) -> Result<(), CommandError> {
ui.write_stdout(data)?;
Ok(())
}
}
impl<'a> Command for CatCommand<'a> {
#[timed]
fn run(&self, ui: &Ui) -> Result<(), CommandError> {
Simon Sapin
rust: introduce Repo and Vfs types for filesystem abstraction...
r46782 let repo = Repo::find()?;
repo.check_requirements()?;
Antoine Cezar
rhg: add a limited `rhg cat -r` subcommand...
r46113 let cwd = std::env::current_dir()
.or_else(|e| Err(CommandErrorKind::CurrentDirNotFound(e)))?;
let mut files = vec![];
for file in self.files.iter() {
let normalized = cwd.join(&file);
let stripped = normalized
Simon Sapin
rust: introduce Repo and Vfs types for filesystem abstraction...
r46782 .strip_prefix(&repo.working_directory_path())
Antoine cezar
rhg: use `.or(Err(Error))` not `.map_err(|_| Error)` (D9100#inline-15067)...
r46178 .or(Err(CommandErrorKind::Abort(None)))?;
Antoine Cezar
rhg: add a limited `rhg cat -r` subcommand...
r46113 let hg_file = HgPathBuf::try_from(stripped.to_path_buf())
Antoine cezar
rhg: use `.or(Err(Error))` not `.map_err(|_| Error)` (D9100#inline-15067)...
r46178 .or(Err(CommandErrorKind::Abort(None)))?;
Antoine Cezar
rhg: add a limited `rhg cat -r` subcommand...
r46113 files.push(hg_file);
}
match self.rev {
Some(rev) => {
Simon Sapin
rust: introduce Repo and Vfs types for filesystem abstraction...
r46782 let data = cat(&repo, rev, &files)
Antoine Cezar
rhg: add a limited `rhg cat -r` subcommand...
r46113 .map_err(|e| map_rev_error(rev, e))?;
self.display(ui, &data)
}
None => Err(CommandErrorKind::Unimplemented.into()),
}
}
}
/// Convert `CatRevErrorKind` to `CommandError`
fn map_rev_error(rev: &str, err: CatRevError) -> CommandError {
CommandError {
kind: match err.kind {
CatRevErrorKind::IoError(err) => CommandErrorKind::Abort(Some(
utf8_to_local(&format!("abort: {}\n", err)).into(),
)),
CatRevErrorKind::InvalidRevision => CommandErrorKind::Abort(Some(
utf8_to_local(&format!(
Simon Sapin
rhg: add a test for --rev with a hex changeset ID...
r46611 "abort: invalid revision identifier {}\n",
Antoine Cezar
rhg: add a limited `rhg cat -r` subcommand...
r46113 rev
))
.into(),
)),
Simon Sapin
rhg: allow specifying a changeset ID prefix...
r46646 CatRevErrorKind::AmbiguousPrefix => CommandErrorKind::Abort(Some(
utf8_to_local(&format!(
"abort: ambiguous revision identifier {}\n",
rev
))
.into(),
)),
Antoine Cezar
rhg: add a limited `rhg cat -r` subcommand...
r46113 CatRevErrorKind::UnsuportedRevlogVersion(version) => {
CommandErrorKind::Abort(Some(
utf8_to_local(&format!(
"abort: unsupported revlog version {}\n",
version
))
.into(),
))
}
CatRevErrorKind::CorruptedRevlog => CommandErrorKind::Abort(Some(
"abort: corrupted revlog\n".into(),
)),
CatRevErrorKind::UnknowRevlogDataFormat(format) => {
CommandErrorKind::Abort(Some(
utf8_to_local(&format!(
"abort: unknow revlog dataformat {:?}\n",
format
))
.into(),
))
}
},
}
}