##// END OF EJS Templates
rhg: tweak rhg fallback code structure...
rhg: tweak rhg fallback code structure The goal here is to share the code that accesses the config setting, but also move it to the top-level, so that we can more easily change this code later. (in fact in Jane Street we want to make it choose chg in some cases)

File last commit:

r51433:9db197c7 default
r51702:53d77f96 default
Show More
files.rs
116 lines | 3.2 KiB | application/rls-services+xml | RustLexer
Simon Sapin
rust: remove `FooError` structs with only `kind: FooErrorKind` enum field...
r47163 use crate::error::CommandError;
Arseniy Alekseyev
rhg: support `rhg files` with `ui.relative-paths=false`
r51433 use crate::ui::{
print_narrow_sparse_warnings, relative_paths, RelativePaths, 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;
Raphaël Gomès
rust-narrow: enable narrow support for plain `rhg files`...
r50879 use hg::narrow;
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> {
Arseniy Alekseyev
rhg: support `rhg files` with `ui.relative-paths=false`
r51433 let relative_paths = match relative_paths(invocation.config)? {
RelativePaths::Legacy => true,
RelativePaths::Bool(v) => v,
};
Simon Sapin
rhg: Fall back to Python if ui.relative-paths is configured...
r47473
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",
));
}
Raphaël Gomès
rhg-files: add support for narrow when specifying a revision...
r50880 let (narrow_matcher, narrow_warnings) = narrow::matcher(repo)?;
print_narrow_sparse_warnings(&narrow_warnings, &[], invocation.ui, repo)?;
Simon Sapin
rhg: replace command structs with functions...
r47250 if let Some(rev) = rev {
Raphaël Gomès
rhg-files: add support for narrow when specifying a revision...
r50880 let files = list_rev_tracked_files(repo, rev, narrow_matcher)
Raphaël Gomès
rhg: upgrade `clap` dependency...
r50534 .map_err(|e| (e, rev.as_ref()))?;
Arseniy Alekseyev
rhg: support `rhg files` with `ui.relative-paths=false`
r51433 display_files(invocation.ui, repo, relative_paths, files.iter())
Simon Sapin
rhg: replace command structs with functions...
r47250 } else {
Raphaël Gomès
rust-narrow: enable narrow support for plain `rhg files`...
r50879 // The dirstate always reflects the sparse narrowspec.
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)| {
Raphaël Gomès
rust-narrow: enable narrow support for plain `rhg files`...
r50879 Ok(if entry.tracked() && narrow_matcher.matches(path) {
Some(path)
} else {
None
})
Raphaël Gomès
rhg-files: reuse centralized dirstate logic...
r50875 })
.collect();
let mut files = files_res?;
files.par_sort_unstable();
Raphaël Gomès
rust-narrow: enable narrow support for plain `rhg files`...
r50879 display_files(
invocation.ui,
repo,
Arseniy Alekseyev
rhg: support `rhg files` with `ui.relative-paths=false`
r51433 relative_paths,
Raphaël Gomès
rust-narrow: enable narrow support for plain `rhg files`...
r50879 files.into_iter().map::<Result<_, CommandError>, _>(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
Raphaël Gomès
rhg-files: make signature of `display_files` more flexible...
r50878 fn display_files<'a, E>(
Simon Sapin
rhg: replace command structs with functions...
r47250 ui: &Ui,
repo: &Repo,
Arseniy Alekseyev
rhg: support `rhg files` with `ui.relative-paths=false`
r51433 relative_paths: bool,
Raphaël Gomès
rhg-files: make signature of `display_files` more flexible...
r50878 files: impl IntoIterator<Item = Result<&'a HgPath, E>>,
) -> Result<(), CommandError>
where
CommandError: From<E>,
{
Simon Sapin
rhg: replace command structs with functions...
r47250 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?;
Arseniy Alekseyev
rhg: support `rhg files` with `ui.relative-paths=false`
r51433 if relative_paths {
stdout.write_all(&relativize.relativize(path))?;
} else {
stdout.write_all(path.as_bytes())?;
}
Simon Sapin
rhg: refactor relativize_path into a struct + method...
r49284 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 }