generatorset: explicitly track iteration order
authorPierre-Yves David <pierre-yves.david@fb.com>
Fri, 03 Oct 2014 21:11:56 -0700
changeset 22800 29a8c20e14a8
parent 22799 bafa371d7af3
child 22801 6af9e9b6af39
generatorset: explicitly track iteration order The expected iteration order may be different than the fast iteration order (eg: ancestors(42) is expected to be iterated upward but is fast/lazy to compute downward. So we explicitly track the iteration order and enforce it if the manual iteration is requested. Default expected iteration order of a generator set is ascending because I'm not aware of any descending revset that need a generatorset. The first to find such descending revset will have the pleasure to make this configurable.
mercurial/revset.py
--- a/mercurial/revset.py	Fri Oct 03 20:23:02 2014 -0700
+++ b/mercurial/revset.py	Fri Oct 03 21:11:56 2014 -0700
@@ -2623,6 +2623,7 @@
         self._cache = {}
         self._genlist = []
         self._finished = False
+        self._ascending = True
         if iterasc is not None:
             if iterasc:
                 self.fastasc = self._iterator
@@ -2679,7 +2680,17 @@
         return False
 
     def __iter__(self):
-        return self._iterator()
+        if self._ascending:
+            it = self.fastasc
+        else:
+            it = self.fastdesc
+        if it is not None:
+            return it()
+        # we need to consume the iterator
+        for x in self._consumegen():
+            pass
+        # recall the same code
+        return iter(self)
 
     def _iterator(self):
         if self._finished:
@@ -2723,10 +2734,10 @@
         return self
 
     def sort(self, reverse=False):
-        if not self._finished:
-            for i in self:
-                continue
-        self._genlist.sort(reverse=reverse)
+        self._ascending = not reverse
+
+    def reverse(self):
+        self._ascending = not self._ascending
 
 def spanset(repo, start=None, end=None):
     """factory function to dispatch between fullreposet and actual spanset