changeset 5080:b304c2496f52

dirstate: fix rebuild; add a test If rebuild calls invalidate, it will just queue a (re)read of the dirstate file, while what we really want is to empty the current state.
author Alexis S. L. Carvalho <alexis@cecm.usp.br>
date Sun, 05 Aug 2007 23:04:56 -0300
parents ccdc8db02bdf
children 167c422c745f
files mercurial/dirstate.py tests/test-rebuildstate tests/test-rebuildstate.out
diffstat 3 files changed, 48 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/dirstate.py
+++ b/mercurial/dirstate.py
@@ -240,8 +240,14 @@ class dirstate(object):
                 self._ui.warn(_("not in dirstate: %s!\n") % f)
                 pass
 
+    def clear(self):
+        self._map = {}
+        self._copymap = {}
+        self._pl = [nullid, nullid]
+        self.markdirty()
+
     def rebuild(self, parent, files):
-        self.invalidate()
+        self.clear()
         for f in files:
             if files.execf(f):
                 self._map[f] = ('n', 0777, -1, 0)
new file mode 100755
--- /dev/null
+++ b/tests/test-rebuildstate
@@ -0,0 +1,24 @@
+#!/bin/sh
+# basic test for hg debugrebuildstate
+
+hg init repo
+cd repo
+
+touch foo bar
+hg ci -Am 'add foo bar'
+
+touch baz
+hg add baz
+hg rm bar
+
+echo '% state dump'
+hg debugstate | cut -b 1-16,35- | sort
+echo '% status'
+hg st -A
+
+hg debugrebuildstate
+echo '% state dump'
+hg debugstate | cut -b 1-16,35- | sort
+echo '% status'
+hg st -A
+
new file mode 100644
--- /dev/null
+++ b/tests/test-rebuildstate.out
@@ -0,0 +1,17 @@
+adding bar
+adding foo
+% state dump
+a 644          0 baz
+n 644          0 foo
+r   0          0 bar
+% status
+A baz
+R bar
+C foo
+% state dump
+n 666         -1 bar
+n 666         -1 foo
+% status
+! bar
+? baz
+C foo