Mercurial > public > mercurial-scm > hg
comparison mercurial/revset.py @ 22800:29a8c20e14a8
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.
author | Pierre-Yves David <pierre-yves.david@fb.com> |
---|---|
date | Fri, 03 Oct 2014 21:11:56 -0700 |
parents | bafa371d7af3 |
children | 6af9e9b6af39 |
comparison
equal
deleted
inserted
replaced
22799:bafa371d7af3 | 22800:29a8c20e14a8 |
---|---|
2621 self._gen = gen | 2621 self._gen = gen |
2622 self._asclist = None | 2622 self._asclist = None |
2623 self._cache = {} | 2623 self._cache = {} |
2624 self._genlist = [] | 2624 self._genlist = [] |
2625 self._finished = False | 2625 self._finished = False |
2626 self._ascending = True | |
2626 if iterasc is not None: | 2627 if iterasc is not None: |
2627 if iterasc: | 2628 if iterasc: |
2628 self.fastasc = self._iterator | 2629 self.fastasc = self._iterator |
2629 self.__contains__ = self._asccontains | 2630 self.__contains__ = self._asccontains |
2630 else: | 2631 else: |
2677 | 2678 |
2678 self._cache[x] = False | 2679 self._cache[x] = False |
2679 return False | 2680 return False |
2680 | 2681 |
2681 def __iter__(self): | 2682 def __iter__(self): |
2682 return self._iterator() | 2683 if self._ascending: |
2684 it = self.fastasc | |
2685 else: | |
2686 it = self.fastdesc | |
2687 if it is not None: | |
2688 return it() | |
2689 # we need to consume the iterator | |
2690 for x in self._consumegen(): | |
2691 pass | |
2692 # recall the same code | |
2693 return iter(self) | |
2683 | 2694 |
2684 def _iterator(self): | 2695 def _iterator(self): |
2685 if self._finished: | 2696 if self._finished: |
2686 return iter(self._genlist) | 2697 return iter(self._genlist) |
2687 | 2698 |
2721 | 2732 |
2722 def set(self): | 2733 def set(self): |
2723 return self | 2734 return self |
2724 | 2735 |
2725 def sort(self, reverse=False): | 2736 def sort(self, reverse=False): |
2726 if not self._finished: | 2737 self._ascending = not reverse |
2727 for i in self: | 2738 |
2728 continue | 2739 def reverse(self): |
2729 self._genlist.sort(reverse=reverse) | 2740 self._ascending = not self._ascending |
2730 | 2741 |
2731 def spanset(repo, start=None, end=None): | 2742 def spanset(repo, start=None, end=None): |
2732 """factory function to dispatch between fullreposet and actual spanset | 2743 """factory function to dispatch between fullreposet and actual spanset |
2733 | 2744 |
2734 Feel free to update all spanset call sites and kill this function at some | 2745 Feel free to update all spanset call sites and kill this function at some |