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

2017-07-14 Thread Augie Fackler
On Sun, Jul 09, 2017 at 07:55:14PM +0200, Boris Feld wrote:
> # HG changeset patch
> # User Boris Feld 
> # 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@mercurial-scm.org
> https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel
___
Mercurial-devel mailing list
Mercurial-devel@mercurial-scm.org
https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel


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

2017-07-09 Thread Boris Feld
On Sun, 2017-07-09 at 19:52 +0200, Boris Feld wrote:
> # HG changeset patch
> # User Boris Feld 
> # 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
> 
Sorry, my battery has discharged while sending the series.
___
Mercurial-devel mailing list
Mercurial-devel@mercurial-scm.org
https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel


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

2017-07-09 Thread Boris Feld
# HG changeset patch
# User Boris Feld 
# 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

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.

diff -r 6edb62505c69 -r 8b71290526dd mercurial/cache.py
--- a/mercurial/cache.pyFri Jul 07 22:14:01 2017 +0200
+++ b/mercurial/cache.pyFri 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@mercurial-scm.org
https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel


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

2017-07-09 Thread Boris Feld
# HG changeset patch
# User Boris Feld 
# 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

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.

diff -r 6edb62505c69 -r 8b71290526dd mercurial/cache.py
--- a/mercurial/cache.pyFri Jul 07 22:14:01 2017 +0200
+++ b/mercurial/cache.pyFri 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@mercurial-scm.org
https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel