14
14
# along with this program; if not, write to the Free Software
15
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17
19
"""Code to show logs of changes.
19
21
Various flavors of log can be produced:
108
graph = branch.repository.get_graph()
109
history = list(graph.iter_lefthand_ancestry(branch.last_revision(),
110
[_mod_revision.NULL_REVISION]))
111
for revision_id in reversed(history):
108
for revision_id in branch.revision_history():
112
109
this_inv = branch.repository.get_inventory(revision_id)
113
110
if this_inv.has_id(file_id):
114
111
this_ie = this_inv[file_id]
332
338
from bzrlib import gpg
334
340
gpg_strategy = gpg.GPGStrategy(None)
335
result = repo.verify_revision_signature(rev_id, gpg_strategy)
341
result = repo.verify_revision(rev_id, gpg_strategy)
336
342
if result[0] == gpg.SIGNATURE_VALID:
337
return u"valid signature from {0}".format(result[1])
343
return "valid signature from {0}".format(result[1])
338
344
if result[0] == gpg.SIGNATURE_KEY_MISSING:
339
345
return "unknown key {0}".format(result[1])
340
346
if result[0] == gpg.SIGNATURE_NOT_VALID:
571
577
and (not generate_merge_revisions
572
578
or not _has_merges(branch, end_rev_id))):
573
579
# If a single revision is requested, check we can handle it
574
return _generate_one_revision(branch, end_rev_id, br_rev_id,
576
if not generate_merge_revisions:
578
# If we only want to see linear revisions, we can iterate ...
579
iter_revs = _linear_view_revisions(
580
branch, start_rev_id, end_rev_id,
581
exclude_common_ancestry=exclude_common_ancestry)
582
# If a start limit was given and it's not obviously an
583
# ancestor of the end limit, check it before outputting anything
584
if (direction == 'forward'
585
or (start_rev_id and not _is_obvious_ancestor(
586
branch, start_rev_id, end_rev_id))):
587
iter_revs = list(iter_revs)
588
if direction == 'forward':
589
iter_revs = reversed(iter_revs)
591
except _StartNotLinearAncestor:
592
# Switch to the slower implementation that may be able to find a
593
# non-obvious ancestor out of the left-hand history.
595
iter_revs = _generate_all_revisions(branch, start_rev_id, end_rev_id,
596
direction, delayed_graph_generation,
597
exclude_common_ancestry)
598
if direction == 'forward':
599
iter_revs = _rebase_merge_depth(reverse_by_depth(list(iter_revs)))
580
iter_revs = _generate_one_revision(branch, end_rev_id, br_rev_id,
582
elif not generate_merge_revisions:
583
# If we only want to see linear revisions, we can iterate ...
584
iter_revs = _generate_flat_revisions(branch, start_rev_id, end_rev_id,
585
direction, exclude_common_ancestry)
586
if direction == 'forward':
587
iter_revs = reversed(iter_revs)
589
iter_revs = _generate_all_revisions(branch, start_rev_id, end_rev_id,
590
direction, delayed_graph_generation,
591
exclude_common_ancestry)
592
if direction == 'forward':
593
iter_revs = _rebase_merge_depth(reverse_by_depth(list(iter_revs)))
609
603
return [(rev_id, revno_str, 0)]
606
def _generate_flat_revisions(branch, start_rev_id, end_rev_id, direction,
607
exclude_common_ancestry=False):
608
result = _linear_view_revisions(
609
branch, start_rev_id, end_rev_id,
610
exclude_common_ancestry=exclude_common_ancestry)
611
# If a start limit was given and it's not obviously an
612
# ancestor of the end limit, check it before outputting anything
613
if direction == 'forward' or (start_rev_id
614
and not _is_obvious_ancestor(branch, start_rev_id, end_rev_id)):
616
result = list(result)
617
except _StartNotLinearAncestor:
618
raise errors.BzrCommandError(gettext('Start revision not found in'
619
' left-hand history of end revision.'))
612
623
def _generate_all_revisions(branch, start_rev_id, end_rev_id, direction,
613
624
delayed_graph_generation,
614
625
exclude_common_ancestry=False):
1785
1796
return self.get(name)(*args, **kwargs)
1787
1798
def get_default(self, branch):
1788
c = branch.get_config_stack()
1789
return self.get(c.get('log_format'))
1799
return self.get(branch.get_config().log_format())
1792
1802
log_formatter_registry = LogFormatterRegistry()
1795
1805
log_formatter_registry.register('short', ShortLogFormatter,
1796
'Moderately short log format.')
1806
'Moderately short log format')
1797
1807
log_formatter_registry.register('long', LongLogFormatter,
1798
'Detailed log format.')
1808
'Detailed log format')
1799
1809
log_formatter_registry.register('line', LineLogFormatter,
1800
'Log format with one line per revision.')
1810
'Log format with one line per revision')
1801
1811
log_formatter_registry.register('gnu-changelog', GnuChangelogLogFormatter,
1802
'Format used by GNU ChangeLog files.')
1812
'Format used by GNU ChangeLog files')
1805
1815
def register_formatter(name, formatter):
2014
2024
kind is one of values 'directory', 'file', 'symlink', 'tree-reference'.
2015
2025
branch will be read-locked.
2017
from bzrlib.builtins import _get_revision_range
2018
tree, b, path = controldir.ControlDir.open_containing_tree_or_branch(
2027
from builtins import _get_revision_range
2028
tree, b, path = bzrdir.BzrDir.open_containing_tree_or_branch(file_list[0])
2020
2029
add_cleanup(b.lock_read().unlock)
2021
2030
# XXX: It's damn messy converting a list of paths to relative paths when
2022
2031
# those paths might be deleted ones, they might be on a case-insensitive