##// END OF EJS Templates
lazyancestors: extract __iter__ to free function...
Martin von Zweigbergk -
r39517:b6a0e06b default
parent child Browse files
Show More
@@ -259,6 +259,37 b' class incrementalmissingancestors(object'
259 259 missing.reverse()
260 260 return missing
261 261
262 # Extracted from lazyancestors.__iter__ to avoid a reference cycle
263 def _lazyancestorsiter(parentrevs, initrevs, stoprev, inclusive):
264 seen = {nullrev}
265 revs = initrevs
266
267 schedule = heapq.heappush
268 nextitem = heapq.heappop
269 see = seen.add
270
271 if inclusive:
272 visit = [-r for r in revs]
273 seen.update(revs)
274 heapq.heapify(visit)
275 else:
276 visit = []
277 heapq.heapify(visit)
278 for r in revs:
279 for parent in parentrevs(r):
280 if parent not in seen:
281 schedule(visit, -parent)
282 see(parent)
283
284 while visit:
285 current = -nextitem(visit)
286 if current >= stoprev:
287 yield current
288 for parent in parentrevs(current):
289 if parent not in seen:
290 schedule(visit, -parent)
291 see(parent)
292
262 293 class lazyancestors(object):
263 294 def __init__(self, pfunc, revs, stoprev=0, inclusive=False):
264 295 """Create a new object generating ancestors for the given revs. Does
@@ -311,36 +342,9 b' class lazyancestors(object):'
311 342
312 343 If inclusive is True, the source revisions are also yielded. The
313 344 reverse revision number order is still enforced."""
314 seen = {nullrev}
315 revs = self._initrevs
316
317 parentrevs = self._parentrevs
318 stoprev = self._stoprev
319 schedule = heapq.heappush
320 nextitem = heapq.heappop
321 see = seen.add
322
323 if self._inclusive:
324 visit = [-r for r in revs]
325 seen.update(revs)
326 heapq.heapify(visit)
327 else:
328 visit = []
329 heapq.heapify(visit)
330 for r in revs:
331 for parent in parentrevs(r):
332 if parent not in seen:
333 schedule(visit, -parent)
334 see(parent)
335
336 while visit:
337 current = -nextitem(visit)
338 if current >= stoprev:
339 yield current
340 for parent in parentrevs(current):
341 if parent not in seen:
342 schedule(visit, -parent)
343 see(parent)
345 for rev in _lazyancestorsiter(self._parentrevs, self._initrevs,
346 self._stoprev, self._inclusive):
347 yield rev
344 348
345 349 def __contains__(self, target):
346 350 """Test whether target is an ancestor of self._initrevs."""
General Comments 0
You need to be logged in to leave comments. Login now