446
446
# start_revision_id.
447
447
if self._merge_sorted_revisions_cache is None:
448
448
last_revision = self.last_revision()
449
last_key = (last_revision,)
450
known_graph = self.repository.revisions.get_known_graph_ancestry(
452
self._merge_sorted_revisions_cache = known_graph.merge_sort(
449
graph = self.repository.get_graph()
450
parent_map = dict(((key, value) for key, value in
451
graph.iter_ancestry([last_revision]) if value is not None))
452
revision_graph = repository._strip_NULL_ghosts(parent_map)
453
revs = tsort.merge_sort(revision_graph, last_revision, None,
455
# Drop the sequence # before caching
456
self._merge_sorted_revisions_cache = [r[1:] for r in revs]
454
458
filtered = self._filter_merge_sorted_revisions(
455
459
self._merge_sorted_revisions_cache, start_revision_id,
456
460
stop_revision_id, stop_rule)
466
470
"""Iterate over an inclusive range of sorted revisions."""
467
471
rev_iter = iter(merge_sorted_revisions)
468
472
if start_revision_id is not None:
469
for node in rev_iter:
470
rev_id = node.key[-1]
473
for rev_id, depth, revno, end_of_merge in rev_iter:
471
474
if rev_id != start_revision_id:
474
477
# The decision to include the start or not
475
478
# depends on the stop_rule if a stop is provided
476
# so pop this node back into the iterator
477
rev_iter = chain(iter([node]), rev_iter)
480
iter([(rev_id, depth, revno, end_of_merge)]),
479
483
if stop_revision_id is None:
481
for node in rev_iter:
482
rev_id = node.key[-1]
483
yield (rev_id, node.merge_depth, node.revno,
484
for rev_id, depth, revno, end_of_merge in rev_iter:
485
yield rev_id, depth, revno, end_of_merge
485
486
elif stop_rule == 'exclude':
486
for node in rev_iter:
487
rev_id = node.key[-1]
487
for rev_id, depth, revno, end_of_merge in rev_iter:
488
488
if rev_id == stop_revision_id:
490
yield (rev_id, node.merge_depth, node.revno,
490
yield rev_id, depth, revno, end_of_merge
492
491
elif stop_rule == 'include':
493
for node in rev_iter:
494
rev_id = node.key[-1]
495
yield (rev_id, node.merge_depth, node.revno,
492
for rev_id, depth, revno, end_of_merge in rev_iter:
493
yield rev_id, depth, revno, end_of_merge
497
494
if rev_id == stop_revision_id:
499
496
elif stop_rule == 'with-merges':
502
499
left_parent = stop_rev.parent_ids[0]
504
501
left_parent = _mod_revision.NULL_REVISION
505
for node in rev_iter:
506
rev_id = node.key[-1]
502
for rev_id, depth, revno, end_of_merge in rev_iter:
507
503
if rev_id == left_parent:
509
yield (rev_id, node.merge_depth, node.revno,
505
yield rev_id, depth, revno, end_of_merge
512
507
raise ValueError('invalid stop_rule %r' % stop_rule)
1152
1147
revision_id: if not None, the revision history in the new branch will
1153
1148
be truncated to end with revision_id.
1155
if (repository_policy is not None and
1156
repository_policy.requires_stacking()):
1157
to_bzrdir._format.require_stacking(_skip_repo=True)
1158
1150
result = to_bzrdir.create_branch()
1159
1151
result.lock_write()
2072
2064
BranchFormat.register_format(__format6)
2073
2065
BranchFormat.register_format(__format7)
2074
2066
BranchFormat.register_format(__format8)
2075
BranchFormat.set_default_format(__format7)
2067
BranchFormat.set_default_format(__format6)
2076
2068
_legacy_formats = [BzrBranchFormat4(),
2078
2070
network_format_registry.register(