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.
--- a/mercurial/dirstate.py Sun Aug 05 22:36:39 2007 -0300
+++ b/mercurial/dirstate.py Sun Aug 05 23:04:56 2007 -0300
@@ -240,8 +240,14 @@
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)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-rebuildstate Sun Aug 05 23:04:56 2007 -0300
@@ -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
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-rebuildstate.out Sun Aug 05 23:04:56 2007 -0300
@@ -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