mercurial/verify.py
changeset 28203 7297e9e13a8a
parent 28115 bd279da57e4b
child 28204 962921c330b0
equal deleted inserted replaced
28202:a4692267bc2d 28203:7297e9e13a8a
   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