195 self.refersmf = True |
195 self.refersmf = True |
196 self.exc(i, _("unpacking changeset %s") % short(n), inst) |
196 self.exc(i, _("unpacking changeset %s") % short(n), inst) |
197 ui.progress(_('checking'), None) |
197 ui.progress(_('checking'), None) |
198 return mflinkrevs, filelinkrevs |
198 return mflinkrevs, filelinkrevs |
199 |
199 |
200 def _verifymanifest(self, mflinkrevs): |
200 def _verifymanifest(self, mflinkrevs, dir=""): |
201 repo = self.repo |
201 repo = self.repo |
202 ui = self.ui |
202 ui = self.ui |
203 mf = self.repo.manifest |
203 mf = self.repo.manifest.dirlog(dir) |
204 |
204 |
205 ui.status(_("checking manifests\n")) |
205 if not dir: |
|
206 self.ui.status(_("checking manifests\n")) |
|
207 |
206 filenodes = {} |
208 filenodes = {} |
|
209 subdirnodes = {} |
207 seen = {} |
210 seen = {} |
208 label = "manifest" |
211 label = "manifest" |
|
212 if dir: |
|
213 label = dir |
209 if self.refersmf: |
214 if self.refersmf: |
210 # Do not check manifest if there are only changelog entries with |
215 # Do not check manifest if there are only changelog entries with |
211 # null manifests. |
216 # null manifests. |
212 self.checklog(mf, label, 0) |
217 self.checklog(mf, label, 0) |
213 total = len(mf) |
218 total = len(mf) |
214 for i in mf: |
219 for i in mf: |
215 ui.progress(_('checking'), i, total=total, unit=_('manifests')) |
220 if not dir: |
|
221 ui.progress(_('checking'), i, total=total, unit=_('manifests')) |
216 n = mf.node(i) |
222 n = mf.node(i) |
217 lr = self.checkentry(mf, i, n, seen, mflinkrevs.get(n, []), label) |
223 lr = self.checkentry(mf, i, n, seen, mflinkrevs.get(n, []), label) |
218 if n in mflinkrevs: |
224 if n in mflinkrevs: |
219 del mflinkrevs[n] |
225 del mflinkrevs[n] |
|
226 elif dir: |
|
227 self.err(lr, _("%s not in parent-directory manifest") % |
|
228 short(n), label) |
220 else: |
229 else: |
221 self.err(lr, _("%s not in changesets") % short(n), label) |
230 self.err(lr, _("%s not in changesets") % short(n), label) |
222 |
231 |
223 try: |
232 try: |
224 for f, fn in mf.readdelta(n).iteritems(): |
233 for f, fn, fl in mf.readshallowdelta(n).iterentries(): |
225 if not f: |
234 if not f: |
226 self.err(lr, _("file without name in manifest")) |
235 self.err(lr, _("entry without name in manifest")) |
227 elif f != "/dev/null": # ignore this in very old repos |
236 elif f == "/dev/null": # ignore this in very old repos |
228 if _validpath(repo, f): |
237 continue |
229 filenodes.setdefault( |
238 fullpath = dir + _normpath(f) |
230 _normpath(f), {}).setdefault(fn, lr) |
239 if not _validpath(repo, fullpath): |
|
240 continue |
|
241 if fl == 't': |
|
242 subdirnodes.setdefault(fullpath + '/', {}).setdefault( |
|
243 fn, []).append(lr) |
|
244 else: |
|
245 filenodes.setdefault(fullpath, {}).setdefault(fn, lr) |
231 except Exception as inst: |
246 except Exception as inst: |
232 self.exc(lr, _("reading delta %s") % short(n), inst, label) |
247 self.exc(lr, _("reading delta %s") % short(n), inst, label) |
233 ui.progress(_('checking'), None) |
248 if not dir: |
|
249 ui.progress(_('checking'), None) |
234 |
250 |
235 if self.havemf: |
251 if self.havemf: |
236 for c, m in sorted([(c, m) for m in mflinkrevs |
252 for c, m in sorted([(c, m) for m in mflinkrevs |
237 for c in mflinkrevs[m]]): |
253 for c in mflinkrevs[m]]): |
238 self.err(c, _("changeset refers to unknown revision %s") % |
254 if dir: |
239 short(m), label) |
255 self.err(c, _("parent-directory manifest refers to unknown " |
|
256 "revision %s") % short(m), label) |
|
257 else: |
|
258 self.err(c, _("changeset refers to unknown revision %s") % |
|
259 short(m), label) |
|
260 |
|
261 if not dir and subdirnodes: |
|
262 self.ui.status(_("checking directory manifests\n")) |
|
263 for subdir, linkrevs in subdirnodes.iteritems(): |
|
264 subdirfilenodes = self._verifymanifest(linkrevs, subdir) |
|
265 for f, onefilenodes in subdirfilenodes.iteritems(): |
|
266 filenodes.setdefault(f, {}).update(onefilenodes) |
240 |
267 |
241 return filenodes |
268 return filenodes |
242 |
269 |
243 def _crosscheckfiles(self, filelinkrevs, filenodes): |
270 def _crosscheckfiles(self, filelinkrevs, filenodes): |
244 repo = self.repo |
271 repo = self.repo |