diff rust/hg-core/src/dirstate_tree/status.rs @ 48893:6cd249556e20 stable

rust-status: don't trigger dirstate v1 rewrite when only v2 data is changed The assumption that we need to rewrite (or append to) the dirstate if the ignore pattern hash has changed or if any cached directory mtimes have changed is only valid when using dirstate-v2. In dirstate-v1, neither of these things are written to disk.
author Rapha?l Gom?s <rgomes@octobus.net>
date Wed, 08 Jun 2022 19:15:58 +0200
parents dd6b67d5c256
children 288de6f5d724
line wrap: on
line diff
--- a/rust/hg-core/src/dirstate_tree/status.rs	Tue Jun 14 04:04:08 2022 +0200
+++ b/rust/hg-core/src/dirstate_tree/status.rs	Wed Jun 08 19:15:58 2022 +0200
@@ -4,6 +4,7 @@
 use crate::dirstate_tree::dirstate_map::BorrowedPath;
 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;
@@ -61,16 +62,29 @@
 
     let (ignore_fn, warnings, patterns_changed): (IgnoreFnType, _, _) =
         if options.list_ignored || options.list_unknown {
-            let mut hasher = Sha1::new();
-            let (ignore_fn, warnings) = get_ignore_function(
-                ignore_files,
-                &root_dir,
-                &mut |pattern_bytes| hasher.update(pattern_bytes),
-            )?;
-            let new_hash = *hasher.finalize().as_ref();
-            let changed = new_hash != dmap.ignore_patterns_hash;
-            dmap.ignore_patterns_hash = new_hash;
-            (ignore_fn, warnings, Some(changed))
+            let (ignore_fn, warnings, changed) = match dmap.dirstate_version {
+                DirstateVersion::V1 => {
+                    let (ignore_fn, warnings) = get_ignore_function(
+                        ignore_files,
+                        &root_dir,
+                        &mut |_pattern_bytes| {},
+                    )?;
+                    (ignore_fn, warnings, None)
+                }
+                DirstateVersion::V2 => {
+                    let mut hasher = Sha1::new();
+                    let (ignore_fn, warnings) = get_ignore_function(
+                        ignore_files,
+                        &root_dir,
+                        &mut |pattern_bytes| hasher.update(pattern_bytes),
+                    )?;
+                    let new_hash = *hasher.finalize().as_ref();
+                    let changed = new_hash != dmap.ignore_patterns_hash;
+                    dmap.ignore_patterns_hash = new_hash;
+                    (ignore_fn, warnings, Some(changed))
+                }
+            };
+            (ignore_fn, warnings, changed)
         } else {
             (Box::new(|&_| true), vec![], None)
         };
@@ -135,7 +149,8 @@
 
     outcome.dirty = common.ignore_patterns_have_changed == Some(true)
         || !outdated.is_empty()
-        || !new_cachable.is_empty();
+        || (!new_cachable.is_empty()
+            && dmap.dirstate_version == DirstateVersion::V2);
 
     // Remove outdated mtimes before adding new mtimes, in case a given
     // directory is both