Show More
@@ -24,6 +24,9 b' def _verify(repo):' | |||||
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: | |
@@ -36,11 +39,11 b' def _verify(repo):' | |||||
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 |
|
|
42 | ui.warn(" " + msg + "\n") | |
40 | errors[0] += 1 |
|
43 | errors[0] += 1 | |
41 |
|
44 | |||
42 | def warn(msg): |
|
45 | def warn(msg): | |
43 |
|
|
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): | |
@@ -57,37 +60,37 b' def _verify(repo):' | |||||
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 = |
|
63 | revlogv1 = cl.version != revlog.REVLOGV0 | |
61 |
if |
|
64 | if ui.verbose or not revlogv1: | |
62 |
|
|
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 |
|
|
70 | ui.status(_("checking changesets\n")) | |
68 |
if not len( |
|
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( |
|
75 | checksize(cl, "changelog") | |
73 |
|
76 | |||
74 | for i in repo: |
|
77 | for i in repo: | |
75 | changesets += 1 |
|
78 | changesets += 1 | |
76 |
n = |
|
79 | n = cl.node(i) | |
77 |
l = |
|
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 |
|
87 | for p in cl.parents(n): | |
85 |
if p not in |
|
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 = |
|
91 | changes = cl.read(n) | |
89 | except KeyboardInterrupt: |
|
92 | except KeyboardInterrupt: | |
90 |
|
|
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) | |
@@ -100,19 +103,19 b' def _verify(repo):' | |||||
100 | filelinkrevs.setdefault(f, []).append(i) |
|
103 | filelinkrevs.setdefault(f, []).append(i) | |
101 |
|
104 | |||
102 | seen = {} |
|
105 | seen = {} | |
103 |
|
|
106 | ui.status(_("checking manifests\n")) | |
104 |
if len( |
|
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( |
|
111 | checkversion(mf, "manifest") | |
109 |
checksize( |
|
112 | checksize(mf, "manifest") | |
110 |
|
113 | |||
111 |
for i in |
|
114 | for i in mf: | |
112 |
n = |
|
115 | n = mf.node(i) | |
113 |
l = |
|
116 | l = mf.linkrev(n) | |
114 |
|
117 | |||
115 |
if l < 0 or (havecl and l >= len( |
|
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: | |
@@ -123,23 +126,23 b' def _verify(repo):' | |||||
123 |
|
126 | |||
124 | seen[n] = l |
|
127 | seen[n] = l | |
125 |
|
128 | |||
126 |
for p in |
|
129 | for p in mf.parents(n): | |
127 |
if p not in |
|
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 |
|
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 |
|
|
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 |
|
|
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()] | |
@@ -153,7 +156,7 b' def _verify(repo):' | |||||
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 = [ |
|
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 | |
@@ -167,7 +170,7 b' def _verify(repo):' | |||||
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 |
|
|
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: | |
@@ -219,7 +222,7 b' def _verify(repo):' | |||||
219 | try: |
|
222 | try: | |
220 | t = fl.read(n) |
|
223 | t = fl.read(n) | |
221 | except KeyboardInterrupt: |
|
224 | except KeyboardInterrupt: | |
222 |
|
|
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) | |
@@ -234,7 +237,7 b' def _verify(repo):' | |||||
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 |
|
|
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) | |
@@ -254,7 +257,7 b' def _verify(repo):' | |||||
254 | else: |
|
257 | else: | |
255 | rev = fl2.rev(rp[1]) |
|
258 | rev = fl2.rev(rp[1]) | |
256 | except KeyboardInterrupt: |
|
259 | except KeyboardInterrupt: | |
257 |
|
|
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") % | |
@@ -262,20 +265,20 b' def _verify(repo):' | |||||
262 |
|
265 | |||
263 | # cross-check |
|
266 | # cross-check | |
264 | if f in filenodes: |
|
267 | if f in filenodes: | |
265 |
fns = [( |
|
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 |
|
|
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 |
|
|
278 | ui.warn(_("%d warnings encountered!\n") % warnings[0]) | |
276 | if errors[0]: |
|
279 | if errors[0]: | |
277 |
|
|
280 | ui.warn(_("%d integrity errors encountered!\n") % errors[0]) | |
278 | if firstbad[0]: |
|
281 | if firstbad[0]: | |
279 |
|
|
282 | ui.warn(_("(first damaged changeset appears to be %d)\n") | |
280 | % firstbad[0]) |
|
283 | % firstbad[0]) | |
281 | return 1 |
|
284 | return 1 |
General Comments 0
You need to be logged in to leave comments.
Login now