comparison mercurial/verify.py @ 9657:96c803e9018f

verify: filter the candidate list for broken linkrevs
author Matt Mackall <mpm@selenic.com>
date Wed, 28 Oct 2009 13:17:03 -0500
parents 98feea5659d9
children b33d70849a20
comparison
equal deleted inserted replaced
9656:2ae3758526d8 9657:96c803e9018f
25 errors = [0] 25 errors = [0]
26 warnings = [0] 26 warnings = [0]
27 ui = repo.ui 27 ui = repo.ui
28 cl = repo.changelog 28 cl = repo.changelog
29 mf = repo.manifest 29 mf = repo.manifest
30 lrugetctx = util.lrucachefunc(repo.changectx)
30 31
31 if not repo.cancopy(): 32 if not repo.cancopy():
32 raise util.Abort(_("cannot verify bundle or remote repos")) 33 raise util.Abort(_("cannot verify bundle or remote repos"))
33 34
34 def err(linkrev, msg, filename=None): 35 def err(linkrev, msg, filename=None):
76 msg = _("rev %d points to nonexistent changeset %d") 77 msg = _("rev %d points to nonexistent changeset %d")
77 else: 78 else:
78 msg = _("rev %d points to unexpected changeset %d") 79 msg = _("rev %d points to unexpected changeset %d")
79 err(None, msg % (i, lr), f) 80 err(None, msg % (i, lr), f)
80 if linkrevs: 81 if linkrevs:
82 if f and len(linkrevs) > 1:
83 try:
84 # attempt to filter down to real linkrevs
85 linkrevs = [l for l in linkrevs
86 if lrugetctx(l)[f].filenode() == node]
87 except:
88 pass
81 warn(_(" (expected %s)") % " ".join(map(str, linkrevs))) 89 warn(_(" (expected %s)") % " ".join(map(str, linkrevs)))
82 lr = None # can't be trusted 90 lr = None # can't be trusted
83 91
84 try: 92 try:
85 p1, p2 = obj.parents(node) 93 p1, p2 = obj.parents(node)
134 try: 142 try:
135 for f, fn in mf.readdelta(n).iteritems(): 143 for f, fn in mf.readdelta(n).iteritems():
136 if not f: 144 if not f:
137 err(lr, _("file without name in manifest")) 145 err(lr, _("file without name in manifest"))
138 elif f != "/dev/null": 146 elif f != "/dev/null":
139 fns = filenodes.setdefault(f, {}) 147 filenodes.setdefault(f, {}).setdefault(fn, lr)
140 if fn not in fns:
141 fns[fn] = i
142 except Exception, inst: 148 except Exception, inst:
143 exc(lr, _("reading manifest delta %s") % short(n), inst) 149 exc(lr, _("reading manifest delta %s") % short(n), inst)
144 150
145 ui.status(_("crosschecking files in changesets and manifests\n")) 151 ui.status(_("crosschecking files in changesets and manifests\n"))
146 152
171 if not f: 177 if not f:
172 err(None, _("cannot decode filename '%s'") % f2) 178 err(None, _("cannot decode filename '%s'") % f2)
173 elif size > 0: 179 elif size > 0:
174 storefiles.add(f) 180 storefiles.add(f)
175 181
176 lrugetctx = util.lrucachefunc(repo.changectx)
177 files = sorted(set(filenodes) | set(filelinkrevs)) 182 files = sorted(set(filenodes) | set(filelinkrevs))
178 for f in files: 183 for f in files:
179 try: 184 try:
180 linkrevs = filelinkrevs[f] 185 linkrevs = filelinkrevs[f]
181 except KeyError: 186 except KeyError:
248 except Exception, inst: 253 except Exception, inst:
249 exc(lr, _("checking rename of %s") % short(n), inst, f) 254 exc(lr, _("checking rename of %s") % short(n), inst, f)
250 255
251 # cross-check 256 # cross-check
252 if f in filenodes: 257 if f in filenodes:
253 fns = [(mf.linkrev(l), n) for n,l in filenodes[f].iteritems()] 258 fns = [(lr, n) for n,lr in filenodes[f].iteritems()]
254 for lr, node in sorted(fns): 259 for lr, node in sorted(fns):
255 err(lr, _("%s in manifests not found") % short(node), f) 260 err(lr, _("%s in manifests not found") % short(node), f)
256 261
257 for f in storefiles: 262 for f in storefiles:
258 warn(_("warning: orphan revlog '%s'") % f) 263 warn(_("warning: orphan revlog '%s'") % f)