mercurial/branchmap.py
changeset 40425 5e5c8f2a1eb5
parent 40375 76d4272bd57b
child 40710 50a64c321c1e
equal deleted inserted replaced
40424:7caf632e30c3 40425:5e5c8f2a1eb5
   279         cl = repo.changelog
   279         cl = repo.changelog
   280         # collect new branch entries
   280         # collect new branch entries
   281         newbranches = {}
   281         newbranches = {}
   282         getbranchinfo = repo.revbranchcache().branchinfo
   282         getbranchinfo = repo.revbranchcache().branchinfo
   283         for r in revgen:
   283         for r in revgen:
   284             branch, closesbranch = getbranchinfo(r, changelog=cl)
   284             branch, closesbranch = getbranchinfo(r)
   285             newbranches.setdefault(branch, []).append(r)
   285             newbranches.setdefault(branch, []).append(r)
   286             if closesbranch:
   286             if closesbranch:
   287                 self._closednodes.add(cl.node(r))
   287                 self._closednodes.add(cl.node(r))
   288 
   288 
   289         # fetch current topological heads to speed up filtering
   289         # fetch current topological heads to speed up filtering
   405         self._rbcnamescount = 0
   405         self._rbcnamescount = 0
   406         self._namesreverse.clear()
   406         self._namesreverse.clear()
   407         self._rbcrevslen = len(self._repo.changelog)
   407         self._rbcrevslen = len(self._repo.changelog)
   408         self._rbcrevs = bytearray(self._rbcrevslen * _rbcrecsize)
   408         self._rbcrevs = bytearray(self._rbcrevslen * _rbcrecsize)
   409 
   409 
   410     def branchinfo(self, rev, changelog=None):
   410     def branchinfo(self, rev):
   411         """Return branch name and close flag for rev, using and updating
   411         """Return branch name and close flag for rev, using and updating
   412         persistent cache."""
   412         persistent cache."""
   413         changelog = changelog or self._repo.changelog
   413         changelog = self._repo.changelog
   414         rbcrevidx = rev * _rbcrecsize
   414         rbcrevidx = rev * _rbcrecsize
   415 
   415 
   416         # avoid negative index, changelog.read(nullrev) is fast without cache
   416         # avoid negative index, changelog.read(nullrev) is fast without cache
   417         if rev == nullrev:
   417         if rev == nullrev:
   418             return changelog.branchinfo(rev)
   418             return changelog.branchinfo(rev)
   419 
   419 
   420         # if requested rev isn't allocated, grow and cache the rev info
   420         # if requested rev isn't allocated, grow and cache the rev info
   421         if len(self._rbcrevs) < rbcrevidx + _rbcrecsize:
   421         if len(self._rbcrevs) < rbcrevidx + _rbcrecsize:
   422             return self._branchinfo(rev, changelog=changelog)
   422             return self._branchinfo(rev)
   423 
   423 
   424         # fast path: extract data from cache, use it if node is matching
   424         # fast path: extract data from cache, use it if node is matching
   425         reponode = changelog.node(rev)[:_rbcnodelen]
   425         reponode = changelog.node(rev)[:_rbcnodelen]
   426         cachenode, branchidx = unpack_from(
   426         cachenode, branchidx = unpack_from(
   427             _rbcrecfmt, util.buffer(self._rbcrevs), rbcrevidx)
   427             _rbcrecfmt, util.buffer(self._rbcrevs), rbcrevidx)
   445             truncate = rbcrevidx + _rbcrecsize
   445             truncate = rbcrevidx + _rbcrecsize
   446             del self._rbcrevs[truncate:]
   446             del self._rbcrevs[truncate:]
   447             self._rbcrevslen = min(self._rbcrevslen, truncate)
   447             self._rbcrevslen = min(self._rbcrevslen, truncate)
   448 
   448 
   449         # fall back to slow path and make sure it will be written to disk
   449         # fall back to slow path and make sure it will be written to disk
   450         return self._branchinfo(rev, changelog=changelog)
   450         return self._branchinfo(rev)
   451 
   451 
   452     def _branchinfo(self, rev, changelog=None):
   452     def _branchinfo(self, rev):
   453         """Retrieve branch info from changelog and update _rbcrevs"""
   453         """Retrieve branch info from changelog and update _rbcrevs"""
   454         changelog = changelog or self._repo.changelog
   454         changelog = self._repo.changelog
   455         b, close = changelog.branchinfo(rev)
   455         b, close = changelog.branchinfo(rev)
   456         if b in self._namesreverse:
   456         if b in self._namesreverse:
   457             branchidx = self._namesreverse[b]
   457             branchidx = self._namesreverse[b]
   458         else:
   458         else:
   459             branchidx = len(self._names)
   459             branchidx = len(self._names)
   460             self._names.append(b)
   460             self._names.append(b)
   461             self._namesreverse[b] = branchidx
   461             self._namesreverse[b] = branchidx
   462         reponode = changelog.node(rev)
   462         reponode = changelog.node(rev)
   463         if close:
   463         if close:
   464             branchidx |= _rbccloseflag
   464             branchidx |= _rbccloseflag
   465         self._setcachedata(rev, reponode, branchidx, changelog)
   465         self._setcachedata(rev, reponode, branchidx)
   466         return b, close
   466         return b, close
   467 
   467 
   468     def setdata(self, branch, rev, node, close):
   468     def setdata(self, branch, rev, node, close):
   469         """add new data information to the cache"""
   469         """add new data information to the cache"""
   470         if branch in self._namesreverse:
   470         if branch in self._namesreverse:
   483         #
   483         #
   484         # Since we now have data in the cache, we need to drop this bypassing.
   484         # Since we now have data in the cache, we need to drop this bypassing.
   485         if r'branchinfo' in vars(self):
   485         if r'branchinfo' in vars(self):
   486             del self.branchinfo
   486             del self.branchinfo
   487 
   487 
   488     def _setcachedata(self, rev, node, branchidx, changelog=None):
   488     def _setcachedata(self, rev, node, branchidx):
   489         """Writes the node's branch data to the in-memory cache data."""
   489         """Writes the node's branch data to the in-memory cache data."""
   490         if rev == nullrev:
   490         if rev == nullrev:
   491             return
   491             return
   492 
       
   493         changelog = changelog or self._repo.changelog
       
   494         rbcrevidx = rev * _rbcrecsize
   492         rbcrevidx = rev * _rbcrecsize
   495         if len(self._rbcrevs) < rbcrevidx + _rbcrecsize:
   493         if len(self._rbcrevs) < rbcrevidx + _rbcrecsize:
   496             self._rbcrevs.extend('\0' *
   494             self._rbcrevs.extend('\0' *
   497                                  (len(changelog) * _rbcrecsize -
   495                                  (len(self._repo.changelog) * _rbcrecsize -
   498                                   len(self._rbcrevs)))
   496                                   len(self._rbcrevs)))
   499         pack_into(_rbcrecfmt, self._rbcrevs, rbcrevidx, node, branchidx)
   497         pack_into(_rbcrecfmt, self._rbcrevs, rbcrevidx, node, branchidx)
   500         self._rbcrevslen = min(self._rbcrevslen, rev)
   498         self._rbcrevslen = min(self._rbcrevslen, rev)
   501 
   499 
   502         tr = self._repo.currenttransaction()
   500         tr = self._repo.currenttransaction()