Merge lp:~wgrant/launchpad/gitcrumbs into lp:launchpad

Proposed by William Grant
Status: Merged
Merged at revision: 17727
Proposed branch: lp:~wgrant/launchpad/gitcrumbs
Merge into: lp:launchpad
Diff against target: 133 lines (+87/-6)
3 files modified
lib/lp/code/browser/configure.zcml (+5/-0)
lib/lp/code/browser/gitrepository.py (+24/-6)
lib/lp/code/browser/tests/test_gitref.py (+58/-0)
To merge this branch: bzr merge lp:~wgrant/launchpad/gitcrumbs
Reviewer Review Type Date Requested Status
Colin Watson (community) Approve
Review via email: mp+270660@code.launchpad.net

Commit message

Give Git repositories and refs more sensible breadcrumbs.

Description of the change

Give Git repositories and refs more sensible breadcrumbs:

 Git >> lp:~wgrant/launchpad >> master

I considered allowing navigation to PersonProduct via something like:

 Git >> William Grant >> launchpad >> master

... but that makes things longer for default repositories.

To post a comment you must log in.
Revision history for this message
Colin Watson (cjwatson) :
review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'lib/lp/code/browser/configure.zcml'
2--- lib/lp/code/browser/configure.zcml 2015-06-25 04:42:48 +0000
3+++ lib/lp/code/browser/configure.zcml 2015-09-10 11:49:18 +0000
4@@ -904,6 +904,11 @@
5 <browser:menus
6 classes="GitRefContextMenu"
7 module="lp.code.browser.gitref"/>
8+ <adapter
9+ provides="lp.services.webapp.interfaces.IBreadcrumb"
10+ for="lp.code.interfaces.gitref.IGitRef"
11+ factory="lp.services.webapp.breadcrumb.NameBreadcrumb"
12+ permission="zope.Public"/>
13
14 <browser:defaultView
15 for="lp.code.interfaces.gitsubscription.IGitSubscription"
16
17=== modified file 'lib/lp/code/browser/gitrepository.py'
18--- lib/lp/code/browser/gitrepository.py 2015-08-04 10:28:21 +0000
19+++ lib/lp/code/browser/gitrepository.py 2015-09-10 11:49:18 +0000
20@@ -7,6 +7,7 @@
21
22 __all__ = [
23 'GitRefBatchNavigator',
24+ 'GitRepositoriesBreadcrumb',
25 'GitRepositoryBreadcrumb',
26 'GitRepositoryContextMenu',
27 'GitRepositoryDeletionView',
28@@ -86,7 +87,7 @@
29 precache_permission_for_objects,
30 )
31 from lp.services.webapp.batching import TableBatchNavigator
32-from lp.services.webapp.breadcrumb import NameBreadcrumb
33+from lp.services.webapp.breadcrumb import Breadcrumb
34 from lp.services.webapp.escaping import structured
35 from lp.services.webapp.interfaces import ICanonicalUrlData
36 from lp.services.webhooks.browser import WebhookTargetNavigationMixin
37@@ -107,11 +108,28 @@
38 return self.repository.unique_name
39
40
41-class GitRepositoryBreadcrumb(NameBreadcrumb):
42-
43- @property
44- def inside(self):
45- return self.context.target
46+class GitRepositoriesBreadcrumb(Breadcrumb):
47+
48+ text = "Git"
49+
50+ @property
51+ def url(self):
52+ return canonical_url(self.context, view_name="+git")
53+
54+ @property
55+ def inside(self):
56+ return self.context
57+
58+
59+class GitRepositoryBreadcrumb(Breadcrumb):
60+
61+ @property
62+ def text(self):
63+ return self.context.git_identity
64+
65+ @property
66+ def inside(self):
67+ return GitRepositoriesBreadcrumb(self.context.target)
68
69
70 class GitRepositoryNavigation(WebhookTargetNavigationMixin, Navigation):
71
72=== added file 'lib/lp/code/browser/tests/test_gitref.py'
73--- lib/lp/code/browser/tests/test_gitref.py 1970-01-01 00:00:00 +0000
74+++ lib/lp/code/browser/tests/test_gitref.py 2015-09-10 11:49:18 +0000
75@@ -0,0 +1,58 @@
76+# Copyright 2015 Canonical Ltd. This software is licensed under the
77+# GNU Affero General Public License version 3 (see the file LICENSE).
78+
79+"""Unit tests for GitRefView."""
80+
81+__metaclass__ = type
82+
83+import re
84+
85+import soupmatchers
86+from zope.component import getUtility
87+
88+from lp.code.interfaces.gitrepository import IGitRepositorySet
89+from lp.testing import TestCaseWithFactory
90+from lp.testing.layers import DatabaseFunctionalLayer
91+from lp.testing.views import create_view
92+
93+
94+class GitRefView(TestCaseWithFactory):
95+
96+ layer = DatabaseFunctionalLayer
97+
98+ def test_rendering(self):
99+ repository = self.factory.makeGitRepository(
100+ owner=self.factory.makePerson(name="person"),
101+ target=self.factory.makeProduct(name="target"),
102+ name=u"git")
103+ getUtility(IGitRepositorySet).setDefaultRepositoryForOwner(
104+ repository.owner, repository.target, repository, repository.owner)
105+ [ref] = self.factory.makeGitRefs(
106+ repository=repository, paths=[u"refs/heads/master"])
107+ view = create_view(ref, "+index")
108+ # To test the breadcrumbs we need a correct traversal stack.
109+ view.request.traversed_objects = [repository, ref, view]
110+ view.initialize()
111+ breadcrumbs_tag = soupmatchers.Tag(
112+ 'breadcrumbs', 'ol', attrs={'class': 'breadcrumbs'})
113+ self.assertThat(
114+ view(),
115+ soupmatchers.HTMLContains(
116+ soupmatchers.Within(
117+ breadcrumbs_tag,
118+ soupmatchers.Tag(
119+ 'git collection breadcrumb', 'a',
120+ text='Git',
121+ attrs={'href': re.compile(r'/\+git$')})),
122+ soupmatchers.Within(
123+ breadcrumbs_tag,
124+ soupmatchers.Tag(
125+ 'repository breadcrumb', 'a',
126+ text='lp:~person/target',
127+ attrs={'href': re.compile(
128+ r'/~person/target/\+git/git')})),
129+ soupmatchers.Within(
130+ breadcrumbs_tag,
131+ soupmatchers.Tag(
132+ 'git ref breadcrumb', 'li',
133+ text=re.compile(r'\smaster\s')))))