Mercurial > evolve
changeset 3238:88f11b9881b2
cache: introduce a changelogsourcebase class
This abstract class will help code that need a cache tracking the changelog
content (eg: the branchmap cache). The cache key used is the same as what the
branchmap uses.
This code was headed for core during the 4.3 cycle but never made it there. So
we starts with a copy in the evolve repository.
author | Pierre-Yves David <pierre-yves.david@octobus.net> |
---|---|
date | Wed, 22 Nov 2017 13:40:47 +0100 |
parents | 9a2cc4687cb9 |
children | 0c8c7b5274a5 |
files | hgext3rd/evolve/genericcaches.py |
diffstat | 1 files changed, 39 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/hgext3rd/evolve/genericcaches.py Wed Nov 22 13:40:05 2017 +0100 +++ b/hgext3rd/evolve/genericcaches.py Wed Nov 22 13:40:47 2017 +0100 @@ -10,6 +10,7 @@ import struct from mercurial import ( + node, util, ) @@ -125,3 +126,41 @@ def _deserializecachekey(self, data): """read the cachekey from bytes""" return self._cachekeystruct.unpack(data) + +class changelogsourcebase(incrementalcachebase): + """an abstract class for cache sourcing data from the changelog + + For this purpose it use a cache key covering changelog content. + The cache key parts are: (tiprev, tipnode) + """ + + __metaclass__ = abc.ABCMeta + + # default key used for an empty cache + emptykey = (0, node.nullid) + _cachekeyspec = 'i20s' + _cachename = None # used for debug message + + # Useful "public" function (no need to override them) + + def _fetchchangelogdata(self, cachekey, cl): + """use a cachekey to fetch incremental data + + Exists as its own method to help subclass to reuse it.""" + tiprev = len(cl) - 1 + tipnode = cl.node(tiprev) + newkey = (tiprev, tipnode) + tiprev = len(cl) - 1 + if newkey == cachekey: + return False, [], newkey + keyrev, keynode = cachekey + if tiprev < keyrev or cl.node(keyrev) != keynode: + revs = () + if len(cl): + revs = list(cl.revs(stop=tiprev)) + return True, revs, newkey + else: + return False, list(cl.revs(start=keyrev + 1, stop=tiprev)), newkey + + def _fetchupdatedata(self, repo): + return self._fetchchangelogdata(self._cachekey, repo.changelog)