Show More
@@ -5,7 +5,7 b'' | |||
|
5 | 5 | # This software may be used and distributed according to the terms of the |
|
6 | 6 | # GNU General Public License version 2 or any later version. |
|
7 | 7 | |
|
8 | import heapq | |
|
8 | import heapq, util | |
|
9 | 9 | from node import nullrev |
|
10 | 10 | |
|
11 | 11 | def ancestor(a, b, pfunc): |
@@ -171,3 +171,51 b' def missingancestors(revs, bases, pfunc)' | |||
|
171 | 171 | |
|
172 | 172 | missing.reverse() |
|
173 | 173 | return missing |
|
174 | ||
|
175 | class lazyancestors(object): | |
|
176 | def __init__(self, cl, revs, stoprev=0, inclusive=False): | |
|
177 | """Create a new object generating ancestors for the given revs. Does | |
|
178 | not generate revs lower than stoprev. | |
|
179 | ||
|
180 | This is computed lazily starting from revs. The object only supports | |
|
181 | iteration. | |
|
182 | ||
|
183 | cl should be a changelog and revs should be an iterable. inclusive is | |
|
184 | a boolean that indicates whether revs should be included. Revs lower | |
|
185 | than stoprev will not be generated. | |
|
186 | ||
|
187 | Result does not include the null revision.""" | |
|
188 | self._parentrevs = cl.parentrevs | |
|
189 | self._initrevs = revs | |
|
190 | self._stoprev = stoprev | |
|
191 | self._inclusive = inclusive | |
|
192 | ||
|
193 | def __iter__(self): | |
|
194 | """Generate the ancestors of _initrevs in reverse topological order. | |
|
195 | ||
|
196 | If inclusive is False, yield a sequence of revision numbers starting | |
|
197 | with the parents of each revision in revs, i.e., each revision is *not* | |
|
198 | considered an ancestor of itself. Results are in breadth-first order: | |
|
199 | parents of each rev in revs, then parents of those, etc. | |
|
200 | ||
|
201 | If inclusive is True, yield all the revs first (ignoring stoprev), | |
|
202 | then yield all the ancestors of revs as when inclusive is False. | |
|
203 | If an element in revs is an ancestor of a different rev it is not | |
|
204 | yielded again.""" | |
|
205 | seen = set() | |
|
206 | revs = self._initrevs | |
|
207 | if self._inclusive: | |
|
208 | for rev in revs: | |
|
209 | yield rev | |
|
210 | seen.update(revs) | |
|
211 | ||
|
212 | parentrevs = self._parentrevs | |
|
213 | stoprev = self._stoprev | |
|
214 | visit = util.deque(revs) | |
|
215 | ||
|
216 | while visit: | |
|
217 | for parent in parentrevs(visit.popleft()): | |
|
218 | if parent >= stoprev and parent not in seen: | |
|
219 | visit.append(parent) | |
|
220 | seen.add(parent) | |
|
221 | yield parent |
@@ -345,31 +345,10 b' class revlog(object):' | |||
|
345 | 345 | """Generate the ancestors of 'revs' in reverse topological order. |
|
346 | 346 | Does not generate revs lower than stoprev. |
|
347 | 347 | |
|
348 | If inclusive is False, yield a sequence of revision numbers starting | |
|
349 | with the parents of each revision in revs, i.e., each revision is *not* | |
|
350 | considered an ancestor of itself. Results are in breadth-first order: | |
|
351 | parents of each rev in revs, then parents of those, etc. | |
|
352 | ||
|
353 | If inclusive is True, yield all the revs first (ignoring stoprev), | |
|
354 | then yield all the ancestors of revs as when inclusive is False. | |
|
355 | If an element in revs is an ancestor of a different rev it is not | |
|
356 | yielded again. | |
|
348 | See the documentation for ancestor.lazyancestors for more details.""" | |
|
357 | 349 | |
|
358 | Result does not include the null revision.""" | |
|
359 | visit = util.deque(revs) | |
|
360 | seen = set([nullrev]) | |
|
361 | if inclusive: | |
|
362 | for rev in revs: | |
|
363 | yield rev | |
|
364 | seen.update(revs) | |
|
365 | while visit: | |
|
366 | for parent in self.parentrevs(visit.popleft()): | |
|
367 | if parent < stoprev: | |
|
368 | continue | |
|
369 | if parent not in seen: | |
|
370 | visit.append(parent) | |
|
371 | seen.add(parent) | |
|
372 | yield parent | |
|
350 | return ancestor.lazyancestors(self, revs, stoprev=stoprev, | |
|
351 | inclusive=inclusive) | |
|
373 | 352 | |
|
374 | 353 | def descendants(self, revs): |
|
375 | 354 | """Generate the descendants of 'revs' in revision order. |
General Comments 0
You need to be logged in to leave comments.
Login now