447
447
# start_revision_id.
448
448
if self._merge_sorted_revisions_cache is None:
449
449
last_revision = self.last_revision()
450
last_key = (last_revision,)
451
known_graph = self.repository.revisions.get_known_graph_ancestry(
450
known_graph = self.repository.get_known_graph_ancestry(
453
452
self._merge_sorted_revisions_cache = known_graph.merge_sort(
455
454
filtered = self._filter_merge_sorted_revisions(
456
455
self._merge_sorted_revisions_cache, start_revision_id,
457
456
stop_revision_id, stop_rule)
457
# Make sure we don't return revisions that are not part of the
458
# start_revision_id ancestry.
459
filtered = self._filter_non_ancestors(filtered)
458
460
if direction == 'reverse':
460
462
if direction == 'forward':
526
528
raise ValueError('invalid stop_rule %r' % stop_rule)
530
def _filter_non_ancestors(self, rev_iter):
531
# If we started from a dotted revno, we want to consider it as a tip
532
# and don't want to yield revisions that are not part of its
533
# ancestry. Given the order guaranteed by the merge sort, we will see
534
# uninteresting descendants of the first parent of our tip before the
536
first = rev_iter.next()
537
(rev_id, merge_depth, revno, end_of_merge) = first
540
# We start at a mainline revision so by definition, all others
541
# revisions in rev_iter are ancestors
542
for node in rev_iter:
547
pmap = self.repository.get_parent_map([rev_id])
548
parents = pmap.get(rev_id, [])
550
whitelist.update(parents)
552
# If there is no parents, there is nothing of interest left
554
# FIXME: It's hard to test this scenario here as this code is never
555
# called in that case. -- vila 20100322
558
for (rev_id, merge_depth, revno, end_of_merge) in rev_iter:
560
if rev_id in whitelist:
561
pmap = self.repository.get_parent_map([rev_id])
562
parents = pmap.get(rev_id, [])
563
whitelist.remove(rev_id)
564
whitelist.update(parents)
566
# We've reached the mainline, there is nothing left to
570
# A revision that is not part of the ancestry of our
573
yield (rev_id, merge_depth, revno, end_of_merge)
528
575
def leave_lock_in_place(self):
529
576
"""Tell this branch object not to release the physical lock when this
530
577
object is unlocked.