##// END OF EJS Templates
rhg: fix user-facing error message so it matches Python implementation
rhg: fix user-facing error message so it matches Python implementation

File last commit:

r50875:95ffa065 default
r50877:7faedeb2 default
Show More
files.rs
110 lines | 3.3 KiB | application/rls-services+xml | RustLexer
Simon Sapin
rust: remove `FooError` structs with only `kind: FooErrorKind` enum field...
r47163 use crate::error::CommandError;
Antoine Cezar
rhg: add a `Files` `Command` to prepare the `rhg files` subcommand...
r45923 use crate::ui::Ui;
Simon Sapin
rhg: refactor relativize_path into a struct + method...
r49284 use crate::utils::path_utils::RelativizePaths;
Simon Sapin
rhg: Move subcommand CLI arguments definitions to respective modules...
r47251 use clap::Arg;
Simon Sapin
rhg: Propogate manifest parse errors instead of panicking...
r49165 use hg::errors::HgError;
Simon Sapin
rhg: replace `map_*_error` functions with `From` impls...
r47165 use hg::operations::list_rev_tracked_files;
Simon Sapin
rust: introduce Repo and Vfs types for filesystem abstraction...
r46782 use hg::repo::Repo;
Raphaël Gomès
rhg-files: reuse centralized dirstate logic...
r50875 use hg::utils::filter_map_results;
Pulkit Goyal
rhg: refactor function to relativize paths in utils...
r48988 use hg::utils::hg_path::HgPath;
Raphaël Gomès
rhg-files: reuse centralized dirstate logic...
r50875 use rayon::prelude::*;
Antoine Cezar
rhg: add a `Files` `Command` to prepare the `rhg files` subcommand...
r45923
pub const HELP_TEXT: &str = "
List tracked files.
Returns 0 on success.
";
Raphaël Gomès
rhg: upgrade `clap` dependency...
r50534 pub fn args() -> clap::Command {
clap::command!("files")
Simon Sapin
rhg: Move subcommand CLI arguments definitions to respective modules...
r47251 .arg(
Raphaël Gomès
rhg: upgrade `clap` dependency...
r50534 Arg::new("rev")
Simon Sapin
rhg: Move subcommand CLI arguments definitions to respective modules...
r47251 .help("search the repository as it is in REV")
Raphaël Gomès
rhg: upgrade `clap` dependency...
r50534 .short('r')
.long("revision")
.value_name("REV"),
Simon Sapin
rhg: Move subcommand CLI arguments definitions to respective modules...
r47251 )
.about(HELP_TEXT)
}
Simon Sapin
rhg: Group values passed to every sub-command into a struct...
r47334 pub fn run(invocation: &crate::CliInvocation) -> Result<(), CommandError> {
Simon Sapin
rhg: Fall back to Python if ui.relative-paths is configured...
r47473 let relative = invocation.config.get(b"ui", b"relative-paths");
if relative.is_some() {
return Err(CommandError::unsupported(
"non-default ui.relative-paths",
));
}
Raphaël Gomès
rhg: upgrade `clap` dependency...
r50534 let rev = invocation.subcommand_args.get_one::<String>("rev");
Antoine Cezar
rhg: add a `Files` `Command` to prepare the `rhg files` subcommand...
r45923
Simon Sapin
rhg: Move `Repo` object creation into `main()`...
r47335 let repo = invocation.repo?;
Arseniy Alekseyev
rhg: add support for narrow clones and sparse checkouts...
r49238
// It seems better if this check is removed: this would correspond to
// automatically enabling the extension if the repo requires it.
// However we need this check to be in sync with vanilla hg so hg tests
// pass.
if repo.has_sparse()
&& invocation.config.get(b"extensions", b"sparse").is_none()
{
return Err(CommandError::unsupported(
"repo is using sparse, but sparse extension is not enabled",
));
}
Simon Sapin
rhg: replace command structs with functions...
r47250 if let Some(rev) = rev {
Arseniy Alekseyev
rhg: add support for narrow clones and sparse checkouts...
r49238 if repo.has_narrow() {
return Err(CommandError::unsupported(
"rhg files -r <rev> is not supported in narrow clones",
));
}
Raphaël Gomès
rhg: upgrade `clap` dependency...
r50534 let files = list_rev_tracked_files(repo, rev)
.map_err(|e| (e, rev.as_ref()))?;
Simon Sapin
rhg: Move `Repo` object creation into `main()`...
r47335 display_files(invocation.ui, repo, files.iter())
Simon Sapin
rhg: replace command structs with functions...
r47250 } else {
Arseniy Alekseyev
rhg: add support for narrow clones and sparse checkouts...
r49238 // The dirstate always reflects the sparse narrowspec, so if
// we only have sparse without narrow all is fine.
// If we have narrow, then [hg files] needs to check if
// the store narrowspec is in sync with the one of the dirstate,
// so we can't support that without explicit code.
if repo.has_narrow() {
return Err(CommandError::unsupported(
"rhg files is not supported in narrow clones",
));
}
Raphaël Gomès
rhg-files: reuse centralized dirstate logic...
r50875 let dirstate = repo.dirstate_map()?;
let files_res: Result<Vec<_>, _> =
filter_map_results(dirstate.iter(), |(path, entry)| {
Ok(if entry.tracked() { Some(path) } else { None })
})
.collect();
let mut files = files_res?;
files.par_sort_unstable();
Simon Sapin
rhg: Propogate manifest parse errors instead of panicking...
r49165 display_files(invocation.ui, repo, files.into_iter().map(Ok))
Antoine Cezar
rhg: add a `Files` `Command` to prepare the `rhg files` subcommand...
r45923 }
}
Antoine Cezar
hg-core: simplify `list_tracked_files` operation...
r46106
Simon Sapin
rhg: replace command structs with functions...
r47250 fn display_files<'a>(
ui: &Ui,
repo: &Repo,
Simon Sapin
rhg: Propogate manifest parse errors instead of panicking...
r49165 files: impl IntoIterator<Item = Result<&'a HgPath, HgError>>,
Simon Sapin
rhg: replace command structs with functions...
r47250 ) -> Result<(), CommandError> {
let mut stdout = ui.stdout_buffer();
Pulkit Goyal
rhg: refactor function to relativize paths in utils...
r48988 let mut any = false;
Simon Sapin
rhg: Make `files` work on repo-relative paths when possible...
r47687
Simon Sapin
rhg: refactor relativize_path into a struct + method...
r49284 let relativize = RelativizePaths::new(repo)?;
for result in files {
let path = result?;
stdout.write_all(&relativize.relativize(path))?;
stdout.write_all(b"\n")?;
Pulkit Goyal
rhg: refactor function to relativize paths in utils...
r48988 any = true;
Simon Sapin
rhg: refactor relativize_path into a struct + method...
r49284 }
Simon Sapin
rhg: replace command structs with functions...
r47250 stdout.flush()?;
Simon Sapin
rhg: Exit with an error code if `files` finds nothing...
r47479 if any {
Ok(())
} else {
Err(CommandError::Unsuccessful)
}
Antoine Cezar
rhg: add `--revision` argument to `rhg files`...
r46108 }