# HG changeset patch # User Pierre-Yves David # Date 2014-10-04 04:11:56 # Node ID 29a8c20e14a8078894bcaef98bf95d7c0bc61dc8 # Parent bafa371d7af31020d8081b218256bfb3df42d929 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. diff --git a/mercurial/revset.py b/mercurial/revset.py --- a/mercurial/revset.py +++ b/mercurial/revset.py @@ -2623,6 +2623,7 @@ class generatorset(abstractsmartset): 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 @@ class generatorset(abstractsmartset): 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 @@ class generatorset(abstractsmartset): 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