##// END OF EJS Templates
rust-clippy: ignore clippy's recommendation for "useless" cast...
rust-clippy: ignore clippy's recommendation for "useless" cast See explanation inline.

File last commit:

r51760:788113f0 default
r52012:d58e754f 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 }