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