topicmap: ensure that 'served' view is updated with topicmap
There is multiple place that explicitly update the 'served' branchmap to ensure
it stay up to date. We ensure it use the proper topicmap in this case.
from mercurial import branchmap
def _filename(repo):
"""name of a branchcache file for a given repo or repoview"""
filename = "cache/topicmap"
if repo.filtername:
filename = '%s-%s' % (filename, repo.filtername)
return filename
oldbranchcache = branchmap.branchcache
class topiccache(oldbranchcache):
def __init__(self, *args, **kwargs):
otherbranchcache = branchmap.branchcache
try:
# super() call may fail otherwise
branchmap.branchcache = oldbranchcache
return super(topiccache, self).__init__(*args, **kwargs)
finally:
branchmap.branchcache = otherbranchcache
def branchtip(self, branch, topic=''):
'''Return the tipmost open head on branch head, otherwise return the
tipmost closed head on branch.
Raise KeyError for unknown branch.'''
if topic:
branch = '%s:%s' % (branch, topic)
return super(topiccache, self).branchtip(branch)
def branchheads(self, branch, closed=False, topic=''):
if topic:
branch = '%s:%s' % (branch, topic)
return super(topiccache, self).branchheads(branch, closed=closed)
def write(self, repo):
# The cache key needs to take phase root in account because change to
# what is public affect topics. We can't write on disk until we have this.
return
def update(self, repo, revgen):
"""Given a branchhead cache, self, that may have extra nodes or be
missing heads, and a generator of nodes that are strictly a superset of
heads missing, this function updates self to be correct.
"""
oldgetbranchinfo = repo.revbranchcache().branchinfo
try:
def branchinfo(r):
info = oldgetbranchinfo(r)
topic = ''
ctx = repo[r]
if ctx.mutable():
topic = ctx.topic()
branch = info[0]
if topic:
branch = '%s:%s' % (branch, topic)
return (branch, info[1])
repo.revbranchcache().branchinfo = branchinfo
return super(topiccache, self).update(repo, revgen)
finally:
repo.revbranchcache().branchinfo = oldgetbranchinfo