Mercurial > hg
diff rust/hg-core/src/dirstate_tree/dirstate_map.rs @ 47683:284a20269a97
dirstate-v2: Separate iterators for dirfoldmap and debugdirstate
`dirstatemap.dirfoldmap` was recently changed to re-use a Rust iterator
that was added for the `hg debugdirstate` command.
That iterator was based on all nodes in the tree dirstate without an entry
only existing to hold child nodes, and therefore being directories.
However to optimize status further we may want to store additional nodes
for unknown or ignored files and directories. At that point the two users
of this iterator will want different things, so let’s make two iterators
instead.
See doc-comments in `dispatch.rs`.
Differential Revision: https://phab.mercurial-scm.org/D11099
author | Simon Sapin <simon.sapin@octobus.net> |
---|---|
date | Fri, 16 Jul 2021 14:08:26 +0200 |
parents | 78f7f0d490ee |
children | e5fb14a07866 |
line wrap: on
line diff
--- a/rust/hg-core/src/dirstate_tree/dirstate_map.rs Thu Jul 15 23:02:17 2021 +0200 +++ b/rust/hg-core/src/dirstate_tree/dirstate_map.rs Fri Jul 16 14:08:26 2021 +0200 @@ -1246,27 +1246,50 @@ })) } - fn iter_directories( + fn iter_tracked_dirs( + &mut self, + ) -> Result< + Box< + dyn Iterator<Item = Result<&HgPath, DirstateV2ParseError>> + + Send + + '_, + >, + DirstateError, + > { + let on_disk = self.on_disk; + Ok(Box::new(filter_map_results( + self.iter_nodes(), + move |node| { + Ok(if node.tracked_descendants_count() > 0 { + Some(node.full_path(on_disk)?) + } else { + None + }) + }, + ))) + } + + fn debug_iter( &self, ) -> Box< dyn Iterator< Item = Result< - (&HgPath, Option<Timestamp>), + (&HgPath, (u8, i32, i32, i32)), DirstateV2ParseError, >, > + Send + '_, > { - Box::new(filter_map_results(self.iter_nodes(), move |node| { - Ok(if node.state()?.is_none() { - Some(( - node.full_path(self.on_disk)?, - node.cached_directory_mtime() - .map(|mtime| Timestamp(mtime.seconds())), - )) + Box::new(self.iter_nodes().map(move |node| { + let node = node?; + let debug_tuple = if let Some(entry) = node.entry()? { + entry.debug_tuple() + } else if let Some(mtime) = node.cached_directory_mtime() { + (b' ', 0, -1, mtime.seconds() as i32) } else { - None - }) + (b' ', 0, -1, -1) + }; + Ok((node.full_path(self.on_disk)?, debug_tuple)) })) } }