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