revbranchcache: move cache writing to the transaction finalizer
Instead of writing the revbranchcache during updatecache (which often happens
too early, before the cache is even populated), let's run it as part of the
transaction finalizer. It still won't be written for read-only operations, but
that's no worse than it is today.
A future commit will remove the actual write that happens in updatecache().
This is also good prep for when all caches get moved into the transaction.
--- a/mercurial/branchmap.py Tue Feb 10 20:04:47 2015 -0800
+++ b/mercurial/branchmap.py Tue Feb 10 20:06:12 2015 -0800
@@ -414,7 +414,11 @@
self._rbcrevs[rbcrevidx:rbcrevidx + _rbcrecsize] = rec
self._rbcrevslen = min(self._rbcrevslen, rev)
- def write(self):
+ tr = self._repo.currenttransaction()
+ if tr:
+ tr.addfinalize('write-revbranchcache', self.write)
+
+ def write(self, tr=None):
"""Save branch cache if it is dirty."""
repo = self._repo
if self._rbcnamescount < len(self._names):
--- a/mercurial/statichttprepo.py Tue Feb 10 20:04:47 2015 -0800
+++ b/mercurial/statichttprepo.py Tue Feb 10 20:06:12 2015 -0800
@@ -144,6 +144,7 @@
self._revbranchcache = None
self.encodepats = None
self.decodepats = None
+ self._transref = None
def _restrictcapabilities(self, caps):
caps = super(statichttprepository, self)._restrictcapabilities(caps)