diff -r e8ea403b1c46 -r 288de6f5d724 rust/hg-core/src/dirstate_tree/status.rs --- a/rust/hg-core/src/dirstate_tree/status.rs Thu Jun 16 15:15:03 2022 +0200 +++ b/rust/hg-core/src/dirstate_tree/status.rs Thu Jun 16 15:28:54 2022 +0200 @@ -5,7 +5,6 @@ use crate::dirstate_tree::dirstate_map::ChildNodesRef; use crate::dirstate_tree::dirstate_map::DirstateMap; use crate::dirstate_tree::dirstate_map::DirstateVersion; -use crate::dirstate_tree::dirstate_map::NodeData; use crate::dirstate_tree::dirstate_map::NodeRef; use crate::dirstate_tree::on_disk::DirstateV2ParseError; use crate::matchers::get_ignore_function; @@ -15,7 +14,6 @@ use crate::utils::hg_path::HgPath; use crate::BadMatch; use crate::DirstateStatus; -use crate::EntryState; use crate::HgPathBuf; use crate::HgPathCow; use crate::PatternFileWarning; @@ -155,19 +153,10 @@ // Remove outdated mtimes before adding new mtimes, in case a given // directory is both for path in &outdated { - let node = dmap.get_or_insert(path)?; - if let NodeData::CachedDirectory { .. } = &node.data { - node.data = NodeData::None - } + dmap.clear_cached_mtime(path)?; } for (path, mtime) in &new_cachable { - let node = dmap.get_or_insert(path)?; - match &node.data { - NodeData::Entry(_) => {} // Don’t overwrite an entry - NodeData::CachedDirectory { .. } | NodeData::None => { - node.data = NodeData::CachedDirectory { mtime: *mtime } - } - } + dmap.set_cached_mtime(path, *mtime)?; } Ok((outcome, warnings)) @@ -484,17 +473,23 @@ )? } else { if file_or_symlink && self.matcher.matches(hg_path) { - if let Some(state) = dirstate_node.state()? { - match state { - EntryState::Added => { - self.push_outcome(Outcome::Added, &dirstate_node)? - } - EntryState::Removed => self - .push_outcome(Outcome::Removed, &dirstate_node)?, - EntryState::Merged => self - .push_outcome(Outcome::Modified, &dirstate_node)?, - EntryState::Normal => self - .handle_normal_file(&dirstate_node, fs_metadata)?, + if let Some(entry) = dirstate_node.entry()? { + if !entry.any_tracked() { + // Forward-compat if we start tracking unknown/ignored + // files for caching reasons + self.mark_unknown_or_ignored( + has_ignored_ancestor, + hg_path, + ); + } + if entry.added() { + self.push_outcome(Outcome::Added, &dirstate_node)?; + } else if entry.removed() { + self.push_outcome(Outcome::Removed, &dirstate_node)?; + } else if entry.modified() { + self.push_outcome(Outcome::Modified, &dirstate_node)?; + } else { + self.handle_normal_file(&dirstate_node, fs_metadata)?; } } else { // `node.entry.is_none()` indicates a "directory" @@ -604,8 +599,7 @@ Ok(()) } - /// A file with `EntryState::Normal` in the dirstate was found in the - /// filesystem + /// A file that is clean in the dirstate was found in the filesystem fn handle_normal_file( &self, dirstate_node: &NodeRef<'tree, 'on_disk>, @@ -678,10 +672,15 @@ &self, dirstate_node: &NodeRef<'tree, 'on_disk>, ) -> Result<(), DirstateV2ParseError> { - if let Some(state) = dirstate_node.state()? { + if let Some(entry) = dirstate_node.entry()? { + if !entry.any_tracked() { + // Future-compat for when we start storing ignored and unknown + // files for caching reasons + return Ok(()); + } let path = dirstate_node.full_path(self.dmap.on_disk)?; if self.matcher.matches(path) { - if let EntryState::Removed = state { + if entry.removed() { self.push_outcome(Outcome::Removed, dirstate_node)? } else { self.push_outcome(Outcome::Deleted, &dirstate_node)?