Rev 438: Fix bug #733015. Have a separate Author(s) line from Committer. in http://bazaar.launchpad.net/~loggerhead-team/loggerhead/trunk-rich
John Arbash Meinel
john at arbash-meinel.com
Wed Mar 16 12:40:07 UTC 2011
At http://bazaar.launchpad.net/~loggerhead-team/loggerhead/trunk-rich
------------------------------------------------------------
revno: 438 [merge]
revision-id: john at arbash-meinel.com-20110316123956-6jherozycdjmt9px
parent: john at arbash-meinel.com-20110316122936-u1u98hqpwyv08ry9
parent: john at arbash-meinel.com-20110316123717-c36rtyk5ea30oboy
committer: John Arbash Meinel <john at arbash-meinel.com>
branch nick: trunk-rich
timestamp: Wed 2011-03-16 13:39:56 +0100
message:
Fix bug #733015. Have a separate Author(s) line from Committer.
added:
loggerhead/tests/test_revision_ui.py test_revision_ui.py-20110311105620-d2e745tamwmnvrat-1
modified:
NEWS news-20070121024650-6cwmhprgtcegpxvm-1
loggerhead/history.py history.py-20061211064342-102iqirsciyvgtcf-5
loggerhead/templates/revisioninfo.pt revisioninfo.pt-20070820180133-tx2jlsutm12tql2b-2
loggerhead/tests/__init__.py __init__.py-20061211064342-102iqirsciyvgtcf-29
loggerhead/tests/test_history.py test_history.py-20110311094724-qreaf3ppfbus5rym-1
-------------- next part --------------
=== modified file 'NEWS'
--- a/NEWS 2011-03-15 10:24:40 +0000
+++ b/NEWS 2011-03-16 12:24:06 +0000
@@ -16,17 +16,19 @@
- Merge the pqm changes back into trunk, after trunk was reverted to an old
revision. (John Arbash Meinel, #716152)
+ - Redirect ``/files/file.txt`` to ``/view/file.txt`` and ``/view/dir`` to
+ ``/files/dir``. (Jasper St. Pierre, #569358)
+
- Remove ``start-loggerhead`` and ``stop-loggerhead`` which were already
deprecated. (John Arbash Meinel)
- - Redirect ``/files/file.txt`` to ``/view/file.txt`` and ``/view/dir`` to
- ``/files/dir``. (Jasper St. Pierre, #569358)
+ - Show "Author(s)" as separate from "Committer". And label them
+ correctly. (John Arbash Meinel, #733015)
- The json module is no longer claimed to be supported as alternative for
simplejson. (Jelmer Vernooij, #586611)
-
1.18 [10Nov2010]
----------------
=== modified file 'loggerhead/history.py'
--- a/loggerhead/history.py 2011-03-11 09:22:29 +0000
+++ b/loggerhead/history.py 2011-03-11 10:43:39 +0000
@@ -35,6 +35,7 @@
import textwrap
import threading
+from bzrlib import tag
import bzrlib.branch
import bzrlib.delta
import bzrlib.errors
@@ -679,12 +680,17 @@
revtags = None
if revision.revision_id in self._branch_tags:
- revtags = ', '.join(self._branch_tags[revision.revision_id])
+ # tag.sort_* functions expect (tag, data) pairs, so we generate them,
+ # and then strip them
+ tags = [(t, None) for t in self._branch_tags[revision.revision_id]]
+ tag.sort_natural(self._branch, tags)
+ revtags = u', '.join([t[0] for t in tags])
entry = {
'revid': revision.revision_id,
'date': datetime.datetime.fromtimestamp(revision.timestamp),
'utc_date': datetime.datetime.utcfromtimestamp(revision.timestamp),
+ 'committer': revision.committer,
'authors': revision.get_apparent_authors(),
'branch_nick': revision.properties.get('branch-nick', None),
'short_comment': short_message,
=== modified file 'loggerhead/templates/revisioninfo.pt'
--- a/loggerhead/templates/revisioninfo.pt 2011-02-18 05:41:17 +0000
+++ b/loggerhead/templates/revisioninfo.pt 2011-03-16 12:37:17 +0000
@@ -3,6 +3,10 @@
<ul>
<li class="committer">
<strong>Committer:</strong>
+ <span tal:content="python:util.hide_email(change.committer)"></span>
+ </li>
+ <li class="authors" tal:condition="python:len(change.authors) > 1 or change.authors[0] != change.committer">
+ <strong>Author(s):</strong>
<span tal:content="python:', '.join(util.hide_emails(change.authors))"></span>
</li>
<li class="timer">
=== modified file 'loggerhead/tests/__init__.py'
--- a/loggerhead/tests/__init__.py 2011-03-16 12:21:36 +0000
+++ b/loggerhead/tests/__init__.py 2011-03-16 12:24:06 +0000
@@ -23,6 +23,7 @@
'test_history',
'test_load_test',
'test_simple',
+ 'test_revision_ui',
'test_templating',
]]))
return standard_tests
=== modified file 'loggerhead/tests/test_history.py'
--- a/loggerhead/tests/test_history.py 2011-03-11 09:50:24 +0000
+++ b/loggerhead/tests/test_history.py 2011-03-11 10:43:39 +0000
@@ -17,9 +17,10 @@
"""Direct tests of the loggerhead/history.py module"""
+from datetime import datetime
from bzrlib import tests
-from loggerhead import history
+from loggerhead import history as _mod_history
class TestHistoryGetRevidsFrom(tests.TestCaseWithMemoryTransport):
@@ -40,7 +41,7 @@
builder.finish_series()
b = builder.get_branch()
self.addCleanup(b.lock_read().unlock)
- return history.History(b, {})
+ return _mod_history.History(b, {})
def make_merged_ancestry(self):
# Time goes up
@@ -58,7 +59,7 @@
builder.finish_series()
b = builder.get_branch()
self.addCleanup(b.lock_read().unlock)
- return history.History(b, {})
+ return _mod_history.History(b, {})
def make_deep_merged_ancestry(self):
# Time goes up
@@ -83,32 +84,90 @@
builder.finish_series()
b = builder.get_branch()
self.addCleanup(b.lock_read().unlock)
- return history.History(b, {})
+ return _mod_history.History(b, {})
- def assertRevidsFrom(self, expected, his, search_revs, tip_rev):
+ def assertRevidsFrom(self, expected, history, search_revs, tip_rev):
self.assertEqual(expected,
- list(his.get_revids_from(search_revs, tip_rev)))
+ list(history.get_revids_from(search_revs, tip_rev)))
def test_get_revids_from_simple_mainline(self):
- his = self.make_linear_ancestry()
+ history = self.make_linear_ancestry()
self.assertRevidsFrom(['rev-3', 'rev-2', 'rev-1'],
- his, None, 'rev-3')
+ history, None, 'rev-3')
def test_get_revids_from_merged_mainline(self):
- his = self.make_merged_ancestry()
+ history = self.make_merged_ancestry()
self.assertRevidsFrom(['rev-3', 'rev-1'],
- his, None, 'rev-3')
+ history, None, 'rev-3')
def test_get_revids_given_one_rev(self):
- his = self.make_merged_ancestry()
+ history = self.make_merged_ancestry()
# rev-3 was the first mainline revision to see rev-2.
- self.assertRevidsFrom(['rev-3'], his, ['rev-2'], 'rev-3')
+ self.assertRevidsFrom(['rev-3'], history, ['rev-2'], 'rev-3')
def test_get_revids_deep_ancestry(self):
- his = self.make_deep_merged_ancestry()
- self.assertRevidsFrom(['F'], his, ['F'], 'F')
- self.assertRevidsFrom(['F'], his, ['E'], 'F')
- self.assertRevidsFrom(['F'], his, ['D'], 'F')
- self.assertRevidsFrom(['F'], his, ['C'], 'F')
- self.assertRevidsFrom(['B'], his, ['B'], 'F')
- self.assertRevidsFrom(['A'], his, ['A'], 'F')
+ history = self.make_deep_merged_ancestry()
+ self.assertRevidsFrom(['F'], history, ['F'], 'F')
+ self.assertRevidsFrom(['F'], history, ['E'], 'F')
+ self.assertRevidsFrom(['F'], history, ['D'], 'F')
+ self.assertRevidsFrom(['F'], history, ['C'], 'F')
+ self.assertRevidsFrom(['B'], history, ['B'], 'F')
+ self.assertRevidsFrom(['A'], history, ['A'], 'F')
+
+
+class TestHistoryChangeFromRevision(tests.TestCaseWithTransport):
+
+ def make_single_commit(self):
+ tree = self.make_branch_and_tree('test')
+ rev_id = tree.commit('Commit Message', timestamp=1299838474.317,
+ timezone=3600, committer='Joe Example <joe at example.com>',
+ revprops={})
+ self.addCleanup(tree.branch.lock_write().unlock)
+ rev = tree.branch.repository.get_revision(rev_id)
+ history = _mod_history.History(tree.branch, {})
+ return history, rev
+
+ def test_simple(self):
+ history, rev = self.make_single_commit()
+ change = history._change_from_revision(rev)
+ self.assertEqual(rev.revision_id, change.revid)
+ self.assertEqual(datetime.fromtimestamp(1299838474.317),
+ change.date)
+ self.assertEqual(datetime.utcfromtimestamp(1299838474.317),
+ change.utc_date)
+ self.assertEqual(['Joe Example <joe at example.com>'],
+ change.authors)
+ self.assertEqual('test', change.branch_nick)
+ self.assertEqual('Commit Message', change.short_comment)
+ self.assertEqual('Commit Message', change.comment)
+ self.assertEqual(['Commit Message'], change.comment_clean)
+ self.assertEqual([], change.parents)
+ self.assertEqual([], change.bugs)
+ self.assertEqual(None, change.tags)
+
+ def test_tags(self):
+ history, rev = self.make_single_commit()
+ b = history._branch
+ b.tags.set_tag('tag-1', rev.revision_id)
+ b.tags.set_tag('tag-2', rev.revision_id)
+ b.tags.set_tag('Tag-10', rev.revision_id)
+ change = history._change_from_revision(rev)
+ # tags are 'naturally' sorted, sorting numbers in order, and ignoring
+ # case, etc.
+ self.assertEqual('tag-1, tag-2, Tag-10', change.tags)
+
+ def test_committer_vs_authors(self):
+ tree = self.make_branch_and_tree('test')
+ rev_id = tree.commit('Commit Message', timestamp=1299838474.317,
+ timezone=3600, committer='Joe Example <joe at example.com>',
+ revprops={'authors': u'A Author <aauthor at example.com>\n'
+ u'B Author <bauthor at example.com>'})
+ self.addCleanup(tree.branch.lock_write().unlock)
+ rev = tree.branch.repository.get_revision(rev_id)
+ history = _mod_history.History(tree.branch, {})
+ change = history._change_from_revision(rev)
+ self.assertEqual(u'Joe Example <joe at example.com>',
+ change.committer)
+ self.assertEqual([u'A Author <aauthor at example.com>',
+ u'B Author <bauthor at example.com>'],
+ change.authors)
=== added file 'loggerhead/tests/test_revision_ui.py'
--- a/loggerhead/tests/test_revision_ui.py 1970-01-01 00:00:00 +0000
+++ b/loggerhead/tests/test_revision_ui.py 2011-03-16 12:37:17 +0000
@@ -0,0 +1,46 @@
+# Copyright (C) 2011 Canonical Ltd.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+
+
+from loggerhead.tests.test_simple import BasicTests
+
+
+class TestRevisionUI(BasicTests):
+
+ def test_authors_vs_committer(self):
+ self.createBranch()
+ self.tree.commit('First', committer="Joe Example <joe at example.com>",
+ revprops={'authors': u'A Author <aauthor at example.com>\n'
+ u'B Author <bauthor at example.com>'})
+ app = self.setUpLoggerhead()
+ res = app.get('/revision/1')
+ # We would like to assert that Joe Example is connected to Committer,
+ # and the Authors are connected. However, that requires asserting the
+ # exact HTML connections, which I wanted to avoid.
+ res.mustcontain('Committer', 'Joe Example',
+ 'Author(s)', 'A Author, B Author')
+
+ def test_author_is_committer(self):
+ self.createBranch()
+ self.tree.commit('First', committer="Joe Example <joe at example.com>")
+ app = self.setUpLoggerhead()
+ res = app.get('/revision/1')
+ # We would like to assert that Joe Example is connected to Committer,
+ # and the Authors are connected. However, that requires asserting the
+ # exact HTML connections, which I wanted to avoid.
+ res.mustcontain('Committer', 'Joe Example')
+ self.assertFalse('Author(s)' in res.body)
More information about the bazaar-commits
mailing list