[PATCH] dirstate: rebuild should update dirstate properly

Mateusz Kwapich mitrandir at fb.com
Wed Aug 24 19:09:18 UTC 2016


# HG changeset patch
# User Mateusz Kwapich <mitrandir at fb.com>
# Date 1472065656 25200
#      Wed Aug 24 12:07:36 2016 -0700
# Node ID a29e5e93a814268490afd617aebce2f79bd4a75b
# Parent  a19f569214c76d99b0df4c4844f2ab34c9f8cfc6
dirstate: rebuild should update dirstate properly

Updating dirstate by simply adding and dropping files from self._map doesn't
keep the other maps updated (think: _dirs, _copymap, _foldmap, _nonormalset)
thus introducing cache inconsistency.

This is also affecting the debugstate tests since now we don't even try to set
correct mode and mtime for the files because they are marked dirty anyway and
will be checked during next status call.

diff --git a/mercurial/dirstate.py b/mercurial/dirstate.py
--- a/mercurial/dirstate.py
+++ b/mercurial/dirstate.py
@@ -675,19 +675,13 @@ class dirstate(object):
             self.clear()
             self._lastnormaltime = lastnormaltime
 
+        self._pl = (parent, nullid)
         for f in changedfiles:
-            mode = 0o666
-            if f in allfiles and 'x' in allfiles.flags(f):
-                mode = 0o777
-
             if f in allfiles:
-                self._map[f] = dirstatetuple('n', mode, -1, 0)
+                self.normallookup(f)
             else:
-                self._map.pop(f, None)
-                if f in self._nonnormalset:
-                    self._nonnormalset.remove(f)
+                self.drop(f)
 
-        self._pl = (parent, nullid)
         self._dirty = True
 
     def write(self, tr):
diff --git a/tests/test-rebuildstate.t b/tests/test-rebuildstate.t
--- a/tests/test-rebuildstate.t
+++ b/tests/test-rebuildstate.t
@@ -48,8 +48,8 @@ basic test for hg debugrebuildstate
 state dump after
 
   $ hg debugstate --nodates | sort
-  n 644         -1 set                 bar
-  n 644         -1 set                 foo
+  n   0         -1 unset               bar
+  n   0         -1 unset               foo
 
   $ hg debugadddrop --normal-lookup file1 file2
   $ hg debugadddrop --drop bar
@@ -57,7 +57,7 @@ state dump after
   $ hg debugstate --nodates
   n   0         -1 unset               file1
   n   0         -1 unset               file2
-  n 644         -1 set                 foo
+  n   0         -1 unset               foo
   $ hg debugrebuildstate
 
 status
@@ -115,7 +115,7 @@ dirstate
   $ hg debugrebuilddirstate --minimal
   $ hg debugdirstate --nodates
   r   0          0 * bar (glob)
-  n 644         -1 * foo (glob)
+  n   0         -1 * foo (glob)
   a   0         -1 * qux (glob)
   $ hg status -A
   A qux


More information about the Mercurial-devel mailing list