Mercurial > public > mercurial-scm > hg
comparison mercurial/verify.py @ 41864:7eaf4b1ac2a3
verify: make `err` a private method
The method is for internal use only.
author | Pierre-Yves David <pierre-yves.david@octobus.net> |
---|---|
date | Wed, 06 Mar 2019 11:27:37 +0100 |
parents | 9534f3cb6b6c |
children | 5df8475c5343 |
comparison
equal
deleted
inserted
replaced
41863:9534f3cb6b6c | 41864:7eaf4b1ac2a3 |
---|---|
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): |
60 """record a "error" level issue""" | 60 """record a "error" level issue""" |
61 if linkrev is not None: | 61 if linkrev is not None: |
62 self.badrevs.add(linkrev) | 62 self.badrevs.add(linkrev) |
63 linkrev = "%d" % linkrev | 63 linkrev = "%d" % linkrev |
64 else: | 64 else: |
71 | 71 |
72 def exc(self, linkrev, msg, inst, filename=None): | 72 def exc(self, linkrev, msg, inst, filename=None): |
73 fmsg = pycompat.bytestr(inst) | 73 fmsg = pycompat.bytestr(inst) |
74 if not fmsg: | 74 if not fmsg: |
75 fmsg = pycompat.byterepr(inst) | 75 fmsg = pycompat.byterepr(inst) |
76 self.err(linkrev, "%s: %s" % (msg, fmsg), filename) | 76 self._err(linkrev, "%s: %s" % (msg, fmsg), filename) |
77 | 77 |
78 def checklog(self, obj, name, linkrev): | 78 def checklog(self, obj, name, linkrev): |
79 if not len(obj) and (self.havecl or self.havemf): | 79 if not len(obj) and (self.havecl or self.havemf): |
80 self.err(linkrev, _("empty or missing %s") % name) | 80 self._err(linkrev, _("empty or missing %s") % name) |
81 return | 81 return |
82 | 82 |
83 d = obj.checksize() | 83 d = obj.checksize() |
84 if d[0]: | 84 if d[0]: |
85 self.err(None, _("data length off by %d bytes") % d[0], name) | 85 self.err(None, _("data length off by %d bytes") % d[0], name) |
97 if lr < 0 or (self.havecl and lr not in linkrevs): | 97 if lr < 0 or (self.havecl and lr not in linkrevs): |
98 if lr < 0 or lr >= len(self.repo.changelog): | 98 if lr < 0 or lr >= len(self.repo.changelog): |
99 msg = _("rev %d points to nonexistent changeset %d") | 99 msg = _("rev %d points to nonexistent changeset %d") |
100 else: | 100 else: |
101 msg = _("rev %d points to unexpected changeset %d") | 101 msg = _("rev %d points to unexpected changeset %d") |
102 self.err(None, msg % (i, lr), f) | 102 self._err(None, msg % (i, lr), f) |
103 if linkrevs: | 103 if linkrevs: |
104 if f and len(linkrevs) > 1: | 104 if f and len(linkrevs) > 1: |
105 try: | 105 try: |
106 # attempt to filter down to real linkrevs | 106 # attempt to filter down to real linkrevs |
107 linkrevs = [l for l in linkrevs | 107 linkrevs = [l for l in linkrevs |
113 lr = None # can't be trusted | 113 lr = None # can't be trusted |
114 | 114 |
115 try: | 115 try: |
116 p1, p2 = obj.parents(node) | 116 p1, p2 = obj.parents(node) |
117 if p1 not in seen and p1 != nullid: | 117 if p1 not in seen and p1 != nullid: |
118 self.err(lr, _("unknown parent 1 %s of %s") % | 118 self._err(lr, _("unknown parent 1 %s of %s") % |
119 (short(p1), short(node)), f) | 119 (short(p1), short(node)), f) |
120 if p2 not in seen and p2 != nullid: | 120 if p2 not in seen and p2 != nullid: |
121 self.err(lr, _("unknown parent 2 %s of %s") % | 121 self._err(lr, _("unknown parent 2 %s of %s") % |
122 (short(p2), short(node)), f) | 122 (short(p2), short(node)), f) |
123 except Exception as inst: | 123 except Exception as inst: |
124 self.exc(lr, _("checking parents of %s") % short(node), inst, f) | 124 self.exc(lr, _("checking parents of %s") % short(node), inst, f) |
125 | 125 |
126 if node in seen: | 126 if node in seen: |
127 self.err(lr, _("duplicate revision %d (%d)") % (i, seen[node]), f) | 127 self._err(lr, _("duplicate revision %d (%d)") % (i, seen[node]), f) |
128 seen[node] = i | 128 seen[node] = i |
129 return lr | 129 return lr |
130 | 130 |
131 def verify(self): | 131 def verify(self): |
132 repo = self.repo | 132 repo = self.repo |
231 n = mf.node(i) | 231 n = mf.node(i) |
232 lr = self.checkentry(mf, i, n, seen, mflinkrevs.get(n, []), label) | 232 lr = self.checkentry(mf, i, n, seen, mflinkrevs.get(n, []), label) |
233 if n in mflinkrevs: | 233 if n in mflinkrevs: |
234 del mflinkrevs[n] | 234 del mflinkrevs[n] |
235 elif dir: | 235 elif dir: |
236 self.err(lr, _("%s not in parent-directory manifest") % | 236 self._err(lr, _("%s not in parent-directory manifest") % |
237 short(n), label) | 237 short(n), label) |
238 else: | 238 else: |
239 self.err(lr, _("%s not in changesets") % short(n), label) | 239 self._err(lr, _("%s not in changesets") % short(n), label) |
240 | 240 |
241 try: | 241 try: |
242 mfdelta = mfl.get(dir, n).readdelta(shallow=True) | 242 mfdelta = mfl.get(dir, n).readdelta(shallow=True) |
243 for f, fn, fl in mfdelta.iterentries(): | 243 for f, fn, fl in mfdelta.iterentries(): |
244 if not f: | 244 if not f: |
245 self.err(lr, _("entry without name in manifest")) | 245 self._err(lr, _("entry without name in manifest")) |
246 elif f == "/dev/null": # ignore this in very old repos | 246 elif f == "/dev/null": # ignore this in very old repos |
247 continue | 247 continue |
248 fullpath = dir + _normpath(f) | 248 fullpath = dir + _normpath(f) |
249 if fl == 't': | 249 if fl == 't': |
250 if not match.visitdir(fullpath): | 250 if not match.visitdir(fullpath): |
262 | 262 |
263 if self.havemf: | 263 if self.havemf: |
264 for c, m in sorted([(c, m) for m in mflinkrevs | 264 for c, m in sorted([(c, m) for m in mflinkrevs |
265 for c in mflinkrevs[m]]): | 265 for c in mflinkrevs[m]]): |
266 if dir: | 266 if dir: |
267 self.err(c, _("parent-directory manifest refers to unknown " | 267 self._err(c, _("parent-directory manifest refers to unknown" |
268 "revision %s") % short(m), label) | 268 " revision %s") % short(m), label) |
269 else: | 269 else: |
270 self.err(c, _("changeset refers to unknown revision %s") % | 270 self._err(c, _("changeset refers to unknown revision %s") % |
271 short(m), label) | 271 short(m), label) |
272 | 272 |
273 if not dir and subdirnodes: | 273 if not dir and subdirnodes: |
274 self.ui.status(_("checking directory manifests\n")) | 274 self.ui.status(_("checking directory manifests\n")) |
275 storefiles = set() | 275 storefiles = set() |
276 subdirs = set() | 276 subdirs = set() |
277 revlogv1 = self.revlogv1 | 277 revlogv1 = self.revlogv1 |
278 for f, f2, size in repo.store.datafiles(): | 278 for f, f2, size in repo.store.datafiles(): |
279 if not f: | 279 if not f: |
280 self.err(None, _("cannot decode filename '%s'") % f2) | 280 self._err(None, _("cannot decode filename '%s'") % f2) |
281 elif (size > 0 or not revlogv1) and f.startswith('meta/'): | 281 elif (size > 0 or not revlogv1) and f.startswith('meta/'): |
282 storefiles.add(_normpath(f)) | 282 storefiles.add(_normpath(f)) |
283 subdirs.add(os.path.dirname(f)) | 283 subdirs.add(os.path.dirname(f)) |
284 subdirprogress = ui.makeprogress(_('checking'), unit=_('manifests'), | 284 subdirprogress = ui.makeprogress(_('checking'), unit=_('manifests'), |
285 total=len(subdirs)) | 285 total=len(subdirs)) |
309 if self.havemf: | 309 if self.havemf: |
310 for f in sorted(filelinkrevs): | 310 for f in sorted(filelinkrevs): |
311 progress.increment() | 311 progress.increment() |
312 if f not in filenodes: | 312 if f not in filenodes: |
313 lr = filelinkrevs[f][0] | 313 lr = filelinkrevs[f][0] |
314 self.err(lr, _("in changeset but not in manifest"), f) | 314 self._err(lr, _("in changeset but not in manifest"), f) |
315 | 315 |
316 if self.havecl: | 316 if self.havecl: |
317 for f in sorted(filenodes): | 317 for f in sorted(filenodes): |
318 progress.increment() | 318 progress.increment() |
319 if f not in filelinkrevs: | 319 if f not in filelinkrevs: |
320 try: | 320 try: |
321 fl = repo.file(f) | 321 fl = repo.file(f) |
322 lr = min([fl.linkrev(fl.rev(n)) for n in filenodes[f]]) | 322 lr = min([fl.linkrev(fl.rev(n)) for n in filenodes[f]]) |
323 except Exception: | 323 except Exception: |
324 lr = None | 324 lr = None |
325 self.err(lr, _("in manifest but not in changeset"), f) | 325 self._err(lr, _("in manifest but not in changeset"), f) |
326 | 326 |
327 progress.complete() | 327 progress.complete() |
328 | 328 |
329 def _verifyfiles(self, filenodes, filelinkrevs): | 329 def _verifyfiles(self, filenodes, filelinkrevs): |
330 repo = self.repo | 330 repo = self.repo |
335 ui.status(_("checking files\n")) | 335 ui.status(_("checking files\n")) |
336 | 336 |
337 storefiles = set() | 337 storefiles = set() |
338 for f, f2, size in repo.store.datafiles(): | 338 for f, f2, size in repo.store.datafiles(): |
339 if not f: | 339 if not f: |
340 self.err(None, _("cannot decode filename '%s'") % f2) | 340 self._err(None, _("cannot decode filename '%s'") % f2) |
341 elif (size > 0 or not revlogv1) and f.startswith('data/'): | 341 elif (size > 0 or not revlogv1) and f.startswith('data/'): |
342 storefiles.add(_normpath(f)) | 342 storefiles.add(_normpath(f)) |
343 | 343 |
344 state = { | 344 state = { |
345 # TODO this assumes revlog storage for changelog. | 345 # TODO this assumes revlog storage for changelog. |
367 lr = None | 367 lr = None |
368 | 368 |
369 try: | 369 try: |
370 fl = repo.file(f) | 370 fl = repo.file(f) |
371 except error.StorageError as e: | 371 except error.StorageError as e: |
372 self.err(lr, _("broken revlog! (%s)") % e, f) | 372 self._err(lr, _("broken revlog! (%s)") % e, f) |
373 continue | 373 continue |
374 | 374 |
375 for ff in fl.files(): | 375 for ff in fl.files(): |
376 try: | 376 try: |
377 storefiles.remove(ff) | 377 storefiles.remove(ff) |
380 self._warn(_(" warning: revlog '%s' not in fncache!") % | 380 self._warn(_(" warning: revlog '%s' not in fncache!") % |
381 ff) | 381 ff) |
382 self.fncachewarned = True | 382 self.fncachewarned = True |
383 | 383 |
384 if not len(fl) and (self.havecl or self.havemf): | 384 if not len(fl) and (self.havecl or self.havemf): |
385 self.err(lr, _("empty or missing %s") % f) | 385 self._err(lr, _("empty or missing %s") % f) |
386 else: | 386 else: |
387 # Guard against implementations not setting this. | 387 # Guard against implementations not setting this. |
388 state['skipread'] = set() | 388 state['skipread'] = set() |
389 for problem in fl.verifyintegrity(state): | 389 for problem in fl.verifyintegrity(state): |
390 if problem.node is not None: | 390 if problem.node is not None: |
393 linkrev = None | 393 linkrev = None |
394 | 394 |
395 if problem.warning: | 395 if problem.warning: |
396 self._warn(problem.warning) | 396 self._warn(problem.warning) |
397 elif problem.error: | 397 elif problem.error: |
398 self.err(linkrev if linkrev is not None else lr, | 398 self._err(linkrev if linkrev is not None else lr, |
399 problem.error, f) | 399 problem.error, f) |
400 else: | 400 else: |
401 raise error.ProgrammingError( | 401 raise error.ProgrammingError( |
402 'problem instance does not set warning or error ' | 402 'problem instance does not set warning or error ' |
403 'attribute: %s' % problem.msg) | 403 'attribute: %s' % problem.msg) |
404 | 404 |
407 revisions += 1 | 407 revisions += 1 |
408 n = fl.node(i) | 408 n = fl.node(i) |
409 lr = self.checkentry(fl, i, n, seen, linkrevs, f) | 409 lr = self.checkentry(fl, i, n, seen, linkrevs, f) |
410 if f in filenodes: | 410 if f in filenodes: |
411 if havemf and n not in filenodes[f]: | 411 if havemf and n not in filenodes[f]: |
412 self.err(lr, _("%s not in manifests") % (short(n)), f) | 412 self._err(lr, _("%s not in manifests") % (short(n)), f) |
413 else: | 413 else: |
414 del filenodes[f][n] | 414 del filenodes[f][n] |
415 | 415 |
416 if n in state['skipread']: | 416 if n in state['skipread']: |
417 continue | 417 continue |
428 if not any(rp[0] in pctx for pctx in ctx.parents()): | 428 if not any(rp[0] in pctx for pctx in ctx.parents()): |
429 self._warn(_("warning: copy source of '%s' not" | 429 self._warn(_("warning: copy source of '%s' not" |
430 " in parents of %s") % (f, ctx)) | 430 " in parents of %s") % (f, ctx)) |
431 fl2 = repo.file(rp[0]) | 431 fl2 = repo.file(rp[0]) |
432 if not len(fl2): | 432 if not len(fl2): |
433 self.err(lr, _("empty or missing copy source " | 433 self._err(lr, |
434 "revlog %s:%s") % (rp[0], short(rp[1])), f) | 434 _("empty or missing copy source revlog " |
435 "%s:%s") % (rp[0], | |
436 short(rp[1])), | |
437 f) | |
435 elif rp[1] == nullid: | 438 elif rp[1] == nullid: |
436 ui.note(_("warning: %s@%s: copy source" | 439 ui.note(_("warning: %s@%s: copy source" |
437 " revision is nullid %s:%s\n") | 440 " revision is nullid %s:%s\n") |
438 % (f, lr, rp[0], short(rp[1]))) | 441 % (f, lr, rp[0], short(rp[1]))) |
439 else: | 442 else: |
443 | 446 |
444 # cross-check | 447 # cross-check |
445 if f in filenodes: | 448 if f in filenodes: |
446 fns = [(v, k) for k, v in filenodes[f].iteritems()] | 449 fns = [(v, k) for k, v in filenodes[f].iteritems()] |
447 for lr, node in sorted(fns): | 450 for lr, node in sorted(fns): |
448 self.err(lr, _("manifest refers to unknown revision %s") % | 451 self._err(lr, _("manifest refers to unknown revision %s") % |
449 short(node), f) | 452 short(node), f) |
450 progress.complete() | 453 progress.complete() |
451 | 454 |
452 if self.warnorphanstorefiles: | 455 if self.warnorphanstorefiles: |
453 for f in sorted(storefiles): | 456 for f in sorted(storefiles): |
454 self._warn(_("warning: orphan data file '%s'") % f) | 457 self._warn(_("warning: orphan data file '%s'") % f) |