Mercurial > hg
changeset 27176:54ace3372f84
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
author | Christian Delahousse <cdelahousse@fb.com> |
---|---|
date | Mon, 30 Nov 2015 11:23:15 -0800 |
parents | 25a8a866eb5d |
children | e76b27a642ca |
files | mercurial/commands.py mercurial/dirstate.py tests/test-rebuildstate.t |
diffstat | 3 files changed, 23 insertions(+), 22 deletions(-) [+] |
line wrap: on
line diff
--- 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()
--- 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
--- 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