Mercurial > hg
comparison mercurial/verify.py @ 49826:c84844cd523a
verify: also check dirstate
The dirstate already is capable of verifying its integrity (although v2
features are not yet checked), let's run that code in `hg verify`.
author | Raphaël Gomès <rgomes@octobus.net> |
---|---|
date | Mon, 02 May 2022 11:27:20 +0200 |
parents | 642e31cb55f0 |
children | d09a57ce6fc4 |
comparison
equal
deleted
inserted
replaced
49825:2f2682f40ea0 | 49826:c84844cd523a |
---|---|
13 from .utils import stringutil | 13 from .utils import stringutil |
14 | 14 |
15 from . import ( | 15 from . import ( |
16 error, | 16 error, |
17 pycompat, | 17 pycompat, |
18 requirements, | |
18 revlog, | 19 revlog, |
19 util, | 20 util, |
20 ) | 21 ) |
21 | 22 |
22 VERIFY_DEFAULT = 0 | 23 VERIFY_DEFAULT = 0 |
208 filenodes = self._verifymanifest(mflinkrevs) | 209 filenodes = self._verifymanifest(mflinkrevs) |
209 del mflinkrevs | 210 del mflinkrevs |
210 self._crosscheckfiles(filelinkrevs, filenodes) | 211 self._crosscheckfiles(filelinkrevs, filenodes) |
211 totalfiles, filerevisions = self._verifyfiles(filenodes, filelinkrevs) | 212 totalfiles, filerevisions = self._verifyfiles(filenodes, filelinkrevs) |
212 | 213 |
214 if self.errors: | |
215 ui.warn(_(b"not checking dirstate because of previous errors\n")) | |
216 dirstate_errors = 0 | |
217 else: | |
218 dirstate_errors = self._verify_dirstate() | |
219 | |
213 # final report | 220 # final report |
214 ui.status( | 221 ui.status( |
215 _(b"checked %d changesets with %d changes to %d files\n") | 222 _(b"checked %d changesets with %d changes to %d files\n") |
216 % (len(repo.changelog), filerevisions, totalfiles) | 223 % (len(repo.changelog), filerevisions, totalfiles) |
217 ) | 224 ) |
223 ui.warn(_(b"%d integrity errors encountered!\n") % self.errors) | 230 ui.warn(_(b"%d integrity errors encountered!\n") % self.errors) |
224 if self.badrevs: | 231 if self.badrevs: |
225 msg = _(b"(first damaged changeset appears to be %d)\n") | 232 msg = _(b"(first damaged changeset appears to be %d)\n") |
226 msg %= min(self.badrevs) | 233 msg %= min(self.badrevs) |
227 ui.warn(msg) | 234 ui.warn(msg) |
235 if dirstate_errors: | |
236 ui.warn( | |
237 _(b"dirstate inconsistent with current parent's manifest\n") | |
238 ) | |
239 ui.warn(_(b"%d dirstate errors\n") % dirstate_errors) | |
228 return 1 | 240 return 1 |
229 return 0 | 241 return 0 |
230 | 242 |
231 def _verifychangelog(self): | 243 def _verifychangelog(self): |
232 """verify the changelog of a repository | 244 """verify the changelog of a repository |
583 if self.warnorphanstorefiles: | 595 if self.warnorphanstorefiles: |
584 for f in sorted(storefiles): | 596 for f in sorted(storefiles): |
585 self._warn(_(b"warning: orphan data file '%s'") % f) | 597 self._warn(_(b"warning: orphan data file '%s'") % f) |
586 | 598 |
587 return len(files), revisions | 599 return len(files), revisions |
600 | |
601 def _verify_dirstate(self): | |
602 """Check that the dirstate is consistent with the parent's manifest""" | |
603 repo = self.repo | |
604 ui = self.ui | |
605 ui.status(_(b"checking dirstate\n")) | |
606 | |
607 parent1, parent2 = repo.dirstate.parents() | |
608 m1 = repo[parent1].manifest() | |
609 m2 = repo[parent2].manifest() | |
610 dirstate_errors = 0 | |
611 | |
612 is_narrow = requirements.NARROW_REQUIREMENT in repo.requirements | |
613 narrow_matcher = repo.narrowmatch() if is_narrow else None | |
614 | |
615 for err in repo.dirstate.verify(m1, m2, narrow_matcher): | |
616 ui.error(err) | |
617 dirstate_errors += 1 | |
618 | |
619 if dirstate_errors: | |
620 self.errors += dirstate_errors | |
621 return dirstate_errors |