dirstate: move verification code within the dirstate itself
This move implementation details further down the stack and make it the
verification code easier to discover.
Differential Revision: https://phab.mercurial-scm.org/D11526
--- a/mercurial/debugcommands.py Wed Sep 29 14:52:44 2021 +0200
+++ b/mercurial/debugcommands.py Thu Sep 30 12:00:15 2021 +0200
@@ -550,24 +550,9 @@
m1 = repo[parent1].manifest()
m2 = repo[parent2].manifest()
errors = 0
- for f in repo.dirstate:
- state = repo.dirstate[f]
- if state in b"nr" and f not in m1:
- ui.warn(_(b"%s in state %s, but not in manifest1\n") % (f, state))
- errors += 1
- if state in b"a" and f in m1:
- ui.warn(_(b"%s in state %s, but also in manifest1\n") % (f, state))
- errors += 1
- if state in b"m" and f not in m1 and f not in m2:
- ui.warn(
- _(b"%s in state %s, but not in either manifest\n") % (f, state)
- )
- errors += 1
- for f in m1:
- state = repo.dirstate[f]
- if state not in b"nrm":
- ui.warn(_(b"%s in manifest1, but listed as state %s") % (f, state))
- errors += 1
+ for err in repo.dirstate.verify(m1, m2):
+ ui.warn(err[0] % err[1:])
+ errors += 1
if errors:
errstr = _(b".hg/dirstate inconsistent with current parent's manifest")
raise error.Abort(errstr)
--- a/mercurial/dirstate.py Wed Sep 29 14:52:44 2021 +0200
+++ b/mercurial/dirstate.py Thu Sep 30 12:00:15 2021 +0200
@@ -1525,3 +1525,22 @@
def clearbackup(self, tr, backupname):
'''Clear backup file'''
self._opener.unlink(backupname)
+
+ def verify(self, m1, m2):
+ """check the dirstate content again the parent manifest and yield errors"""
+ missing_from_p1 = b"%s in state %s, but not in manifest1\n"
+ unexpected_in_p1 = b"%s in state %s, but also in manifest1\n"
+ missing_from_ps = b"%s in state %s, but not in either manifest\n"
+ missing_from_ds = b"%s in manifest1, but listed as state %s\n"
+ for f, entry in self.items():
+ state = entry.state
+ if state in b"nr" and f not in m1:
+ yield (missing_from_p1, f, state)
+ if state in b"a" and f in m1:
+ yield (unexpected_in_p1, f, state)
+ if state in b"m" and f not in m1 and f not in m2:
+ yield (missing_from_ps, f, state)
+ for f in m1:
+ state = self.get_entry(f).state
+ if state not in b"nrm":
+ yield (missing_from_ds, f, state)