mercurial/verify.py
changeset 27444 6647401858ab
parent 27443 937e73a6e4ff
child 27445 cc178057ab49
equal deleted inserted replaced
27443:937e73a6e4ff 27444:6647401858ab
    22 )
    22 )
    23 
    23 
    24 def verify(repo):
    24 def verify(repo):
    25     lock = repo.lock()
    25     lock = repo.lock()
    26     try:
    26     try:
    27         return verifier().verify(repo)
    27         return verifier(repo).verify()
    28     finally:
    28     finally:
    29         lock.release()
    29         lock.release()
    30 
    30 
    31 def _normpath(f):
    31 def _normpath(f):
    32     # under hg < 2.4, convert didn't sanitize paths properly, so a
    32     # under hg < 2.4, convert didn't sanitize paths properly, so a
    45     modified files that are outside the narrow scope.
    45     modified files that are outside the narrow scope.
    46     """
    46     """
    47     return True
    47     return True
    48 
    48 
    49 class verifier(object):
    49 class verifier(object):
    50     def verify(self, repo):
    50     def __init__(self, repo):
    51         repo = repo.unfiltered()
    51         self.repo = repo.unfiltered()
       
    52         self.ui = repo.ui
       
    53         self.badrevs = set()
       
    54         self.errors = [0]
       
    55         self.warnings = [0]
       
    56         self.havecl = len(repo.changelog) > 0
       
    57         self.havemf = len(repo.manifest) > 0
       
    58         self.revlogv1 = repo.changelog.version != revlog.REVLOGV0
       
    59         self.lrugetctx = util.lrucachefunc(repo.changectx)
       
    60         self.refersmf = False
       
    61 
       
    62     def verify(self):
       
    63         repo = self.repo
    52         mflinkrevs = {}
    64         mflinkrevs = {}
    53         filelinkrevs = {}
    65         filelinkrevs = {}
    54         filenodes = {}
    66         filenodes = {}
    55         revisions = 0
    67         revisions = 0
    56         badrevs = set()
    68         badrevs = self.badrevs
    57         errors = [0]
    69         errors = self.errors
    58         warnings = [0]
    70         warnings = self.warnings
    59         ui = repo.ui
    71         ui = repo.ui
    60         cl = repo.changelog
    72         cl = repo.changelog
    61         mf = repo.manifest
    73         mf = repo.manifest
    62         lrugetctx = util.lrucachefunc(repo.changectx)
    74         lrugetctx = self.lrugetctx
    63 
    75 
    64         if not repo.url().startswith('file:'):
    76         if not repo.url().startswith('file:'):
    65             raise error.Abort(_("cannot verify bundle or remote repos"))
    77             raise error.Abort(_("cannot verify bundle or remote repos"))
    66 
    78 
    67         def err(linkrev, msg, filename=None):
    79         def err(linkrev, msg, filename=None):
   140             return lr
   152             return lr
   141 
   153 
   142         if os.path.exists(repo.sjoin("journal")):
   154         if os.path.exists(repo.sjoin("journal")):
   143             ui.warn(_("abandoned transaction found - run hg recover\n"))
   155             ui.warn(_("abandoned transaction found - run hg recover\n"))
   144 
   156 
   145         revlogv1 = cl.version != revlog.REVLOGV0
   157         revlogv1 = self.revlogv1
   146         if ui.verbose or not revlogv1:
   158         if ui.verbose or not revlogv1:
   147             ui.status(_("repository uses revlog format %d\n") %
   159             ui.status(_("repository uses revlog format %d\n") %
   148                            (revlogv1 and 1 or 0))
   160                            (revlogv1 and 1 or 0))
   149 
   161 
   150         havecl = len(cl) > 0
   162         havecl = self.havecl
   151         havemf = len(mf) > 0
   163         havemf = self.havemf
   152 
   164 
   153         ui.status(_("checking changesets\n"))
   165         ui.status(_("checking changesets\n"))
   154         refersmf = False
       
   155         seen = {}
   166         seen = {}
   156         checklog(cl, "changelog", 0)
   167         checklog(cl, "changelog", 0)
   157         total = len(repo)
   168         total = len(repo)
   158         for i in repo:
   169         for i in repo:
   159             ui.progress(_('checking'), i, total=total, unit=_('changesets'))
   170             ui.progress(_('checking'), i, total=total, unit=_('changesets'))
   162 
   173 
   163             try:
   174             try:
   164                 changes = cl.read(n)
   175                 changes = cl.read(n)
   165                 if changes[0] != nullid:
   176                 if changes[0] != nullid:
   166                     mflinkrevs.setdefault(changes[0], []).append(i)
   177                     mflinkrevs.setdefault(changes[0], []).append(i)
   167                     refersmf = True
   178                     self.refersmf = True
   168                 for f in changes[3]:
   179                 for f in changes[3]:
   169                     if _validpath(repo, f):
   180                     if _validpath(repo, f):
   170                         filelinkrevs.setdefault(_normpath(f), []).append(i)
   181                         filelinkrevs.setdefault(_normpath(f), []).append(i)
   171             except Exception as inst:
   182             except Exception as inst:
   172                 refersmf = True
   183                 self.refersmf = True
   173                 exc(i, _("unpacking changeset %s") % short(n), inst)
   184                 exc(i, _("unpacking changeset %s") % short(n), inst)
   174         ui.progress(_('checking'), None)
   185         ui.progress(_('checking'), None)
   175 
   186 
   176         ui.status(_("checking manifests\n"))
   187         ui.status(_("checking manifests\n"))
   177         seen = {}
   188         seen = {}
   178         if refersmf:
   189         if self.refersmf:
   179             # Do not check manifest if there are only changelog entries with
   190             # Do not check manifest if there are only changelog entries with
   180             # null manifests.
   191             # null manifests.
   181             checklog(mf, "manifest", 0)
   192             checklog(mf, "manifest", 0)
   182         total = len(mf)
   193         total = len(mf)
   183         for i in mf:
   194         for i in mf: