changeset 30028:ba06562a06a2

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.
author Mateusz Kwapich <mitrandir@fb.com>
date Tue, 30 Aug 2016 15:16:28 -0700
parents 4d9999e43ff7
children ebe488e04ca3
files mercurial/dirstate.py tests/test-rebuildstate.t
diffstat 2 files changed, 10 insertions(+), 16 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/dirstate.py	Tue Sep 27 22:09:28 2016 -0700
+++ b/mercurial/dirstate.py	Tue Aug 30 15:16:28 2016 -0700
@@ -680,21 +680,15 @@
             self.clear()
             self._lastnormaltime = lastnormaltime
 
-        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)
-            else:
-                self._map.pop(f, None)
-                if f in self._nonnormalset:
-                    self._nonnormalset.remove(f)
-
         if self._origpl is None:
             self._origpl = self._pl
         self._pl = (parent, nullid)
+        for f in changedfiles:
+            if f in allfiles:
+                self.normallookup(f)
+            else:
+                self.drop(f)
+
         self._dirty = True
 
     def write(self, tr):
--- a/tests/test-rebuildstate.t	Tue Sep 27 22:09:28 2016 -0700
+++ b/tests/test-rebuildstate.t	Tue Aug 30 15:16:28 2016 -0700
@@ -48,8 +48,8 @@
 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 @@
   $ 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 @@
   $ 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