# HG changeset patch # User Christian Delahousse # Date 1448911395 28800 # Node ID 54ace3372f84988786ea4f6e7613fec14bed0660 # Parent 25a8a866eb5d8061580e90e06b86847292ad26b5 dirstate: change debugrebuilddirstate --minimal to use dirstate.rebuild When debugrebuilddirstate --minimal is called, rebuilding the dirstate was done outside of the appropriate rebuild function. This patch makes debugrebuilddirstate use dirstate.rebuild. This was done to allow our extension to become aware debugrebuilddirstate --minimal diff -r 25a8a866eb5d -r 54ace3372f84 mercurial/commands.py --- a/mercurial/commands.py Tue Dec 01 10:52:36 2015 -0800 +++ b/mercurial/commands.py Mon Nov 30 11:23:15 2015 -0800 @@ -2965,21 +2965,17 @@ wlock = repo.wlock() try: dirstate = repo.dirstate - + changedfiles = None # See command doc for what minimal does. if opts.get('minimal'): + manifestfiles = set(ctx.manifest().keys()) dirstatefiles = set(dirstate) - ctxfiles = set(ctx.manifest().keys()) - for file in (dirstatefiles | ctxfiles): - indirstate = file in dirstatefiles - inctx = file in ctxfiles - - if indirstate and not inctx and dirstate[file] != 'a': - dirstate.drop(file) - elif inctx and not indirstate: - dirstate.normallookup(file) - else: - dirstate.rebuild(ctx.node(), ctx.manifest()) + manifestonly = manifestfiles - dirstatefiles + dsonly = dirstatefiles - manifestfiles + dsnotadded = set(f for f in dsonly if dirstate[f] != 'a') + changedfiles = manifestonly | dsnotadded + + dirstate.rebuild(ctx.node(), ctx.manifest(), changedfiles) finally: wlock.release() diff -r 25a8a866eb5d -r 54ace3372f84 mercurial/dirstate.py --- a/mercurial/dirstate.py Tue Dec 01 10:52:36 2015 -0800 +++ b/mercurial/dirstate.py Mon Nov 30 11:23:15 2015 -0800 @@ -639,17 +639,22 @@ def rebuild(self, parent, allfiles, changedfiles=None): if changedfiles is None: + # Rebuild entire dirstate changedfiles = allfiles - oldmap = self._map - self.clear() - for f in allfiles: - if f not in changedfiles: - self._map[f] = oldmap[f] + lastnormaltime = self._lastnormaltime + 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: - if 'x' in allfiles.flags(f): - self._map[f] = dirstatetuple('n', 0o777, -1, 0) - else: - self._map[f] = dirstatetuple('n', 0o666, -1, 0) + self._map.pop(f, None) + self._pl = (parent, nullid) self._dirty = True diff -r 25a8a866eb5d -r 54ace3372f84 tests/test-rebuildstate.t --- a/tests/test-rebuildstate.t Tue Dec 01 10:52:36 2015 -0800 +++ b/tests/test-rebuildstate.t Mon Nov 30 11:23:15 2015 -0800 @@ -115,7 +115,7 @@ $ hg debugrebuilddirstate --minimal $ hg debugdirstate --nodates r 0 0 * bar (glob) - n 0 -1 * foo (glob) + n 644 -1 * foo (glob) a 0 -1 * qux (glob) $ hg status -A A qux