mercurial/verify.py
changeset 28204 962921c330b0
parent 28203 7297e9e13a8a
child 28205 53f42c8d5f71
equal deleted inserted replaced
28203:7297e9e13a8a 28204:962921c330b0
   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, dir=""):
   200     def _verifymanifest(self, mflinkrevs, dir="", storefiles=None):
   201         repo = self.repo
   201         repo = self.repo
   202         ui = self.ui
   202         ui = self.ui
   203         mf = self.repo.manifest.dirlog(dir)
   203         mf = self.repo.manifest.dirlog(dir)
   204 
   204 
   205         if not dir:
   205         if not dir:
   209         subdirnodes = {}
   209         subdirnodes = {}
   210         seen = {}
   210         seen = {}
   211         label = "manifest"
   211         label = "manifest"
   212         if dir:
   212         if dir:
   213             label = dir
   213             label = dir
       
   214             revlogfiles = mf.files()
       
   215             storefiles.difference_update(revlogfiles)
   214         if self.refersmf:
   216         if self.refersmf:
   215             # Do not check manifest if there are only changelog entries with
   217             # Do not check manifest if there are only changelog entries with
   216             # null manifests.
   218             # null manifests.
   217             self.checklog(mf, label, 0)
   219             self.checklog(mf, label, 0)
   218         total = len(mf)
   220         total = len(mf)
   258                     self.err(c, _("changeset refers to unknown revision %s") %
   260                     self.err(c, _("changeset refers to unknown revision %s") %
   259                              short(m), label)
   261                              short(m), label)
   260 
   262 
   261         if not dir and subdirnodes:
   263         if not dir and subdirnodes:
   262             self.ui.status(_("checking directory manifests\n"))
   264             self.ui.status(_("checking directory manifests\n"))
       
   265             storefiles = set()
       
   266             revlogv1 = self.revlogv1
       
   267             for f, f2, size in repo.store.datafiles():
       
   268                 if not f:
       
   269                     self.err(None, _("cannot decode filename '%s'") % f2)
       
   270                 elif (size > 0 or not revlogv1) and f.startswith('meta/'):
       
   271                     storefiles.add(_normpath(f))
       
   272 
   263         for subdir, linkrevs in subdirnodes.iteritems():
   273         for subdir, linkrevs in subdirnodes.iteritems():
   264             subdirfilenodes = self._verifymanifest(linkrevs, subdir)
   274             subdirfilenodes = self._verifymanifest(linkrevs, subdir, storefiles)
   265             for f, onefilenodes in subdirfilenodes.iteritems():
   275             for f, onefilenodes in subdirfilenodes.iteritems():
   266                 filenodes.setdefault(f, {}).update(onefilenodes)
   276                 filenodes.setdefault(f, {}).update(onefilenodes)
       
   277 
       
   278         if not dir and subdirnodes:
       
   279             for f in sorted(storefiles):
       
   280                 self.warn(_("warning: orphan revlog '%s'") % f)
   267 
   281 
   268         return filenodes
   282         return filenodes
   269 
   283 
   270     def _crosscheckfiles(self, filelinkrevs, filenodes):
   284     def _crosscheckfiles(self, filelinkrevs, filenodes):
   271         repo = self.repo
   285         repo = self.repo
   400                 for lr, node in sorted(fns):
   414                 for lr, node in sorted(fns):
   401                     self.err(lr, _("manifest refers to unknown revision %s") %
   415                     self.err(lr, _("manifest refers to unknown revision %s") %
   402                              short(node), f)
   416                              short(node), f)
   403         ui.progress(_('checking'), None)
   417         ui.progress(_('checking'), None)
   404 
   418 
   405         for f in storefiles:
   419         for f in sorted(storefiles):
   406             self.warn(_("warning: orphan revlog '%s'") % f)
   420             self.warn(_("warning: orphan revlog '%s'") % f)
   407 
   421 
   408         return len(files), revisions
   422         return len(files), revisions