comparison mercurial/verify.py @ 27448:f4f2179077cb

verify: move exc() function onto class This is part of an effort to make verify more modular so extensions can hook into it.
author Durham Goode <durham@fb.com>
date Fri, 18 Dec 2015 16:42:39 -0800
parents d1b91c10ce70
children 467338e690f8
comparison
equal deleted inserted replaced
27447:d1b91c10ce70 27448:f4f2179077cb
73 if filename: 73 if filename:
74 msg = "%s@%s" % (filename, msg) 74 msg = "%s@%s" % (filename, msg)
75 self.ui.warn(" " + msg + "\n") 75 self.ui.warn(" " + msg + "\n")
76 self.errors[0] += 1 76 self.errors[0] += 1
77 77
78 def exc(self, linkrev, msg, inst, filename=None):
79 if isinstance(inst, KeyboardInterrupt):
80 self.ui.warn(_("interrupted"))
81 raise
82 if not str(inst):
83 inst = repr(inst)
84 self.err(linkrev, "%s: %s" % (msg, inst), filename)
85
78 def verify(self): 86 def verify(self):
79 repo = self.repo 87 repo = self.repo
80 mflinkrevs = {} 88 mflinkrevs = {}
81 filelinkrevs = {} 89 filelinkrevs = {}
82 filenodes = {} 90 filenodes = {}
89 mf = repo.manifest 97 mf = repo.manifest
90 lrugetctx = self.lrugetctx 98 lrugetctx = self.lrugetctx
91 99
92 if not repo.url().startswith('file:'): 100 if not repo.url().startswith('file:'):
93 raise error.Abort(_("cannot verify bundle or remote repos")) 101 raise error.Abort(_("cannot verify bundle or remote repos"))
94
95
96 def exc(linkrev, msg, inst, filename=None):
97 if isinstance(inst, KeyboardInterrupt):
98 ui.warn(_("interrupted"))
99 raise
100 if not str(inst):
101 inst = repr(inst)
102 self.err(linkrev, "%s: %s" % (msg, inst), filename)
103
104 102
105 def checklog(obj, name, linkrev): 103 def checklog(obj, name, linkrev):
106 if not len(obj) and (havecl or havemf): 104 if not len(obj) and (havecl or havemf):
107 self.err(linkrev, _("empty or missing %s") % name) 105 self.err(linkrev, _("empty or missing %s") % name)
108 return 106 return
146 (short(p1), short(node)), f) 144 (short(p1), short(node)), f)
147 if p2 not in seen and p2 != nullid: 145 if p2 not in seen and p2 != nullid:
148 self.err(lr, _("unknown parent 2 %s of %s") % 146 self.err(lr, _("unknown parent 2 %s of %s") %
149 (short(p2), short(node)), f) 147 (short(p2), short(node)), f)
150 except Exception as inst: 148 except Exception as inst:
151 exc(lr, _("checking parents of %s") % short(node), inst, f) 149 self.exc(lr, _("checking parents of %s") % short(node), inst, f)
152 150
153 if node in seen: 151 if node in seen:
154 self.err(lr, _("duplicate revision %d (%d)") % 152 self.err(lr, _("duplicate revision %d (%d)") %
155 (i, seen[node]), f) 153 (i, seen[node]), f)
156 seen[node] = i 154 seen[node] = i
184 for f in changes[3]: 182 for f in changes[3]:
185 if _validpath(repo, f): 183 if _validpath(repo, f):
186 filelinkrevs.setdefault(_normpath(f), []).append(i) 184 filelinkrevs.setdefault(_normpath(f), []).append(i)
187 except Exception as inst: 185 except Exception as inst:
188 self.refersmf = True 186 self.refersmf = True
189 exc(i, _("unpacking changeset %s") % short(n), inst) 187 self.exc(i, _("unpacking changeset %s") % short(n), inst)
190 ui.progress(_('checking'), None) 188 ui.progress(_('checking'), None)
191 189
192 ui.status(_("checking manifests\n")) 190 ui.status(_("checking manifests\n"))
193 seen = {} 191 seen = {}
194 if self.refersmf: 192 if self.refersmf:
212 elif f != "/dev/null": # ignore this in very old repos 210 elif f != "/dev/null": # ignore this in very old repos
213 if _validpath(repo, f): 211 if _validpath(repo, f):
214 filenodes.setdefault( 212 filenodes.setdefault(
215 _normpath(f), {}).setdefault(fn, lr) 213 _normpath(f), {}).setdefault(fn, lr)
216 except Exception as inst: 214 except Exception as inst:
217 exc(lr, _("reading manifest delta %s") % short(n), inst) 215 self.exc(lr, _("reading manifest delta %s") % short(n), inst)
218 ui.progress(_('checking'), None) 216 ui.progress(_('checking'), None)
219 217
220 ui.status(_("crosschecking files in changesets and manifests\n")) 218 ui.status(_("crosschecking files in changesets and manifests\n"))
221 219
222 total = len(mflinkrevs) + len(filelinkrevs) + len(filenodes) 220 total = len(mflinkrevs) + len(filelinkrevs) + len(filenodes)
314 except error.CensoredNodeError: 312 except error.CensoredNodeError:
315 # experimental config: censor.policy 313 # experimental config: censor.policy
316 if ui.config("censor", "policy", "abort") == "abort": 314 if ui.config("censor", "policy", "abort") == "abort":
317 self.err(lr, _("censored file data"), f) 315 self.err(lr, _("censored file data"), f)
318 except Exception as inst: 316 except Exception as inst:
319 exc(lr, _("unpacking %s") % short(n), inst, f) 317 self.exc(lr, _("unpacking %s") % short(n), inst, f)
320 318
321 # check renames 319 # check renames
322 try: 320 try:
323 if rp: 321 if rp:
324 if lr is not None and ui.verbose: 322 if lr is not None and ui.verbose:
340 " revision is nullid %s:%s\n") 338 " revision is nullid %s:%s\n")
341 % (f, lr, rp[0], short(rp[1]))) 339 % (f, lr, rp[0], short(rp[1])))
342 else: 340 else:
343 fl2.rev(rp[1]) 341 fl2.rev(rp[1])
344 except Exception as inst: 342 except Exception as inst:
345 exc(lr, _("checking rename of %s") % short(n), inst, f) 343 self.exc(lr, _("checking rename of %s") % short(n), inst, f)
346 344
347 # cross-check 345 # cross-check
348 if f in filenodes: 346 if f in filenodes:
349 fns = [(lr, n) for n, lr in filenodes[f].iteritems()] 347 fns = [(lr, n) for n, lr in filenodes[f].iteritems()]
350 for lr, node in sorted(fns): 348 for lr, node in sorted(fns):