##// END OF EJS Templates
exchange: improve computation of relevant markers for large repos...
exchange: improve computation of relevant markers for large repos Find the candidates for nodes with relevant markers by going over all markers instead of iterating over all nodes. Most nodes will not have markers anyway. Further optimize the code by allowing revsets as well, which reduces the materialization cost.

File last commit:

r51760:788113f0 default
r52537:f28c52a9 default
Show More
files.rs
149 lines | 4.4 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;
Spencer Baugh
rhg: support rhg files [FILE]...
r51760 use hg::filepatterns::parse_pattern_args;
use hg::matchers::IntersectionMatcher;
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;
Spencer Baugh
rhg: support rhg files [FILE]...
r51760 use hg::utils::files::get_bytes_from_os_str;
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 )
Spencer Baugh
rhg: support rhg files [FILE]...
r51760 .arg(
Arg::new("file")
.value_parser(clap::value_parser!(std::ffi::OsString))
.help("show only these files")
.action(clap::ArgAction::Append),
)
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
Spencer Baugh
rhg: support rhg files [FILE]...
r51760 let args = invocation.subcommand_args;
let rev = 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",
));
}
Spencer Baugh
rhg: support rhg files [FILE]...
r51760 let (matcher, narrow_warnings) = narrow::matcher(repo)?;
Raphaël Gomès
rhg-files: add support for narrow when specifying a revision...
r50880 print_narrow_sparse_warnings(&narrow_warnings, &[], invocation.ui, repo)?;
Spencer Baugh
rhg: support rhg files [FILE]...
r51760 let matcher = match args.get_many::<std::ffi::OsString>("file") {
None => matcher,
Some(files) => {
let patterns: Vec<Vec<u8>> = files
.filter(|s| !s.is_empty())
.map(get_bytes_from_os_str)
.collect();
for file in &patterns {
if file.starts_with(b"set:") {
return Err(CommandError::unsupported("fileset"));
}
}
let cwd = hg::utils::current_dir()?;
let root = repo.working_directory_path();
let ignore_patterns = parse_pattern_args(patterns, &cwd, root)?;
let files_matcher =
hg::matchers::PatternMatcher::new(ignore_patterns)?;
Box::new(IntersectionMatcher::new(
Box::new(files_matcher),
matcher,
))
}
};
Raphaël Gomès
rhg-files: add support for narrow when specifying a revision...
r50880
Simon Sapin
rhg: replace command structs with functions...
r47250 if let Some(rev) = rev {
Spencer Baugh
rhg: support rhg files [FILE]...
r51760 let files = list_rev_tracked_files(repo, rev, 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)| {
Spencer Baugh
rhg: support rhg files [FILE]...
r51760 Ok(if entry.tracked() && matcher.matches(path) {
Raphaël Gomès
rust-narrow: enable narrow support for plain `rhg files`...
r50879 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 }