##// END OF EJS Templates
verify: improve handling of empty or missing files...
Matt Mackall -
r5541:ceaa752f default
parent child Browse files
Show More
@@ -62,8 +62,13 b' def _verify(repo):'
62 repo.ui.status(_("repository uses revlog format %d\n") %
62 repo.ui.status(_("repository uses revlog format %d\n") %
63 (revlogv1 and 1 or 0))
63 (revlogv1 and 1 or 0))
64
64
65 havecl = havemf = 1
65 seen = {}
66 seen = {}
66 repo.ui.status(_("checking changesets\n"))
67 repo.ui.status(_("checking changesets\n"))
68 if repo.changelog.count() == 0 and repo.manifest.count() > 1:
69 havecl = 0
70 err(0, _("empty or missing 00changelog.i"))
71 else:
67 checksize(repo.changelog, "changelog")
72 checksize(repo.changelog, "changelog")
68
73
69 for i in xrange(repo.changelog.count()):
74 for i in xrange(repo.changelog.count()):
@@ -96,6 +101,10 b' def _verify(repo):'
96
101
97 seen = {}
102 seen = {}
98 repo.ui.status(_("checking manifests\n"))
103 repo.ui.status(_("checking manifests\n"))
104 if repo.changelog.count() > 0 and repo.manifest.count() == 0:
105 havemf = 0
106 err(0, _("empty or missing 00manifest.i"))
107 else:
99 checkversion(repo.manifest, "manifest")
108 checkversion(repo.manifest, "manifest")
100 checksize(repo.manifest, "manifest")
109 checksize(repo.manifest, "manifest")
101
110
@@ -103,7 +112,7 b' def _verify(repo):'
103 n = repo.manifest.node(i)
112 n = repo.manifest.node(i)
104 l = repo.manifest.linkrev(n)
113 l = repo.manifest.linkrev(n)
105
114
106 if l < 0 or l >= repo.changelog.count():
115 if l < 0 or (havecl and l >= repo.changelog.count()):
107 err(None, _("bad link (%d) at manifest revision %d") % (l, i))
116 err(None, _("bad link (%d) at manifest revision %d") % (l, i))
108
117
109 if n in neededmanifests:
118 if n in neededmanifests:
@@ -132,38 +141,51 b' def _verify(repo):'
132
141
133 repo.ui.status(_("crosschecking files in changesets and manifests\n"))
142 repo.ui.status(_("crosschecking files in changesets and manifests\n"))
134
143
135 nm = neededmanifests.items()
144 if havemf > 0:
145 nm = [(c, m) for m, c in neededmanifests.items()]
136 nm.sort()
146 nm.sort()
137 for m, c in nm:
147 for c, m in nm:
138 err(m, _("changeset refers to unknown manifest %s") % short(c))
148 err(c, _("changeset refers to unknown manifest %s") % short(m))
139 del neededmanifests, nm
149 del neededmanifests, nm
140
150
141 for f in filenodes:
151 if havecl:
152 fl = filenodes.keys()
153 fl.sort()
154 for f in fl:
142 if f not in filelinkrevs:
155 if f not in filelinkrevs:
143 lrs = [repo.manifest.linkrev(n) for n in filenodes[f]]
156 lrs = [repo.manifest.linkrev(n) for n in filenodes[f]]
144 lrs.sort()
157 lrs.sort()
145 err(lrs[0], _("in manifest but not in changeset"), f)
158 err(lrs[0], _("in manifest but not in changeset"), f)
159 del fl
146
160
147 for f in filelinkrevs:
161 if havemf:
162 fl = filelinkrevs.keys()
163 fl.sort()
164 for f in fl:
148 if f not in filenodes:
165 if f not in filenodes:
149 lr = filelinkrevs[f][0]
166 lr = filelinkrevs[f][0]
150 err(lr, _("in changeset but not in manifest"), f)
167 err(lr, _("in changeset but not in manifest"), f)
168 del fl
151
169
152 repo.ui.status(_("checking files\n"))
170 repo.ui.status(_("checking files\n"))
153 ff = filenodes.keys()
171 ff = dict.fromkeys(filenodes.keys() + filelinkrevs.keys()).keys()
154 ff.sort()
172 ff.sort()
155 for f in ff:
173 for f in ff:
156 if f == "/dev/null":
174 if f == "/dev/null":
157 continue
175 continue
158 files += 1
176 files += 1
159 if not f:
177 if not f:
160 lr = repo.manifest.linkrev(filenodes[f][0])
178 lr = filelinkrevs[f][0]
161 err(lr, _("file without name in manifest %s") % short(ff[n]))
179 err(lr, _("file without name in manifest"))
162 continue
180 continue
163 fl = repo.file(f)
181 fl = repo.file(f)
164 checkversion(fl, f)
182 checkversion(fl, f)
165 checksize(fl, f)
183 checksize(fl, f)
166
184
185 if fl.count() == 0:
186 err(filelinkrevs[f][0], _("empty or missing revlog"), f)
187 continue
188
167 seen = {}
189 seen = {}
168 nodes = {nullid: 1}
190 nodes = {nullid: 1}
169 for i in xrange(fl.count()):
191 for i in xrange(fl.count()):
@@ -171,7 +193,7 b' def _verify(repo):'
171 n = fl.node(i)
193 n = fl.node(i)
172 flr = fl.linkrev(n)
194 flr = fl.linkrev(n)
173
195
174 if flr not in filelinkrevs.get(f, []):
196 if flr < 0 or (havecl and flr not in filelinkrevs.get(f, [])):
175 if flr < 0 or flr >= repo.changelog.count():
197 if flr < 0 or flr >= repo.changelog.count():
176 err(None, _("rev %d point to nonexistent changeset %d")
198 err(None, _("rev %d point to nonexistent changeset %d")
177 % (i, flr), f)
199 % (i, flr), f)
@@ -182,11 +204,13 b' def _verify(repo):'
182 warn(_(" (expected %s)") % filelinkrevs[f][0])
204 warn(_(" (expected %s)") % filelinkrevs[f][0])
183 flr = None # can't be trusted
205 flr = None # can't be trusted
184 else:
206 else:
207 if havecl:
185 filelinkrevs[f].remove(flr)
208 filelinkrevs[f].remove(flr)
186
209
187 if n in seen:
210 if n in seen:
188 err(flr, _("duplicate revision %d") % i, f)
211 err(flr, _("duplicate revision %d") % i, f)
189 if n not in filenodes[f]:
212 if f in filenodes:
213 if havemf and n not in filenodes[f]:
190 err(flr, _("%s not in manifests") % (short(n)), f)
214 err(flr, _("%s not in manifests") % (short(n)), f)
191 else:
215 else:
192 del filenodes[f][n]
216 del filenodes[f][n]
@@ -230,6 +254,7 b' def _verify(repo):'
230 (short(n), inst), f)
254 (short(n), inst), f)
231
255
232 # cross-check
256 # cross-check
257 if f in filenodes:
233 fns = [(repo.manifest.linkrev(filenodes[f][n]), n)
258 fns = [(repo.manifest.linkrev(filenodes[f][n]), n)
234 for n in filenodes[f]]
259 for n in filenodes[f]]
235 fns.sort()
260 fns.sort()
@@ -247,4 +272,3 b' def _verify(repo):'
247 repo.ui.warn(_("(first damaged changeset appears to be %d)\n")
272 repo.ui.warn(_("(first damaged changeset appears to be %d)\n")
248 % firstbad[0])
273 % firstbad[0])
249 return 1
274 return 1
250
General Comments 0
You need to be logged in to leave comments. Login now