comparison mercurial/verify.py @ 6751:7424a75f919a

verify: add some local variables
author Matt Mackall <mpm@selenic.com>
date Thu, 26 Jun 2008 14:35:50 -0500
parents fb42030d79d6
children e79a8f36c2a5
comparison
equal deleted inserted replaced
6750:fb42030d79d6 6751:7424a75f919a
22 changesets = revisions = files = 0 22 changesets = revisions = files = 0
23 firstbad = [None] 23 firstbad = [None]
24 errors = [0] 24 errors = [0]
25 warnings = [0] 25 warnings = [0]
26 neededmanifests = {} 26 neededmanifests = {}
27 ui = repo.ui
28 cl = repo.changelog
29 mf = repo.manifest
27 30
28 def err(linkrev, msg, filename=None): 31 def err(linkrev, msg, filename=None):
29 if linkrev != None: 32 if linkrev != None:
30 if firstbad[0] != None: 33 if firstbad[0] != None:
31 firstbad[0] = min(firstbad[0], linkrev) 34 firstbad[0] = min(firstbad[0], linkrev)
34 else: 37 else:
35 linkrev = "?" 38 linkrev = "?"
36 msg = "%s: %s" % (linkrev, msg) 39 msg = "%s: %s" % (linkrev, msg)
37 if filename: 40 if filename:
38 msg = "%s@%s" % (filename, msg) 41 msg = "%s@%s" % (filename, msg)
39 repo.ui.warn(" " + msg + "\n") 42 ui.warn(" " + msg + "\n")
40 errors[0] += 1 43 errors[0] += 1
41 44
42 def warn(msg): 45 def warn(msg):
43 repo.ui.warn(msg + "\n") 46 ui.warn(msg + "\n")
44 warnings[0] += 1 47 warnings[0] += 1
45 48
46 def checksize(obj, name): 49 def checksize(obj, name):
47 d = obj.checksize() 50 d = obj.checksize()
48 if d[0]: 51 if d[0]:
55 if not revlogv1: 58 if not revlogv1:
56 warn(_("warning: `%s' uses revlog format 1") % name) 59 warn(_("warning: `%s' uses revlog format 1") % name)
57 elif revlogv1: 60 elif revlogv1:
58 warn(_("warning: `%s' uses revlog format 0") % name) 61 warn(_("warning: `%s' uses revlog format 0") % name)
59 62
60 revlogv1 = repo.changelog.version != revlog.REVLOGV0 63 revlogv1 = cl.version != revlog.REVLOGV0
61 if repo.ui.verbose or not revlogv1: 64 if ui.verbose or not revlogv1:
62 repo.ui.status(_("repository uses revlog format %d\n") % 65 ui.status(_("repository uses revlog format %d\n") %
63 (revlogv1 and 1 or 0)) 66 (revlogv1 and 1 or 0))
64 67
65 havecl = havemf = 1 68 havecl = havemf = 1
66 seen = {} 69 seen = {}
67 repo.ui.status(_("checking changesets\n")) 70 ui.status(_("checking changesets\n"))
68 if not len(repo) and len(repo.manifest): 71 if not len(cl) and len(mf):
69 havecl = 0 72 havecl = 0
70 err(0, _("empty or missing 00changelog.i")) 73 err(0, _("empty or missing 00changelog.i"))
71 else: 74 else:
72 checksize(repo.changelog, "changelog") 75 checksize(cl, "changelog")
73 76
74 for i in repo: 77 for i in repo:
75 changesets += 1 78 changesets += 1
76 n = repo.changelog.node(i) 79 n = cl.node(i)
77 l = repo.changelog.linkrev(n) 80 l = cl.linkrev(n)
78 if l != i: 81 if l != i:
79 err(i, _("incorrect link (%d) for changeset") %(l)) 82 err(i, _("incorrect link (%d) for changeset") %(l))
80 if n in seen: 83 if n in seen:
81 err(i, _("duplicates changeset at revision %d") % seen[n]) 84 err(i, _("duplicates changeset at revision %d") % seen[n])
82 seen[n] = i 85 seen[n] = i
83 86
84 for p in repo.changelog.parents(n): 87 for p in cl.parents(n):
85 if p not in repo.changelog.nodemap: 88 if p not in cl.nodemap:
86 err(i, _("changeset has unknown parent %s") % short(p)) 89 err(i, _("changeset has unknown parent %s") % short(p))
87 try: 90 try:
88 changes = repo.changelog.read(n) 91 changes = cl.read(n)
89 except KeyboardInterrupt: 92 except KeyboardInterrupt:
90 repo.ui.warn(_("interrupted")) 93 ui.warn(_("interrupted"))
91 raise 94 raise
92 except Exception, inst: 95 except Exception, inst:
93 err(i, _("unpacking changeset: %s") % inst) 96 err(i, _("unpacking changeset: %s") % inst)
94 continue 97 continue
95 98
98 101
99 for f in changes[3]: 102 for f in changes[3]:
100 filelinkrevs.setdefault(f, []).append(i) 103 filelinkrevs.setdefault(f, []).append(i)
101 104
102 seen = {} 105 seen = {}
103 repo.ui.status(_("checking manifests\n")) 106 ui.status(_("checking manifests\n"))
104 if len(repo) and not len(repo.manifest): 107 if len(cl) and not len(mf):
105 havemf = 0 108 havemf = 0
106 err(0, _("empty or missing 00manifest.i")) 109 err(0, _("empty or missing 00manifest.i"))
107 else: 110 else:
108 checkversion(repo.manifest, "manifest") 111 checkversion(mf, "manifest")
109 checksize(repo.manifest, "manifest") 112 checksize(mf, "manifest")
110 113
111 for i in repo.manifest: 114 for i in mf:
112 n = repo.manifest.node(i) 115 n = mf.node(i)
113 l = repo.manifest.linkrev(n) 116 l = mf.linkrev(n)
114 117
115 if l < 0 or (havecl and l >= len(repo)): 118 if l < 0 or (havecl and l >= len(cl)):
116 err(None, _("bad link (%d) at manifest revision %d") % (l, i)) 119 err(None, _("bad link (%d) at manifest revision %d") % (l, i))
117 120
118 if n in neededmanifests: 121 if n in neededmanifests:
119 del neededmanifests[n] 122 del neededmanifests[n]
120 123
121 if n in seen: 124 if n in seen:
122 err(l, _("duplicates manifest from %d") % seen[n]) 125 err(l, _("duplicates manifest from %d") % seen[n])
123 126
124 seen[n] = l 127 seen[n] = l
125 128
126 for p in repo.manifest.parents(n): 129 for p in mf.parents(n):
127 if p not in repo.manifest.nodemap: 130 if p not in mf.nodemap:
128 err(l, _("manifest has unknown parent %s") % short(p)) 131 err(l, _("manifest has unknown parent %s") % short(p))
129 132
130 try: 133 try:
131 for f, fn in repo.manifest.readdelta(n).iteritems(): 134 for f, fn in mf.readdelta(n).iteritems():
132 fns = filenodes.setdefault(f, {}) 135 fns = filenodes.setdefault(f, {})
133 if fn not in fns: 136 if fn not in fns:
134 fns[fn] = n 137 fns[fn] = n
135 except KeyboardInterrupt: 138 except KeyboardInterrupt:
136 repo.ui.warn(_("interrupted")) 139 ui.warn(_("interrupted"))
137 raise 140 raise
138 except Exception, inst: 141 except Exception, inst:
139 err(l, _("reading manifest delta: %s") % inst) 142 err(l, _("reading manifest delta: %s") % inst)
140 continue 143 continue
141 144
142 repo.ui.status(_("crosschecking files in changesets and manifests\n")) 145 ui.status(_("crosschecking files in changesets and manifests\n"))
143 146
144 if havemf > 0: 147 if havemf > 0:
145 nm = [(c, m) for m, c in neededmanifests.items()] 148 nm = [(c, m) for m, c in neededmanifests.items()]
146 nm.sort() 149 nm.sort()
147 for c, m in nm: 150 for c, m in nm:
151 if havecl: 154 if havecl:
152 fl = filenodes.keys() 155 fl = filenodes.keys()
153 fl.sort() 156 fl.sort()
154 for f in fl: 157 for f in fl:
155 if f not in filelinkrevs: 158 if f not in filelinkrevs:
156 lrs = [repo.manifest.linkrev(n) for n in filenodes[f]] 159 lrs = [mf.linkrev(n) for n in filenodes[f]]
157 lrs.sort() 160 lrs.sort()
158 err(lrs[0], _("in manifest but not in changeset"), f) 161 err(lrs[0], _("in manifest but not in changeset"), f)
159 del fl 162 del fl
160 163
161 if havemf: 164 if havemf:
165 if f not in filenodes: 168 if f not in filenodes:
166 lr = filelinkrevs[f][0] 169 lr = filelinkrevs[f][0]
167 err(lr, _("in changeset but not in manifest"), f) 170 err(lr, _("in changeset but not in manifest"), f)
168 del fl 171 del fl
169 172
170 repo.ui.status(_("checking files\n")) 173 ui.status(_("checking files\n"))
171 ff = dict.fromkeys(filenodes.keys() + filelinkrevs.keys()).keys() 174 ff = dict.fromkeys(filenodes.keys() + filelinkrevs.keys()).keys()
172 ff.sort() 175 ff.sort()
173 for f in ff: 176 for f in ff:
174 if f == "/dev/null": 177 if f == "/dev/null":
175 continue 178 continue
217 220
218 # verify contents 221 # verify contents
219 try: 222 try:
220 t = fl.read(n) 223 t = fl.read(n)
221 except KeyboardInterrupt: 224 except KeyboardInterrupt:
222 repo.ui.warn(_("interrupted")) 225 ui.warn(_("interrupted"))
223 raise 226 raise
224 except Exception, inst: 227 except Exception, inst:
225 err(flr, _("unpacking %s: %s") % (short(n), inst), f) 228 err(flr, _("unpacking %s: %s") % (short(n), inst), f)
226 229
227 # verify parents 230 # verify parents
232 (short(p1), short(n)), f) 235 (short(p1), short(n)), f)
233 if p2 not in nodes: 236 if p2 not in nodes:
234 err(flr, _("unknown parent 2 %s of %s") % 237 err(flr, _("unknown parent 2 %s of %s") %
235 (short(p2), short(p1)), f) 238 (short(p2), short(p1)), f)
236 except KeyboardInterrupt: 239 except KeyboardInterrupt:
237 repo.ui.warn(_("interrupted")) 240 ui.warn(_("interrupted"))
238 raise 241 raise
239 except Exception, inst: 242 except Exception, inst:
240 err(flr, _("checking parents of %s: %s") % (short(n), inst), f) 243 err(flr, _("checking parents of %s: %s") % (short(n), inst), f)
241 nodes[n] = 1 244 nodes[n] = 1
242 245
252 err(flr, _("copy source revision is nullid %s:%s") 255 err(flr, _("copy source revision is nullid %s:%s")
253 % (rp[0], short(rp[1])), f) 256 % (rp[0], short(rp[1])), f)
254 else: 257 else:
255 rev = fl2.rev(rp[1]) 258 rev = fl2.rev(rp[1])
256 except KeyboardInterrupt: 259 except KeyboardInterrupt:
257 repo.ui.warn(_("interrupted")) 260 ui.warn(_("interrupted"))
258 raise 261 raise
259 except Exception, inst: 262 except Exception, inst:
260 err(flr, _("checking rename of %s: %s") % 263 err(flr, _("checking rename of %s: %s") %
261 (short(n), inst), f) 264 (short(n), inst), f)
262 265
263 # cross-check 266 # cross-check
264 if f in filenodes: 267 if f in filenodes:
265 fns = [(repo.manifest.linkrev(filenodes[f][n]), n) 268 fns = [(mf.linkrev(filenodes[f][n]), n)
266 for n in filenodes[f]] 269 for n in filenodes[f]]
267 fns.sort() 270 fns.sort()
268 for lr, node in fns: 271 for lr, node in fns:
269 err(lr, _("%s in manifests not found") % short(node), f) 272 err(lr, _("%s in manifests not found") % short(node), f)
270 273
271 repo.ui.status(_("%d files, %d changesets, %d total revisions\n") % 274 ui.status(_("%d files, %d changesets, %d total revisions\n") %
272 (files, changesets, revisions)) 275 (files, changesets, revisions))
273 276
274 if warnings[0]: 277 if warnings[0]:
275 repo.ui.warn(_("%d warnings encountered!\n") % warnings[0]) 278 ui.warn(_("%d warnings encountered!\n") % warnings[0])
276 if errors[0]: 279 if errors[0]:
277 repo.ui.warn(_("%d integrity errors encountered!\n") % errors[0]) 280 ui.warn(_("%d integrity errors encountered!\n") % errors[0])
278 if firstbad[0]: 281 if firstbad[0]:
279 repo.ui.warn(_("(first damaged changeset appears to be %d)\n") 282 ui.warn(_("(first damaged changeset appears to be %d)\n")
280 % firstbad[0]) 283 % firstbad[0])
281 return 1 284 return 1