equal
deleted
inserted
replaced
49 self.fncachewarned = False |
49 self.fncachewarned = False |
50 # developer config: verify.skipflags |
50 # developer config: verify.skipflags |
51 self.skipflags = repo.ui.configint('verify', 'skipflags') |
51 self.skipflags = repo.ui.configint('verify', 'skipflags') |
52 self.warnorphanstorefiles = True |
52 self.warnorphanstorefiles = True |
53 |
53 |
54 def warn(self, msg): |
54 def _warn(self, msg): |
55 """record a "warning" level issue""" |
55 """record a "warning" level issue""" |
56 self.ui.warn(msg + "\n") |
56 self.ui.warn(msg + "\n") |
57 self.warnings += 1 |
57 self.warnings += 1 |
58 |
58 |
59 def err(self, linkrev, msg, filename=None): |
59 def err(self, linkrev, msg, filename=None): |
85 if d[1]: |
85 if d[1]: |
86 self.err(None, _("index contains %d extra bytes") % d[1], name) |
86 self.err(None, _("index contains %d extra bytes") % d[1], name) |
87 |
87 |
88 if obj.version != revlog.REVLOGV0: |
88 if obj.version != revlog.REVLOGV0: |
89 if not self.revlogv1: |
89 if not self.revlogv1: |
90 self.warn(_("warning: `%s' uses revlog format 1") % name) |
90 self._warn(_("warning: `%s' uses revlog format 1") % name) |
91 elif self.revlogv1: |
91 elif self.revlogv1: |
92 self.warn(_("warning: `%s' uses revlog format 0") % name) |
92 self._warn(_("warning: `%s' uses revlog format 0") % name) |
93 |
93 |
94 def checkentry(self, obj, i, node, seen, linkrevs, f): |
94 def checkentry(self, obj, i, node, seen, linkrevs, f): |
95 lr = obj.linkrev(obj.rev(node)) |
95 lr = obj.linkrev(obj.rev(node)) |
96 if lr < 0 or (self.havecl and lr not in linkrevs): |
96 if lr < 0 or (self.havecl and lr not in linkrevs): |
97 if lr < 0 or lr >= len(self.repo.changelog): |
97 if lr < 0 or lr >= len(self.repo.changelog): |
105 # attempt to filter down to real linkrevs |
105 # attempt to filter down to real linkrevs |
106 linkrevs = [l for l in linkrevs |
106 linkrevs = [l for l in linkrevs |
107 if self.lrugetctx(l)[f].filenode() == node] |
107 if self.lrugetctx(l)[f].filenode() == node] |
108 except Exception: |
108 except Exception: |
109 pass |
109 pass |
110 self.warn(_(" (expected %s)") % " ".join |
110 self._warn(_(" (expected %s)") % " ".join |
111 (map(pycompat.bytestr, linkrevs))) |
111 (map(pycompat.bytestr, linkrevs))) |
112 lr = None # can't be trusted |
112 lr = None # can't be trusted |
113 |
113 |
114 try: |
114 try: |
115 p1, p2 = obj.parents(node) |
115 p1, p2 = obj.parents(node) |
116 if p1 not in seen and p1 != nullid: |
116 if p1 not in seen and p1 != nullid: |
291 |
291 |
292 if not dir and subdirnodes: |
292 if not dir and subdirnodes: |
293 subdirprogress.complete() |
293 subdirprogress.complete() |
294 if self.warnorphanstorefiles: |
294 if self.warnorphanstorefiles: |
295 for f in sorted(storefiles): |
295 for f in sorted(storefiles): |
296 self.warn(_("warning: orphan data file '%s'") % f) |
296 self._warn(_("warning: orphan data file '%s'") % f) |
297 |
297 |
298 return filenodes |
298 return filenodes |
299 |
299 |
300 def _crosscheckfiles(self, filelinkrevs, filenodes): |
300 def _crosscheckfiles(self, filelinkrevs, filenodes): |
301 repo = self.repo |
301 repo = self.repo |
374 for ff in fl.files(): |
374 for ff in fl.files(): |
375 try: |
375 try: |
376 storefiles.remove(ff) |
376 storefiles.remove(ff) |
377 except KeyError: |
377 except KeyError: |
378 if self.warnorphanstorefiles: |
378 if self.warnorphanstorefiles: |
379 self.warn(_(" warning: revlog '%s' not in fncache!") % |
379 self._warn(_(" warning: revlog '%s' not in fncache!") % |
380 ff) |
380 ff) |
381 self.fncachewarned = True |
381 self.fncachewarned = True |
382 |
382 |
383 if not len(fl) and (self.havecl or self.havemf): |
383 if not len(fl) and (self.havecl or self.havemf): |
384 self.err(lr, _("empty or missing %s") % f) |
384 self.err(lr, _("empty or missing %s") % f) |
390 linkrev = fl.linkrev(fl.rev(problem.node)) |
390 linkrev = fl.linkrev(fl.rev(problem.node)) |
391 else: |
391 else: |
392 linkrev = None |
392 linkrev = None |
393 |
393 |
394 if problem.warning: |
394 if problem.warning: |
395 self.warn(problem.warning) |
395 self._warn(problem.warning) |
396 elif problem.error: |
396 elif problem.error: |
397 self.err(linkrev if linkrev is not None else lr, |
397 self.err(linkrev if linkrev is not None else lr, |
398 problem.error, f) |
398 problem.error, f) |
399 else: |
399 else: |
400 raise error.ProgrammingError( |
400 raise error.ProgrammingError( |
423 rp = fl.renamed(n) |
423 rp = fl.renamed(n) |
424 if rp: |
424 if rp: |
425 if lr is not None and ui.verbose: |
425 if lr is not None and ui.verbose: |
426 ctx = lrugetctx(lr) |
426 ctx = lrugetctx(lr) |
427 if not any(rp[0] in pctx for pctx in ctx.parents()): |
427 if not any(rp[0] in pctx for pctx in ctx.parents()): |
428 self.warn(_("warning: copy source of '%s' not" |
428 self._warn(_("warning: copy source of '%s' not" |
429 " in parents of %s") % (f, ctx)) |
429 " in parents of %s") % (f, ctx)) |
430 fl2 = repo.file(rp[0]) |
430 fl2 = repo.file(rp[0]) |
431 if not len(fl2): |
431 if not len(fl2): |
432 self.err(lr, _("empty or missing copy source " |
432 self.err(lr, _("empty or missing copy source " |
433 "revlog %s:%s") % (rp[0], short(rp[1])), f) |
433 "revlog %s:%s") % (rp[0], short(rp[1])), f) |
448 short(node), f) |
448 short(node), f) |
449 progress.complete() |
449 progress.complete() |
450 |
450 |
451 if self.warnorphanstorefiles: |
451 if self.warnorphanstorefiles: |
452 for f in sorted(storefiles): |
452 for f in sorted(storefiles): |
453 self.warn(_("warning: orphan data file '%s'") % f) |
453 self._warn(_("warning: orphan data file '%s'") % f) |
454 |
454 |
455 return len(files), revisions |
455 return len(files), revisions |