diff -r 8a53f99d9061 -r d49f75eab6a3 src/topic/topicmap.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/topic/topicmap.py Sat Mar 12 15:36:17 2016 +0000 @@ -0,0 +1,61 @@ +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