##// 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 missing.reverse()
259 missing.reverse()
260 return missing
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 class lazyancestors(object):
293 class lazyancestors(object):
263 def __init__(self, pfunc, revs, stoprev=0, inclusive=False):
294 def __init__(self, pfunc, revs, stoprev=0, inclusive=False):
264 """Create a new object generating ancestors for the given revs. Does
295 """Create a new object generating ancestors for the given revs. Does
@@ -311,36 +342,9 b' class lazyancestors(object):'
311
342
312 If inclusive is True, the source revisions are also yielded. The
343 If inclusive is True, the source revisions are also yielded. The
313 reverse revision number order is still enforced."""
344 reverse revision number order is still enforced."""
314 seen = {nullrev}
345 for rev in _lazyancestorsiter(self._parentrevs, self._initrevs,
315 revs = self._initrevs
346 self._stoprev, self._inclusive):
316
347 yield rev
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)
344
348
345 def __contains__(self, target):
349 def __contains__(self, target):
346 """Test whether target is an ancestor of self._initrevs."""
350 """Test whether target is an ancestor of self._initrevs."""
General Comments 0
You need to be logged in to leave comments. Login now