mercurial/revset.py
changeset 20727 1e59f760d850
parent 20726 6eb9c4a9a12b
child 20728 1c8b62c0a47e
equal deleted inserted replaced
20726:6eb9c4a9a12b 20727:1e59f760d850
  2169         return funcs
  2169         return funcs
  2170 
  2170 
  2171 class baseset(list):
  2171 class baseset(list):
  2172     """Basic data structure that represents a revset and contains the basic
  2172     """Basic data structure that represents a revset and contains the basic
  2173     operation that it should be able to perform.
  2173     operation that it should be able to perform.
       
  2174 
       
  2175     Every method in this class should be implemented by any smartset class.
  2174     """
  2176     """
  2175     def __init__(self, data):
  2177     def __init__(self, data):
  2176         super(baseset, self).__init__(data)
  2178         super(baseset, self).__init__(data)
  2177         self._set = None
  2179         self._set = None
  2178 
  2180 
  2179     def ascending(self):
  2181     def ascending(self):
       
  2182         """Sorts the set in ascending order (in place).
       
  2183 
       
  2184         This is part of the mandatory API for smartset."""
  2180         self.sort()
  2185         self.sort()
  2181 
  2186 
  2182     def descending(self):
  2187     def descending(self):
       
  2188         """Sorts the set in descending order (in place).
       
  2189 
       
  2190         This is part of the mandatory API for smartset."""
  2183         self.sort(reverse=True)
  2191         self.sort(reverse=True)
  2184 
  2192 
  2185     def set(self):
  2193     def set(self):
       
  2194         """Returns a set or a smartset containing all the elements.
       
  2195 
       
  2196         The returned structure should be the fastest option for membership
       
  2197         testing.
       
  2198 
       
  2199         This is part of the mandatory API for smartset."""
  2186         if not self._set:
  2200         if not self._set:
  2187             self._set = set(self)
  2201             self._set = set(self)
  2188         return self._set
  2202         return self._set
  2189 
  2203 
  2190     def __sub__(self, other):
  2204     def __sub__(self, other):
       
  2205         """Returns a new object with the substraction of the two collections.
       
  2206 
       
  2207         This is part of the mandatory API for smartset."""
  2191         if isinstance(other, baseset):
  2208         if isinstance(other, baseset):
  2192             s = other.set()
  2209             s = other.set()
  2193         else:
  2210         else:
  2194             s = set(other)
  2211             s = set(other)
  2195         return baseset(self.set() - s)
  2212         return baseset(self.set() - s)
  2196 
  2213 
  2197     def __and__(self, other):
  2214     def __and__(self, other):
  2198 
  2215         """Returns a new object with the intersection of the two collections.
       
  2216 
       
  2217         This is part of the mandatory API for smartset."""
  2199         if isinstance(other, baseset):
  2218         if isinstance(other, baseset):
  2200             other = other.set()
  2219             other = other.set()
  2201         return baseset([y for y in self if y in other])
  2220         return baseset([y for y in self if y in other])
       
  2221 
  2202     def __add__(self, other):
  2222     def __add__(self, other):
       
  2223         """Returns a new object with the union of the two collections.
       
  2224 
       
  2225         This is part of the mandatory API for smartset."""
  2203         s = self.set()
  2226         s = self.set()
  2204         l = [r for r in other if r not in s]
  2227         l = [r for r in other if r not in s]
  2205         return baseset(list(self) + l)
  2228         return baseset(list(self) + l)
  2206 
  2229 
  2207     def isascending(self):
  2230     def isascending(self):
       
  2231         """Returns True if the collection is ascending order, False if not.
       
  2232 
       
  2233         This is part of the mandatory API for smartset."""
  2208         return False
  2234         return False
  2209 
  2235 
  2210     def isdescending(self):
  2236     def isdescending(self):
       
  2237         """Returns True if the collection is descending order, False if not.
       
  2238 
       
  2239         This is part of the mandatory API for smartset."""
  2211         return False
  2240         return False
  2212 
  2241 
  2213     def filter(self, condition):
  2242     def filter(self, condition):
       
  2243         """Returns this smartset filtered by condition as a new smartset.
       
  2244 
       
  2245         `condition` is a callable which takes a revision number and returns a
       
  2246         boolean.
       
  2247 
       
  2248         This is part of the mandatory API for smartset."""
  2214         return lazyset(self, condition)
  2249         return lazyset(self, condition)
  2215 
  2250 
  2216 class lazyset(object):
  2251 class lazyset(object):
  2217     """Duck type for baseset class which iterates lazily over the revisions in
  2252     """Duck type for baseset class which iterates lazily over the revisions in
  2218     the subset and contains a function which tests for membership in the
  2253     the subset and contains a function which tests for membership in the