Rev 5211: (garyvdm for gagern) Add a --authors switch to bzr log, in file:///home/pqm/archives/thelove/bzr/%2Btrunk/
Canonical.com Patch Queue Manager
pqm at pqm.ubuntu.com
Wed May 5 14:25:31 BST 2010
At file:///home/pqm/archives/thelove/bzr/%2Btrunk/
------------------------------------------------------------
revno: 5211 [merge]
revision-id: pqm at pqm.ubuntu.com-20100505132524-enlf40fsv53johdt
parent: pqm at pqm.ubuntu.com-20100505120735-98yx0p5hou1knl24
parent: garyvdm at gmail.com-20100505082434-7v9qgse94sqnorfn
committer: Canonical.com Patch Queue Manager <pqm at pqm.ubuntu.com>
branch nick: +trunk
timestamp: Wed 2010-05-05 14:25:24 +0100
message:
(garyvdm for gagern) Add a --authors switch to bzr log,
allowing users to override the choice of authors for all built-in
formats.
modified:
NEWS NEWS-20050323055033-4e00b5db738777ff
bzrlib/builtins.py builtins.py-20050830033751-fc01482b9ca23183
bzrlib/log.py log.py-20050505065812-c40ce11702fe5fb1
bzrlib/tests/test_log.py testlog.py-20050728115707-1a514809d7d49309
=== modified file 'NEWS'
--- a/NEWS 2010-05-05 12:07:35 +0000
+++ b/NEWS 2010-05-05 13:25:24 +0000
@@ -30,6 +30,10 @@
pack operation.
(Parth Malwankar, #304320)
+* New command line option ``--authors`` to ``bzr log`` allows users to
+ select which of the apparent authors and committer should be
+ included in the log. Defaults depend on format. (Martin von Gagern, #513322)
+
* Support ``--directory`` option for a number of additional commands:
added, annotate, bind, cat, cat-revision, clean-tree, deleted,
export, ignore, ignored, lookup-revision, ls, modified, nick,
=== modified file 'bzrlib/builtins.py'
--- a/bzrlib/builtins.py 2010-05-05 12:07:35 +0000
+++ b/bzrlib/builtins.py 2010-05-05 13:25:24 +0000
@@ -2283,6 +2283,11 @@
help='Show just the specified revision.'
' See also "help revisionspec".'),
'log-format',
+ RegistryOption('authors',
+ 'What names to list as authors - first, all or committer.',
+ title='Authors',
+ lazy_registry=('bzrlib.log', 'author_list_registry'),
+ ),
Option('levels',
short_name='n',
help='Number of levels to display - 0 for all, 1 for flat.',
@@ -2323,6 +2328,7 @@
limit=None,
show_diff=False,
include_merges=False,
+ authors=None,
exclude_common_ancestry=False,
):
from bzrlib.log import (
@@ -2408,7 +2414,8 @@
show_timezone=timezone,
delta_format=get_verbosity_level(),
levels=levels,
- show_advice=levels is None)
+ show_advice=levels is None,
+ author_list_handler=authors)
# Choose the algorithm for doing the logging. It's annoying
# having multiple code paths like this but necessary until
=== modified file 'bzrlib/log.py'
--- a/bzrlib/log.py 2010-04-14 12:30:17 +0000
+++ b/bzrlib/log.py 2010-05-05 08:18:32 +0000
@@ -1341,7 +1341,7 @@
def __init__(self, to_file, show_ids=False, show_timezone='original',
delta_format=None, levels=None, show_advice=False,
- to_exact_file=None):
+ to_exact_file=None, author_list_handler=None):
"""Create a LogFormatter.
:param to_file: the file to output to
@@ -1355,6 +1355,8 @@
let the log formatter decide.
:param show_advice: whether to show advice at the end of the
log or not
+ :param author_list_handler: callable generating a list of
+ authors to display for a given revision
"""
self.to_file = to_file
# 'exact' stream used to show diff, it should print content 'as is'
@@ -1375,6 +1377,7 @@
self.levels = levels
self._show_advice = show_advice
self._merge_count = 0
+ self._author_list_handler = author_list_handler
def get_levels(self):
"""Get the number of levels to display or 0 for all."""
@@ -1412,10 +1415,41 @@
return address
def short_author(self, rev):
- name, address = config.parse_username(rev.get_apparent_authors()[0])
- if name:
- return name
- return address
+ return self.authors(rev, 'first', short=True, sep=', ')
+
+ def authors(self, rev, who, short=False, sep=None):
+ """Generate list of authors, taking --authors option into account.
+
+ The caller has to specify the name of a author list handler,
+ as provided by the author list registry, using the ``who``
+ argument. That name only sets a default, though: when the
+ user selected a different author list generation using the
+ ``--authors`` command line switch, as represented by the
+ ``author_list_handler`` constructor argument, that value takes
+ precedence.
+
+ :param rev: The revision for which to generate the list of authors.
+ :param who: Name of the default handler.
+ :param short: Whether to shorten names to either name or address.
+ :param sep: What separator to use for automatic concatenation.
+ """
+ if self._author_list_handler is not None:
+ # The user did specify --authors, which overrides the default
+ author_list_handler = self._author_list_handler
+ else:
+ # The user didn't specify --authors, so we use the caller's default
+ author_list_handler = author_list_registry.get(who)
+ names = author_list_handler(rev)
+ if short:
+ for i in range(len(names)):
+ name, address = config.parse_username(names[i])
+ if name:
+ names[i] = name
+ else:
+ names[i] = address
+ if sep is not None:
+ names = sep.join(names)
+ return names
def merge_marker(self, revision):
"""Get the merge marker to include in the output or '' if none."""
@@ -1523,7 +1557,7 @@
lines.extend(self.custom_properties(revision.rev))
committer = revision.rev.committer
- authors = revision.rev.get_apparent_authors()
+ authors = self.authors(revision.rev, 'all')
if authors != [committer]:
lines.append('author: %s' % (", ".join(authors),))
lines.append('committer: %s' % (committer,))
@@ -1703,7 +1737,8 @@
self.show_timezone,
date_fmt='%Y-%m-%d',
show_offset=False)
- committer_str = revision.rev.get_apparent_authors()[0].replace (' <', ' <')
+ committer_str = self.authors(revision.rev, 'first', sep=', ')
+ committer_str = committer_str.replace(' <', ' <')
to_file.write('%s %s\n\n' % (date_str,committer_str))
if revision.delta is not None and revision.delta.has_changed():
@@ -1774,6 +1809,34 @@
raise errors.BzrCommandError("unknown log formatter: %r" % name)
+def author_list_all(rev):
+ return rev.get_apparent_authors()[:]
+
+
+def author_list_first(rev):
+ lst = rev.get_apparent_authors()
+ try:
+ return [lst[0]]
+ except IndexError:
+ return []
+
+
+def author_list_committer(rev):
+ return [rev.committer]
+
+
+author_list_registry = registry.Registry()
+
+author_list_registry.register('all', author_list_all,
+ 'All authors')
+
+author_list_registry.register('first', author_list_first,
+ 'The first author')
+
+author_list_registry.register('committer', author_list_committer,
+ 'The committer')
+
+
def show_one_log(revno, rev, delta, verbose, to_file, show_timezone):
# deprecated; for compatibility
lf = LongLogFormatter(to_file=to_file, show_timezone=show_timezone)
=== modified file 'bzrlib/tests/test_log.py'
--- a/bzrlib/tests/test_log.py 2010-04-28 07:10:36 +0000
+++ b/bzrlib/tests/test_log.py 2010-05-05 08:18:32 +0000
@@ -1543,6 +1543,151 @@
def test_bugs_handler_present(self):
self.properties_handler_registry.get('bugs_properties_handler')
+
+class TestLogForAuthors(TestCaseForLogFormatter):
+
+ def setUp(self):
+ TestCaseForLogFormatter.setUp(self)
+ self.wt = self.make_standard_commit('nicky',
+ authors=['John Doe <jdoe at example.com>',
+ 'Jane Rey <jrey at example.com>'])
+
+ def assertFormatterResult(self, formatter, who, result):
+ formatter_kwargs = dict()
+ if who is not None:
+ author_list_handler = log.author_list_registry.get(who)
+ formatter_kwargs['author_list_handler'] = author_list_handler
+ TestCaseForLogFormatter.assertFormatterResult(self, result,
+ self.wt.branch, formatter, formatter_kwargs=formatter_kwargs)
+
+ def test_line_default(self):
+ self.assertFormatterResult(log.LineLogFormatter, None, """\
+1: John Doe 2005-11-22 add a
+""")
+
+ def test_line_committer(self):
+ self.assertFormatterResult(log.LineLogFormatter, 'committer', """\
+1: Lorem Ipsum 2005-11-22 add a
+""")
+
+ def test_line_first(self):
+ self.assertFormatterResult(log.LineLogFormatter, 'first', """\
+1: John Doe 2005-11-22 add a
+""")
+
+ def test_line_all(self):
+ self.assertFormatterResult(log.LineLogFormatter, 'all', """\
+1: John Doe, Jane Rey 2005-11-22 add a
+""")
+
+
+ def test_short_default(self):
+ self.assertFormatterResult(log.ShortLogFormatter, None, """\
+ 1 John Doe\t2005-11-22
+ add a
+
+""")
+
+ def test_short_committer(self):
+ self.assertFormatterResult(log.ShortLogFormatter, 'committer', """\
+ 1 Lorem Ipsum\t2005-11-22
+ add a
+
+""")
+
+ def test_short_first(self):
+ self.assertFormatterResult(log.ShortLogFormatter, 'first', """\
+ 1 John Doe\t2005-11-22
+ add a
+
+""")
+
+ def test_short_all(self):
+ self.assertFormatterResult(log.ShortLogFormatter, 'all', """\
+ 1 John Doe, Jane Rey\t2005-11-22
+ add a
+
+""")
+
+ def test_long_default(self):
+ self.assertFormatterResult(log.LongLogFormatter, None, """\
+------------------------------------------------------------
+revno: 1
+author: John Doe <jdoe at example.com>, Jane Rey <jrey at example.com>
+committer: Lorem Ipsum <test at example.com>
+branch nick: nicky
+timestamp: Tue 2005-11-22 00:00:00 +0000
+message:
+ add a
+""")
+
+ def test_long_committer(self):
+ self.assertFormatterResult(log.LongLogFormatter, 'committer', """\
+------------------------------------------------------------
+revno: 1
+committer: Lorem Ipsum <test at example.com>
+branch nick: nicky
+timestamp: Tue 2005-11-22 00:00:00 +0000
+message:
+ add a
+""")
+
+ def test_long_first(self):
+ self.assertFormatterResult(log.LongLogFormatter, 'first', """\
+------------------------------------------------------------
+revno: 1
+author: John Doe <jdoe at example.com>
+committer: Lorem Ipsum <test at example.com>
+branch nick: nicky
+timestamp: Tue 2005-11-22 00:00:00 +0000
+message:
+ add a
+""")
+
+ def test_long_all(self):
+ self.assertFormatterResult(log.LongLogFormatter, 'all', """\
+------------------------------------------------------------
+revno: 1
+author: John Doe <jdoe at example.com>, Jane Rey <jrey at example.com>
+committer: Lorem Ipsum <test at example.com>
+branch nick: nicky
+timestamp: Tue 2005-11-22 00:00:00 +0000
+message:
+ add a
+""")
+
+ def test_gnu_changelog_default(self):
+ self.assertFormatterResult(log.GnuChangelogLogFormatter, None, """\
+2005-11-22 John Doe <jdoe at example.com>
+
+\tadd a
+
+""")
+
+ def test_gnu_changelog_committer(self):
+ self.assertFormatterResult(log.GnuChangelogLogFormatter, 'committer', """\
+2005-11-22 Lorem Ipsum <test at example.com>
+
+\tadd a
+
+""")
+
+ def test_gnu_changelog_first(self):
+ self.assertFormatterResult(log.GnuChangelogLogFormatter, 'first', """\
+2005-11-22 John Doe <jdoe at example.com>
+
+\tadd a
+
+""")
+
+ def test_gnu_changelog_all(self):
+ self.assertFormatterResult(log.GnuChangelogLogFormatter, 'all', """\
+2005-11-22 John Doe <jdoe at example.com>, Jane Rey <jrey at example.com>
+
+\tadd a
+
+""")
+
class TestLogExcludeAncestry(tests.TestCaseWithTransport):
def make_branch_with_alternate_ancestries(self, relpath='.'):
More information about the bazaar-commits
mailing list