##// END OF EJS Templates
revlog: add a `entry_binary` method on index...
revlog: add a `entry_binary` method on index The revlog index is already responsible for unpacking the binary entry, it would be simpler to make it responsible for packing them. In practice the C version of the index is already doing this internally. We introduce a "entry_binary" method that return the binary version of an existing revision. The method currently need to also take the revlog header to deal with the "first revision" special case. We will introduce further refactor in a later changeset to split that logic out. Differential Revision: https://phab.mercurial-scm.org/D10508

File last commit:

r47478:b1f2c2b3 default
r47808:0d8ff1f4 default
Show More
cat.rs
84 lines | 2.7 KiB | application/rls-services+xml | RustLexer
Simon Sapin
rust: remove `FooError` structs with only `kind: FooErrorKind` enum field...
r47163 use crate::error::CommandError;
Simon Sapin
rhg: Move subcommand CLI arguments definitions to respective modules...
r47251 use clap::Arg;
Simon Sapin
rhg: `cat` command: print error messages for missing files...
r47478 use format_bytes::format_bytes;
Simon Sapin
rhg: replace `map_*_error` functions with `From` impls...
r47165 use hg::operations::cat;
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
";
Simon Sapin
rhg: Move subcommand CLI arguments definitions to respective modules...
r47251 pub fn args() -> clap::App<'static, 'static> {
clap::SubCommand::with_name("cat")
.arg(
Arg::with_name("rev")
.help("search the repository as it is in REV")
.short("-r")
.long("--revision")
.value_name("REV")
.takes_value(true),
)
.arg(
clap::Arg::with_name("files")
.required(true)
.multiple(true)
.empty_values(false)
.value_name("FILE")
.help("Activity to start: activity@category"),
)
.about(HELP_TEXT)
}
Simon Sapin
rhg: replace command structs with functions...
r47250 #[timed]
Simon Sapin
rhg: Group values passed to every sub-command into a struct...
r47334 pub fn run(invocation: &crate::CliInvocation) -> Result<(), CommandError> {
let rev = invocation.subcommand_args.value_of("rev");
let file_args = match invocation.subcommand_args.values_of("files") {
Simon Sapin
rhg: replace command structs with functions...
r47250 Some(files) => files.collect(),
None => vec![],
};
Antoine Cezar
rhg: add a limited `rhg cat -r` subcommand...
r46113
Simon Sapin
rhg: Move `Repo` object creation into `main()`...
r47335 let repo = invocation.repo?;
Simon Sapin
rhg: replace command structs with functions...
r47250 let cwd = hg::utils::current_dir()?;
Simon Sapin
rhg: Don’t make repository path absolute too early...
r47474 let working_directory = repo.working_directory_path();
let working_directory = cwd.join(working_directory); // Make it absolute
Simon Sapin
rhg: replace command structs with functions...
r47250
let mut files = vec![];
for file in file_args.iter() {
// TODO: actually normalize `..` path segments etc?
let normalized = cwd.join(&file);
let stripped = normalized
Simon Sapin
rhg: Don’t make repository path absolute too early...
r47474 .strip_prefix(&working_directory)
Simon Sapin
rhg: replace command structs with functions...
r47250 // TODO: error message for path arguments outside of the repo
.map_err(|_| CommandError::abort(""))?;
let hg_file = HgPathBuf::try_from(stripped.to_path_buf())
.map_err(|e| CommandError::abort(e.to_string()))?;
files.push(hg_file);
Antoine Cezar
rhg: add a limited `rhg cat -r` subcommand...
r46113 }
Simon Sapin
rhg: replace command structs with functions...
r47250 match rev {
Some(rev) => {
Simon Sapin
rhg: `cat` command: print error messages for missing files...
r47478 let output = cat(&repo, rev, &files).map_err(|e| (e, rev))?;
invocation.ui.write_stdout(&output.concatenated)?;
if !output.missing.is_empty() {
let short = format!("{:x}", output.node.short()).into_bytes();
for path in &output.missing {
invocation.ui.write_stderr(&format_bytes!(
b"{}: no such file in rev {}\n",
path.as_bytes(),
short
))?;
}
}
if output.found_any {
Ok(())
} else {
Err(CommandError::Unsuccessful)
}
Simon Sapin
rhg: replace command structs with functions...
r47250 }
Simon Sapin
rhg: Add a `rhg.on-unsupported` configuration key...
r47424 None => Err(CommandError::unsupported(
"`rhg cat` without `--rev` / `-r`",
)),
Antoine Cezar
rhg: add a limited `rhg cat -r` subcommand...
r46113 }
}