diff rust/hg-core/src/operations/list_tracked_files.rs @ 49985:e57f76c28f7b

rhg-files: add support for narrow when specifying a revision This makes it so that `rhg files -r NODE` works properly when using narrow.
author Raphaël Gomès <rgomes@octobus.net>
date Wed, 11 Jan 2023 17:30:55 +0100
parents 95ffa065204e
children 1928b770e3e7
line wrap: on
line diff
--- a/rust/hg-core/src/operations/list_tracked_files.rs	Wed Jan 11 17:08:23 2023 +0100
+++ b/rust/hg-core/src/operations/list_tracked_files.rs	Wed Jan 11 17:30:55 2023 +0100
@@ -6,24 +6,40 @@
 // GNU General Public License version 2 or any later version.
 
 use crate::errors::HgError;
+use crate::matchers::Matcher;
 use crate::repo::Repo;
 use crate::revlog::manifest::Manifest;
 use crate::revlog::RevlogError;
+use crate::utils::filter_map_results;
 use crate::utils::hg_path::HgPath;
 
 /// List files under Mercurial control at a given revision.
 pub fn list_rev_tracked_files(
     repo: &Repo,
     revset: &str,
+    narrow_matcher: Box<dyn Matcher>,
 ) -> Result<FilesForRev, RevlogError> {
     let rev = crate::revset::resolve_single(revset, repo)?;
-    Ok(FilesForRev(repo.manifest_for_rev(rev)?))
+    Ok(FilesForRev {
+        manifest: repo.manifest_for_rev(rev)?,
+        narrow_matcher,
+    })
 }
 
-pub struct FilesForRev(Manifest);
+pub struct FilesForRev {
+    manifest: Manifest,
+    narrow_matcher: Box<dyn Matcher>,
+}
 
 impl FilesForRev {
     pub fn iter(&self) -> impl Iterator<Item = Result<&HgPath, HgError>> {
-        self.0.iter().map(|entry| Ok(entry?.path))
+        filter_map_results(self.manifest.iter(), |entry| {
+            let path = entry.path;
+            Ok(if self.narrow_matcher.matches(path) {
+                Some(path)
+            } else {
+                None
+            })
+        })
     }
 }