diff -r 39f51064e9f5 -r 97986c9c69d3 mercurial/revlog.py --- a/mercurial/revlog.py Mon Sep 24 08:58:57 2018 -0700 +++ b/mercurial/revlog.py Wed Sep 19 11:17:28 2018 -0700 @@ -254,6 +254,12 @@ revision = attr.ib() delta = attr.ib() +@interfaceutil.implementer(repository.iverifyproblem) +@attr.s(frozen=True) +class revlogproblem(object): + warning = attr.ib(default=None) + error = attr.ib(default=None) + # index v0: # 4 bytes: offset # 4 bytes: compressed length @@ -2581,3 +2587,23 @@ if dataread is not idxread: dataread.close() datawrite.close() + + def verifyintegrity(self, state): + """Verifies the integrity of the revlog. + + Yields ``revlogproblem`` instances describing problems that are + found. + """ + dd, di = self.checksize() + if dd: + yield revlogproblem(error=_('data length off by %d bytes') % dd) + if di: + yield revlogproblem(error=_('index contains %d extra bytes') % di) + + if self.version != REVLOGV0: + if not state['revlogv1']: + yield revlogproblem(warning=_("warning: `%s' uses revlog " + "format 1") % self.indexfile) + elif state['revlogv1']: + yield revlogproblem(warning=_("warning: `%s' uses revlog " + "format 0") % self.indexfile)