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.
--- 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