comparison mercurial/verify.py @ 27644:331e5c28f5f0

verify: move filelog verification to its own function This makes verify more modular so extensions can hook in more easily.
author Durham Goode <durham@fb.com>
date Tue, 05 Jan 2016 18:28:46 -0800
parents 62ce86fcfd06
children df8973e1fb45
comparison
equal deleted inserted replaced
27643:62ce86fcfd06 27644:331e5c28f5f0
140 revisions = 0 140 revisions = 0
141 badrevs = self.badrevs 141 badrevs = self.badrevs
142 ui = repo.ui 142 ui = repo.ui
143 cl = repo.changelog 143 cl = repo.changelog
144 mf = repo.manifest 144 mf = repo.manifest
145 lrugetctx = self.lrugetctx
146 145
147 if not repo.url().startswith('file:'): 146 if not repo.url().startswith('file:'):
148 raise error.Abort(_("cannot verify bundle or remote repos")) 147 raise error.Abort(_("cannot verify bundle or remote repos"))
149 148
150 if os.path.exists(repo.sjoin("journal")): 149 if os.path.exists(repo.sjoin("journal")):
243 lr = None 242 lr = None
244 self.err(lr, _("in manifest but not in changeset"), f) 243 self.err(lr, _("in manifest but not in changeset"), f)
245 244
246 ui.progress(_('crosschecking'), None) 245 ui.progress(_('crosschecking'), None)
247 246
247 totalfiles, filerevisions = self._verifyfiles(filenodes, filelinkrevs)
248 revisions += filerevisions
249
250 ui.status(_("%d files, %d changesets, %d total revisions\n") %
251 (totalfiles, len(cl), revisions))
252 if self.warnings:
253 ui.warn(_("%d warnings encountered!\n") % self.warnings)
254 if self.fncachewarned:
255 ui.warn(_('hint: run "hg debugrebuildfncache" to recover from '
256 'corrupt fncache\n'))
257 if self.errors:
258 ui.warn(_("%d integrity errors encountered!\n") % self.errors)
259 if badrevs:
260 ui.warn(_("(first damaged changeset appears to be %d)\n")
261 % min(badrevs))
262 return 1
263
264 def _verifyfiles(self, filenodes, filelinkrevs):
265 repo = self.repo
266 ui = self.ui
267 lrugetctx = self.lrugetctx
268 revlogv1 = self.revlogv1
269 havemf = self.havemf
248 ui.status(_("checking files\n")) 270 ui.status(_("checking files\n"))
249 271
250 storefiles = set() 272 storefiles = set()
251 for f, f2, size in repo.store.datafiles(): 273 for f, f2, size in repo.store.datafiles():
252 if not f: 274 if not f:
254 elif size > 0 or not revlogv1: 276 elif size > 0 or not revlogv1:
255 storefiles.add(_normpath(f)) 277 storefiles.add(_normpath(f))
256 278
257 files = sorted(set(filenodes) | set(filelinkrevs)) 279 files = sorted(set(filenodes) | set(filelinkrevs))
258 total = len(files) 280 total = len(files)
281 revisions = 0
259 for i, f in enumerate(files): 282 for i, f in enumerate(files):
260 ui.progress(_('checking'), i, item=f, total=total) 283 ui.progress(_('checking'), i, item=f, total=total)
261 try: 284 try:
262 linkrevs = filelinkrevs[f] 285 linkrevs = filelinkrevs[f]
263 except KeyError: 286 except KeyError:
345 ui.progress(_('checking'), None) 368 ui.progress(_('checking'), None)
346 369
347 for f in storefiles: 370 for f in storefiles:
348 self.warn(_("warning: orphan revlog '%s'") % f) 371 self.warn(_("warning: orphan revlog '%s'") % f)
349 372
350 ui.status(_("%d files, %d changesets, %d total revisions\n") % 373 return len(files), revisions
351 (len(files), len(cl), revisions))
352 if self.warnings:
353 ui.warn(_("%d warnings encountered!\n") % self.warnings)
354 if self.fncachewarned:
355 ui.warn(_('hint: run "hg debugrebuildfncache" to recover from '
356 'corrupt fncache\n'))
357 if self.errors:
358 ui.warn(_("%d integrity errors encountered!\n") % self.errors)
359 if badrevs:
360 ui.warn(_("(first damaged changeset appears to be %d)\n")
361 % min(badrevs))
362 return 1