##// 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
files.rs
62 lines | 1.8 KiB | application/rls-services+xml | RustLexer
use crate::error::CommandError;
use crate::ui::Ui;
use clap::Arg;
use hg::operations::list_rev_tracked_files;
use hg::operations::Dirstate;
use hg::repo::Repo;
use hg::utils::files::{get_bytes_from_path, relativize_path};
use hg::utils::hg_path::{HgPath, HgPathBuf};
pub const HELP_TEXT: &str = "
List tracked files.
Returns 0 on success.
";
pub fn args() -> clap::App<'static, 'static> {
clap::SubCommand::with_name("files")
.arg(
Arg::with_name("rev")
.help("search the repository as it is in REV")
.short("-r")
.long("--revision")
.value_name("REV")
.takes_value(true),
)
.about(HELP_TEXT)
}
pub fn run(invocation: &crate::CliInvocation) -> Result<(), CommandError> {
let rev = invocation.subcommand_args.value_of("rev");
let repo = Repo::find(invocation.non_repo_config, invocation.repo_path)?;
if let Some(rev) = rev {
let files =
list_rev_tracked_files(&repo, rev).map_err(|e| (e, rev))?;
display_files(invocation.ui, &repo, files.iter())
} else {
let distate = Dirstate::new(&repo)?;
let files = distate.tracked_files()?;
display_files(invocation.ui, &repo, files)
}
}
fn display_files<'a>(
ui: &Ui,
repo: &Repo,
files: impl IntoIterator<Item = &'a HgPath>,
) -> Result<(), CommandError> {
let cwd = HgPathBuf::from(get_bytes_from_path(hg::utils::current_dir()?));
let working_directory =
HgPathBuf::from(get_bytes_from_path(repo.working_directory_path()));
let mut stdout = ui.stdout_buffer();
for file in files {
let file = working_directory.join(file);
stdout.write_all(relativize_path(&file, &cwd).as_ref())?;
stdout.write_all(b"\n")?;
}
stdout.flush()?;
Ok(())
}