[PATCH 02 of 14] cache: introduce a changelogsourcebase class

Augie Fackler raf at durin42.com
Fri Jul 14 14:04:27 EDT 2017


On Sun, Jul 09, 2017 at 07:55:14PM +0200, Boris Feld wrote:
> # HG changeset patch
> # User Boris Feld <boris.feld at octobus.net>
> # Date 1499458552 -7200
> #      Fri Jul 07 22:15:52 2017 +0200
> # Node ID 8b71290526ddb77f157e075191dd748793d85601
> # Parent  6edb62505c697329de034c2fdc47befd5896f31f
> # EXP-Topic obs-cache
> cache: introduce a changelogsourcebase class

These two are interesting on their own, assuming we've got existing
caches that could be refactored.

>
> 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 sounds like we could get these two in by migrating the branchmap
cache to use them?

>
> diff -r 6edb62505c69 -r 8b71290526dd mercurial/cache.py
> --- a/mercurial/cache.py	Fri Jul 07 22:14:01 2017 +0200
> +++ b/mercurial/cache.py	Fri Jul 07 22:15:52 2017 +0200
> @@ -10,6 +10,7 @@
>  import struct
>
>  from . 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)
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel at mercurial-scm.org
> https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel


More information about the Mercurial-devel mailing list