# HG changeset patch # User Raphaël Gomès # Date 2023-01-11 16:08:23 # Node ID df9eabc9837b5eecdf0d8d47b053799ed98174eb # Parent 795b5b01cbd276639921a14d00421372705ad991 rust-narrow: enable narrow support for plain `rhg files` Support for `rhg files -r NODE` in a future changeset. diff --git a/rust/rhg/src/commands/files.rs b/rust/rhg/src/commands/files.rs --- a/rust/rhg/src/commands/files.rs +++ b/rust/rhg/src/commands/files.rs @@ -1,7 +1,8 @@ use crate::error::CommandError; -use crate::ui::Ui; +use crate::ui::{print_narrow_sparse_warnings, Ui}; use crate::utils::path_utils::RelativizePaths; use clap::Arg; +use hg::narrow; use hg::operations::list_rev_tracked_files; use hg::repo::Repo; use hg::utils::filter_map_results; @@ -60,27 +61,33 @@ pub fn run(invocation: &crate::CliInvoca .map_err(|e| (e, rev.as_ref()))?; display_files(invocation.ui, repo, files.iter()) } else { - // 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", - )); - } + // The dirstate always reflects the sparse narrowspec. + let (narrow_matcher, narrow_warnings) = narrow::matcher(repo)?; + print_narrow_sparse_warnings( + &narrow_warnings, + &[], + invocation.ui, + repo, + )?; let dirstate = repo.dirstate_map()?; let files_res: Result, _> = filter_map_results(dirstate.iter(), |(path, entry)| { - Ok(if entry.tracked() { Some(path) } else { None }) + Ok(if entry.tracked() && narrow_matcher.matches(path) { + Some(path) + } else { + None + }) }) .collect(); let mut files = files_res?; files.par_sort_unstable(); - display_files(invocation.ui, repo, files.into_iter().map(Ok)) + display_files( + invocation.ui, + repo, + files.into_iter().map::, _>(Ok), + ) } } diff --git a/tests/test-rhg-sparse-narrow.t b/tests/test-rhg-sparse-narrow.t --- a/tests/test-rhg-sparse-narrow.t +++ b/tests/test-rhg-sparse-narrow.t @@ -76,7 +76,7 @@ TODO: bad error message [1] A naive implementation of [rhg files] leaks the paths that are supposed to be -hidden by narrow, so we just fall back to hg. +hidden by narrow, so we just fall back to hg when accessing a revision. $ $NO_FALLBACK rhg files -r "$tip" unsupported feature: rhg files -r is not supported in narrow clones @@ -85,6 +85,15 @@ hidden by narrow, so we just fall back t dir1/x dir1/y +The working copy version works with narrow correctly + + $ $NO_FALLBACK rhg files + dir1/x + dir1/y + $ "$real_hg" files + dir1/x + dir1/y + Hg status needs to do some filtering based on narrow spec $ mkdir dir2