changeset 22798:586d7058ea48

generatorset: get list-based fast iterations after the generator is consumed When all revisions are known, we shortcut most of the class logic to use list iteration instead. The cost of the sort is expected to be non-significant. The list creation and sorting could be done lazily in the future. We have to copy the list to not break existing iterator created before we finished consuming the generator.
author Pierre-Yves David <pierre-yves.david@fb.com>
date Fri, 03 Oct 2014 21:01:30 -0700
parents 61ecabeeadb3
children bafa371d7af3
files mercurial/revset.py
diffstat 1 files changed, 8 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/revset.py	Fri Oct 03 20:48:28 2014 -0700
+++ b/mercurial/revset.py	Fri Oct 03 21:01:30 2014 -0700
@@ -2621,6 +2621,7 @@
         gen: a generator producing the values for the generatorset.
         """
         self._gen = gen
+        self._asclist = None
         self._cache = {}
         self._genlist = []
         self._finished = False
@@ -2712,7 +2713,13 @@
             cache[item] = True
             genlist(item)
             yield item
-        self._finished = True
+        if not self._finished:
+            self._finished = True
+            asc = self._genlist[:]
+            asc.sort()
+            self._asclist = asc
+            self.fastasc = asc.__iter__
+            self.fastdesc = asc.__reversed__
 
     def set(self):
         return self