comparison mercurial/revset.py @ 22862:9e5576f822cc

filteredset: drop explicit order management Now that all low-level smartset classes have proper ordering and fast iteration management, we can just rely on the subset in filteredset.
author Pierre-Yves David <pierre-yves.david@fb.com>
date Tue, 07 Oct 2014 01:33:05 -0700
parents 546fa6576815
children a1a02b516cca
comparison
equal deleted inserted replaced
22861:546fa6576815 22862:9e5576f822cc
2297 2297
2298 `condition` is a callable which takes a revision number and returns a 2298 `condition` is a callable which takes a revision number and returns a
2299 boolean. 2299 boolean.
2300 2300
2301 This is part of the mandatory API for smartset.""" 2301 This is part of the mandatory API for smartset."""
2302 kwargs = {} 2302 return filteredset(self, condition)
2303 if self.isascending():
2304 kwargs['ascending'] = True
2305 elif self.isdescending():
2306 kwargs['ascending'] = False
2307 return filteredset(self, condition, **kwargs)
2308 2303
2309 class baseset(abstractsmartset): 2304 class baseset(abstractsmartset):
2310 """Basic data structure that represents a revset and contains the basic 2305 """Basic data structure that represents a revset and contains the basic
2311 operation that it should be able to perform. 2306 operation that it should be able to perform.
2312 2307
2404 class filteredset(abstractsmartset): 2399 class filteredset(abstractsmartset):
2405 """Duck type for baseset class which iterates lazily over the revisions in 2400 """Duck type for baseset class which iterates lazily over the revisions in
2406 the subset and contains a function which tests for membership in the 2401 the subset and contains a function which tests for membership in the
2407 revset 2402 revset
2408 """ 2403 """
2409 def __init__(self, subset, condition=lambda x: True, ascending=None): 2404 def __init__(self, subset, condition=lambda x: True):
2410 """ 2405 """
2411 condition: a function that decide whether a revision in the subset 2406 condition: a function that decide whether a revision in the subset
2412 belongs to the revset or not. 2407 belongs to the revset or not.
2413 """ 2408 """
2414 self._subset = subset 2409 self._subset = subset
2415 self._condition = condition 2410 self._condition = condition
2416 self._cache = {} 2411 self._cache = {}
2417 if ascending is not None:
2418 ascending = bool(ascending)
2419 self._ascending = ascending
2420 2412
2421 def __contains__(self, x): 2413 def __contains__(self, x):
2422 c = self._cache 2414 c = self._cache
2423 if x not in c: 2415 if x not in c:
2424 v = c[x] = x in self._subset and self._condition(x) 2416 v = c[x] = x in self._subset and self._condition(x)
2462 # Basic implementation to be changed in future patches. 2454 # Basic implementation to be changed in future patches.
2463 l = baseset([r for r in self]) 2455 l = baseset([r for r in self])
2464 return l[x] 2456 return l[x]
2465 2457
2466 def sort(self, reverse=False): 2458 def sort(self, reverse=False):
2467 if self._ascending is None: 2459 self._subset.sort(reverse=reverse)
2468 if not util.safehasattr(self._subset, 'sort'):
2469 self._subset = baseset(self._subset)
2470 self._subset.sort(reverse=reverse)
2471 self._ascending = not reverse
2472 elif bool(reverse) == self._ascending:
2473 self.reverse()
2474 2460
2475 def reverse(self): 2461 def reverse(self):
2476 self._subset.reverse() 2462 self._subset.reverse()
2477 if self._ascending is not None:
2478 self._ascending = not self._ascending
2479 2463
2480 def set(self): 2464 def set(self):
2481 return set([r for r in self]) 2465 return set([r for r in self])
2482 2466
2483 def isascending(self): 2467 def isascending(self):
2484 return self._ascending is not None and self._ascending 2468 return self._subset.isascending()
2485 2469
2486 def isdescending(self): 2470 def isdescending(self):
2487 return self._ascending is not None and not self._ascending 2471 return self._subset.isdescending()
2488 2472
2489 def first(self): 2473 def first(self):
2490 for x in self: 2474 for x in self:
2491 return x 2475 return x
2492 return None 2476 return None
2493 2477
2494 def last(self): 2478 def last(self):
2495 it = None 2479 it = None
2496 if self._ascending is not None: 2480 if self._subset.isascending:
2497 if self._ascending: 2481 it = self.fastdesc
2498 it = self.fastdesc 2482 elif self._subset.isdescending:
2499 else: 2483 it = self.fastdesc
2500 it = self.fastasc
2501 if it is None: 2484 if it is None:
2502 # slowly consume everything. This needs improvement 2485 # slowly consume everything. This needs improvement
2503 it = lambda: reversed(list(self)) 2486 it = lambda: reversed(list(self))
2504 for x in it(): 2487 for x in it():
2505 return x 2488 return x