changeset 2185:6b98ceed0626

stablerange: introduce caching for the full revision in a set Such cache proved handy in the "per-range" class so we carry it along to the unified class. cf documentation for details.
author Pierre-Yves David <pierre-yves.david@ens-lyon.org>
date Wed, 22 Mar 2017 20:18:01 +0100
parents 3ec0be20e365
children 57d58f27ffae
files hgext3rd/evolve/stablerange.py
diffstat 1 files changed, 22 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/hgext3rd/evolve/stablerange.py	Wed Mar 22 20:11:19 2017 +0100
+++ b/hgext3rd/evolve/stablerange.py	Wed Mar 22 20:18:01 2017 +0100
@@ -162,6 +162,15 @@
         # the same for all ranges headed at the same merge. So we cache these
         # value to reuse them accross the same invocation.
         self._stablesortcache = {}
+        # if we already know all the revision that belong to a range, it is
+        # quite trivial to have the subrange "inherit" that knowledge. This
+        # cache is dedicated to hold the full list of revs inside a subrange
+        # when we happens to know it.
+        #
+        # For example. if we are slicing a range headed by a merge so will have
+        # the revision computed anyway, and passing that knowledge around might
+        # help to slice one of its subranges also containings a merge.
+        self._revsinrangecache = {}
 
     def warmup(self, repo, heads):
         """warm the cache up to 'heads'"""
@@ -219,13 +228,16 @@
         return value
 
     def revsfromrange(self, repo, rangeid):
-        # get all revs under heads in stable order
-        allrevs = self._stablesortcache.get(rangeid[0])
-        if allrevs is None:
-            allrevs = stablesort(repo, [rangeid[0]])
-            self._stablesortcache[rangeid[0]] = allrevs
-        # takes from index
-        revs = allrevs[rangeid[1]:]
+        revs = self._revsinrangecache.get(rangeid)
+        if revs is None:
+            # get all revs under heads in stable order
+            allrevs = self._stablesortcache.get(rangeid[0])
+            if allrevs is None:
+                allrevs = stablesort(repo, [rangeid[0]])
+                self._stablesortcache[rangeid[0]] = allrevs
+            # takes from index
+            revs = allrevs[rangeid[1]:]
+            self._revsinrangecache[rangeid] = revs
         # sanity checks
         assert len(revs) == self.rangelength(repo, rangeid)
         return revs
@@ -364,9 +376,11 @@
         self._head = head
         self._index = index
         if revs is not None:
+            self._repo.stablerange._revsinrangecache[self] = revs
+        # sanity checking
+        if revs is not None:
             length = self._repo.stablerange.rangelength(self._repo, self)
             assert len(revs) == length
-            self._revs = revs
         depth = self._repo.stablerange.depthrev(self._repo, self[0])
         assert index < depth, (head, index, depth, revs)