branchmap: updating triggers a write
Rather than separate updating and writing, create a subclass that doesn't write
on update. This minimises chances we forget to write out updates somewhere.
This also makes refactoring and improving the branchmap functionality easier.
Differential Revision: https://phab.mercurial-scm.org/D5636
--- a/mercurial/branchmap.py Mon Jan 21 16:04:48 2019 +0000
+++ b/mercurial/branchmap.py Mon Jan 21 16:37:23 2019 +0000
@@ -63,7 +63,6 @@
revs.extend(cl.revs(start=bcache.tiprev + 1))
if revs:
bcache.update(repo, revs)
- bcache.write(repo)
assert bcache.validfor(repo), filtername
repo._branchcaches[repo.filtername] = bcache
@@ -242,8 +241,9 @@
def copy(self):
"""return an deep copy of the branchcache object"""
- return branchcache(self, self.tipnode, self.tiprev, self.filteredhash,
- self._closednodes)
+ return type(self)(
+ self, self.tipnode, self.tiprev, self.filteredhash,
+ self._closednodes)
def write(self, repo):
try:
@@ -332,6 +332,15 @@
repo.ui.log('branchcache', 'updated %s branch cache in %.4f seconds\n',
repo.filtername, duration)
+ self.write(repo)
+
+
+class remotebranchcache(branchcache):
+ """Branchmap info for a remote connection, should not write locally"""
+ def write(self, repo):
+ pass
+
+
# Revision branch info cache
_rbcversion = '-v1'
--- a/mercurial/discovery.py Mon Jan 21 16:04:48 2019 +0000
+++ b/mercurial/discovery.py Mon Jan 21 16:37:23 2019 +0000
@@ -238,7 +238,7 @@
# D. Update newmap with outgoing changes.
# This will possibly add new heads and remove existing ones.
- newmap = branchmap.branchcache((branch, heads[1])
+ newmap = branchmap.remotebranchcache((branch, heads[1])
for branch, heads in headssum.iteritems()
if heads[0] is not None)
newmap.update(repo, (ctx.rev() for ctx in missingctx))