# HG changeset patch # User Alexis S. L. Carvalho # Date 1186365896 10800 # Node ID b304c2496f5212b5aa1b925ec9073a64a0a65756 # Parent ccdc8db02bdf6f812dc7dd772c056161245474c5 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. diff --git a/mercurial/dirstate.py b/mercurial/dirstate.py --- 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) diff --git a/tests/test-rebuildstate b/tests/test-rebuildstate 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 + diff --git a/tests/test-rebuildstate.out b/tests/test-rebuildstate.out 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