##// END OF EJS Templates
rhg: Group values passed to every sub-command into a struct...
rhg: Group values passed to every sub-command into a struct The set of which values this is is evidently not stable yet, so this will make changes easier. Also it is growing, and the function signatures are getting out hand. Differential Revision: https://phab.mercurial-scm.org/D10003

File last commit:

r47334:80840b65 default
r47334:80840b65 default
Show More
cat.rs
66 lines | 2.1 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: replace `map_*_error` functions with `From` impls...
r47165 use hg::operations::cat;
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
";
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: Group values passed to every sub-command into a struct...
r47334 let repo = Repo::find(invocation.non_repo_config, invocation.repo_path)?;
Simon Sapin
rhg: replace command structs with functions...
r47250 let cwd = hg::utils::current_dir()?;
let mut files = vec![];
for file in file_args.iter() {
// TODO: actually normalize `..` path segments etc?
let normalized = cwd.join(&file);
let stripped = normalized
.strip_prefix(&repo.working_directory_path())
// 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) => {
let data = cat(&repo, rev, &files).map_err(|e| (e, rev))?;
Simon Sapin
rhg: Group values passed to every sub-command into a struct...
r47334 invocation.ui.write_stdout(&data)?;
Simon Sapin
rhg: replace command structs with functions...
r47250 Ok(())
}
None => Err(CommandError::Unimplemented.into()),
Antoine Cezar
rhg: add a limited `rhg cat -r` subcommand...
r46113 }
}