mercurial/verify.py
changeset 27695 fb0cc863d172
parent 27648 e72e669dd51f
child 27849 900d36a3e4dd
equal deleted inserted replaced
27694:2dc363274702 27695:fb0cc863d172
   132         seen[node] = i
   132         seen[node] = i
   133         return lr
   133         return lr
   134 
   134 
   135     def verify(self):
   135     def verify(self):
   136         repo = self.repo
   136         repo = self.repo
   137         mflinkrevs = {}
       
   138         filelinkrevs = {}
       
   139         filenodes = {}
       
   140 
   137 
   141         ui = repo.ui
   138         ui = repo.ui
   142 
   139 
   143         if not repo.url().startswith('file:'):
   140         if not repo.url().startswith('file:'):
   144             raise error.Abort(_("cannot verify bundle or remote repos"))
   141             raise error.Abort(_("cannot verify bundle or remote repos"))
   148 
   145 
   149         if ui.verbose or not self.revlogv1:
   146         if ui.verbose or not self.revlogv1:
   150             ui.status(_("repository uses revlog format %d\n") %
   147             ui.status(_("repository uses revlog format %d\n") %
   151                            (self.revlogv1 and 1 or 0))
   148                            (self.revlogv1 and 1 or 0))
   152 
   149 
   153         self._verifychangelog(mflinkrevs, filelinkrevs)
   150         mflinkrevs, filelinkrevs = self._verifychangelog()
   154 
   151 
   155         self._verifymanifest(mflinkrevs, filenodes)
   152         filenodes = self._verifymanifest(mflinkrevs)
   156 
   153 
   157         self._crosscheckfiles(mflinkrevs, filelinkrevs, filenodes)
   154         self._crosscheckfiles(mflinkrevs, filelinkrevs, filenodes)
   158 
   155 
   159         totalfiles, filerevisions = self._verifyfiles(filenodes, filelinkrevs)
   156         totalfiles, filerevisions = self._verifyfiles(filenodes, filelinkrevs)
   160 
   157 
   170             if self.badrevs:
   167             if self.badrevs:
   171                 ui.warn(_("(first damaged changeset appears to be %d)\n")
   168                 ui.warn(_("(first damaged changeset appears to be %d)\n")
   172                         % min(self.badrevs))
   169                         % min(self.badrevs))
   173             return 1
   170             return 1
   174 
   171 
   175     def _verifychangelog(self, mflinkrevs, filelinkrevs):
   172     def _verifychangelog(self):
   176         ui = self.ui
   173         ui = self.ui
   177         repo = self.repo
   174         repo = self.repo
   178         cl = repo.changelog
   175         cl = repo.changelog
   179 
   176 
   180         ui.status(_("checking changesets\n"))
   177         ui.status(_("checking changesets\n"))
       
   178         mflinkrevs = {}
       
   179         filelinkrevs = {}
   181         seen = {}
   180         seen = {}
   182         self.checklog(cl, "changelog", 0)
   181         self.checklog(cl, "changelog", 0)
   183         total = len(repo)
   182         total = len(repo)
   184         for i in repo:
   183         for i in repo:
   185             ui.progress(_('checking'), i, total=total, unit=_('changesets'))
   184             ui.progress(_('checking'), i, total=total, unit=_('changesets'))
   196                         filelinkrevs.setdefault(_normpath(f), []).append(i)
   195                         filelinkrevs.setdefault(_normpath(f), []).append(i)
   197             except Exception as inst:
   196             except Exception as inst:
   198                 self.refersmf = True
   197                 self.refersmf = True
   199                 self.exc(i, _("unpacking changeset %s") % short(n), inst)
   198                 self.exc(i, _("unpacking changeset %s") % short(n), inst)
   200         ui.progress(_('checking'), None)
   199         ui.progress(_('checking'), None)
   201 
   200         return mflinkrevs, filelinkrevs
   202     def _verifymanifest(self, mflinkrevs, filenodes):
   201 
       
   202     def _verifymanifest(self, mflinkrevs):
   203         repo = self.repo
   203         repo = self.repo
   204         ui = self.ui
   204         ui = self.ui
   205         mf = self.repo.manifest
   205         mf = self.repo.manifest
   206 
   206 
   207         ui.status(_("checking manifests\n"))
   207         ui.status(_("checking manifests\n"))
       
   208         filenodes = {}
   208         seen = {}
   209         seen = {}
   209         if self.refersmf:
   210         if self.refersmf:
   210             # Do not check manifest if there are only changelog entries with
   211             # Do not check manifest if there are only changelog entries with
   211             # null manifests.
   212             # null manifests.
   212             self.checklog(mf, "manifest", 0)
   213             self.checklog(mf, "manifest", 0)
   231                                 _normpath(f), {}).setdefault(fn, lr)
   232                                 _normpath(f), {}).setdefault(fn, lr)
   232             except Exception as inst:
   233             except Exception as inst:
   233                 self.exc(lr, _("reading manifest delta %s") % short(n), inst)
   234                 self.exc(lr, _("reading manifest delta %s") % short(n), inst)
   234         ui.progress(_('checking'), None)
   235         ui.progress(_('checking'), None)
   235 
   236 
   236         return mflinkrevs
   237         return filenodes
   237 
   238 
   238     def _crosscheckfiles(self, mflinkrevs, filelinkrevs, filenodes):
   239     def _crosscheckfiles(self, mflinkrevs, filelinkrevs, filenodes):
   239         repo = self.repo
   240         repo = self.repo
   240         ui = self.ui
   241         ui = self.ui
   241         ui.status(_("crosschecking files in changesets and manifests\n"))
   242         ui.status(_("crosschecking files in changesets and manifests\n"))