412
412
Subclasses may wish to override this.
414
return _DefaultLogGenerator(branch, rqst)
414
return _DefaultLogGenerator(branch, **rqst)
417
def _log_revision_iterator_using_per_file_graph(
418
branch, delta_type, match, levels, file_id, start_rev_id, end_rev_id,
419
direction, exclude_common_ancestry):
420
# Get the base revisions, filtering by the revision range.
421
# Note that we always generate the merge revisions because
422
# filter_revisions_touching_file_id() requires them ...
423
view_revisions = _calc_view_revisions(
424
branch, start_rev_id, end_rev_id,
425
direction, generate_merge_revisions=True,
426
exclude_common_ancestry=exclude_common_ancestry)
427
if not isinstance(view_revisions, list):
428
view_revisions = list(view_revisions)
429
view_revisions = _filter_revisions_touching_file_id(
430
branch, file_id, view_revisions,
431
include_merges=levels != 1)
432
return make_log_rev_iterator(
433
branch, view_revisions, delta_type, match)
436
def _log_revision_iterator_using_delta_matching(
437
branch, delta_type, match, levels, specific_fileids, start_rev_id, end_rev_id,
438
direction, exclude_common_ancestry, limit):
439
# Get the base revisions, filtering by the revision range
440
generate_merge_revisions = levels != 1
441
delayed_graph_generation = not specific_fileids and (
442
limit or start_rev_id or end_rev_id)
443
view_revisions = _calc_view_revisions(
444
branch, start_rev_id, end_rev_id,
446
generate_merge_revisions=generate_merge_revisions,
447
delayed_graph_generation=delayed_graph_generation,
448
exclude_common_ancestry=exclude_common_ancestry)
450
# Apply the other filters
451
return make_log_rev_iterator(branch, view_revisions,
453
file_ids=specific_fileids,
417
457
class _StartNotLinearAncestor(Exception):
421
461
class _DefaultLogGenerator(LogGenerator):
422
462
"""The default generator of log revisions."""
424
def __init__(self, branch, rqst):
465
self, branch, levels=None, limit=None, diff_type=None,
466
delta_type=None, show_signature=None, omit_merges=None,
467
generate_tags=None, specific_fileids=None, match=None,
468
start_revision=None, end_revision=None, direction=None,
469
exclude_common_ancestry=None, _match_using_deltas=None,
425
471
self.branch = branch
426
self.levels = rqst.get('levels')
427
self.limit = rqst.get('limit')
428
self.diff_type = rqst.get('diff_type')
429
self.delta_type = rqst.get('delta_type')
430
self.show_signature = rqst.get('signature')
431
self.omit_merges = rqst.get('omit_merges')
432
self.generate_tags = rqst.get('generate_tags')
433
self.specific_fileids = rqst.get('specific_fileids')
434
self.match = rqst.get('match')
435
self.start_revision = rqst.get('start_revision')
436
self.end_revision = rqst.get('end_revision')
437
self.direction = rqst.get('direction')
438
self.exclude_common_ancestry = rqst.get('exclude_common_ancestry')
439
self._match_using_deltas = rqst.get('_match_using_deltas')
440
if self.generate_tags and branch.supports_tags():
474
self.diff_type = diff_type
475
self.delta_type = delta_type
476
self.show_signature = signature
477
self.omit_merges = omit_merges
478
self.specific_fileids = specific_fileids
480
self.start_revision = start_revision
481
self.end_revision = end_revision
482
self.direction = direction
483
self.exclude_common_ancestry = exclude_common_ancestry
484
self._match_using_deltas = _match_using_deltas
485
if generate_tags and branch.supports_tags():
441
486
self.rev_tag_dict = branch.tags.get_reverse_tag_dict()
443
488
self.rev_tag_dict = {}
500
545
:return: An iterator over lists of ((rev_id, revno, merge_depth), rev,
503
self.start_rev_id, self.end_rev_id = _get_revision_limits(
548
start_rev_id, end_rev_id = _get_revision_limits(
504
549
self.branch, self.start_revision, self.end_revision)
505
550
if self._match_using_deltas:
506
return self._log_revision_iterator_using_delta_matching()
551
return _log_revision_iterator_using_delta_matching(
553
delta_type=self.delta_type,
556
specific_fileids=self.specific_fileids,
557
start_rev_id=start_rev_id, end_rev_id=end_rev_id,
558
direction=self.direction,
559
exclude_common_ancestry=self.exclude_common_ancestry,
508
562
# We're using the per-file-graph algorithm. This scales really
509
563
# well but only makes sense if there is a single file and it's
513
567
raise errors.BzrError(
514
568
"illegal LogRequest: must match-using-deltas "
515
569
"when logging %d files" % file_count)
516
return self._log_revision_iterator_using_per_file_graph()
518
def _log_revision_iterator_using_delta_matching(self):
519
# Get the base revisions, filtering by the revision range
520
generate_merge_revisions = self.levels != 1
521
delayed_graph_generation = not self.specific_fileids and (
522
self.limit or self.start_rev_id or self.end_rev_id)
523
view_revisions = _calc_view_revisions(
524
self.branch, self.start_rev_id, self.end_rev_id,
526
generate_merge_revisions=generate_merge_revisions,
527
delayed_graph_generation=delayed_graph_generation,
528
exclude_common_ancestry=self.exclude_common_ancestry)
530
# Apply the other filters
531
return make_log_rev_iterator(self.branch, view_revisions,
532
self.delta_type, self.match,
533
file_ids=self.specific_fileids,
534
direction=self.direction)
536
def _log_revision_iterator_using_per_file_graph(self):
537
# Get the base revisions, filtering by the revision range.
538
# Note that we always generate the merge revisions because
539
# filter_revisions_touching_file_id() requires them ...
540
view_revisions = _calc_view_revisions(
541
self.branch, self.start_rev_id, self.end_rev_id,
542
self.direction, generate_merge_revisions=True,
543
exclude_common_ancestry=self.exclude_common_ancestry)
544
if not isinstance(view_revisions, list):
545
view_revisions = list(view_revisions)
546
view_revisions = _filter_revisions_touching_file_id(
547
self.branch, self.specific_fileids[0], view_revisions,
548
include_merges=self.levels != 1)
549
return make_log_rev_iterator(
550
self.branch, view_revisions, self.delta_type, self.match)
570
return _log_revision_iterator_using_per_file_graph(
572
delta_type=self.delta_type,
575
file_id=self.specific_fileids[0],
576
start_rev_id=start_rev_id, end_rev_id=end_rev_id,
577
direction=self.direction,
578
exclude_common_ancestry=self.exclude_common_ancestry
553
582
def _calc_view_revisions(branch, start_rev_id, end_rev_id, direction,