mercurial/branchmap.py
changeset 24376 203a078da052
parent 24375 fe255b2525d5
child 24377 656f93ce66d5
--- a/mercurial/branchmap.py	Tue Feb 10 20:01:08 2015 -0800
+++ b/mercurial/branchmap.py	Tue Feb 10 20:04:47 2015 -0800
@@ -367,11 +367,8 @@
 
         # if requested rev is missing, add and populate all missing revs
         if len(self._rbcrevs) < rbcrevidx + _rbcrecsize:
-            first = len(self._rbcrevs) // _rbcrecsize
             self._rbcrevs.extend('\0' * (len(changelog) * _rbcrecsize -
                                          len(self._rbcrevs)))
-            for r in xrange(first, len(changelog)):
-                self._branchinfo(r)
 
         # fast path: extract data from cache, use it if node is matching
         reponode = changelog.node(rev)[:_rbcnodelen]
@@ -380,10 +377,17 @@
         close = bool(branchidx & _rbccloseflag)
         if close:
             branchidx &= _rbcbranchidxmask
-        if cachenode == reponode:
+        if cachenode == '\0\0\0\0':
+            pass
+        elif cachenode == reponode:
             return self._names[branchidx], close
+        else:
+            # rev/node map has changed, invalidate the cache from here up
+            truncate = rbcrevidx + _rbcrecsize
+            del self._rbcrevs[truncate:]
+            self._rbcrevslen = min(self._rbcrevslen, truncate)
+
         # fall back to slow path and make sure it will be written to disk
-        self._rbcrevslen = min(self._rbcrevslen, rev)
         return self._branchinfo(rev)
 
     def _branchinfo(self, rev):
@@ -408,6 +412,7 @@
         rec = array('c')
         rec.fromstring(pack(_rbcrecfmt, node, branchidx))
         self._rbcrevs[rbcrevidx:rbcrevidx + _rbcrecsize] = rec
+        self._rbcrevslen = min(self._rbcrevslen, rev)
 
     def write(self):
         """Save branch cache if it is dirty."""