Merge lp:~blr/launchpad/project-meta-go-import into lp:launchpad

Proposed by Kit Randel on 2015-06-21
Status: Merged
Merged at revision: 17598
Proposed branch: lp:~blr/launchpad/project-meta-go-import
Merge into: lp:launchpad
Prerequisite: lp:~blr/launchpad/ui-project-setbranch
Diff against target: 270 lines (+154/-2)
6 files modified
lib/lp/registry/browser/product.py (+27/-1)
lib/lp/registry/browser/productseries.py (+16/-1)
lib/lp/registry/browser/tests/test_product.py (+76/-0)
lib/lp/registry/browser/tests/test_productseries_views.py (+30/-0)
lib/lp/registry/templates/product-index.pt (+3/-0)
lib/lp/registry/templates/productseries-index.pt (+2/-0)
To merge this branch: bzr merge lp:~blr/launchpad/project-meta-go-import
Reviewer Review Type Date Requested Status
William Grant code 2015-06-21 Approve on 2015-07-02
Review via email: mp+262550@code.launchpad.net

This proposal supersedes a proposal from 2015-06-16.

Commit Message

Add a go-lang remote import meta tag for git and bzr support.

Description of the Change

Provides a meta tag with default git repository and bzr branch metadata on Project +index/ProductSeries +index for golang's `go get`.

See: https://golang.org/cmd/go/#hdr-Remote_import_paths

To post a comment you must log in.
William Grant (wgrant) :
review: Needs Fixing (code)
William Grant (wgrant) wrote :

There are a few assertEquals against None that should be assertIs.

review: Approve (code)

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'lib/lp/registry/browser/product.py'
2--- lib/lp/registry/browser/product.py 2015-07-02 01:50:50 +0000
3+++ lib/lp/registry/browser/product.py 2015-07-02 07:06:37 +0000
4@@ -161,7 +161,7 @@
5 )
6 from lp.code.interfaces.gitrepository import IGitRepositorySet
7 from lp.code.browser.vcslisting import TargetDefaultVCSNavigationMixin
8-
9+from lp.code.interfaces.gitrepository import IGitRepositorySet
10 from lp.registry.browser import (
11 add_subscribe_link,
12 BaseRdfView,
13@@ -217,6 +217,7 @@
14 stepto,
15 structured,
16 )
17+from lp.services.config import config
18 from lp.services.webapp.authorization import check_permission
19 from lp.services.webapp.batching import BatchNavigator
20 from lp.services.webapp.breadcrumb import Breadcrumb
21@@ -1022,6 +1023,31 @@
22 def requestCountry(self):
23 return ICountry(self.request, None)
24
25+ @property
26+ def golang_import_spec(self):
27+ """Meta string for golang remote import path.
28+ See: https://golang.org/cmd/go/#hdr-Remote_import_paths
29+ """
30+ if self.context.vcs == VCSType.GIT:
31+ repo = getUtility(IGitRepositorySet).getDefaultRepository(
32+ self.context)
33+ if repo:
34+ return "{base_url}/{product} git {git_https_url}".format(
35+ base_url=config.vhost.mainsite.hostname,
36+ product=self.context.name,
37+ git_https_url=repo.git_https_url)
38+ else:
39+ return None
40+ elif (self.context.vcs == VCSType.BZR and
41+ self.context.development_focus.branch):
42+ return ("{base_url}/{name} bzr "
43+ "{browse_root}{name}").format(
44+ base_url=config.vhost.mainsite.hostname,
45+ name=self.context.development_focus.branch.unique_name,
46+ browse_root=config.codehosting.supermirror_root)
47+ else:
48+ return None
49+
50 def browserLanguages(self):
51 return browser_languages(self.request)
52
53
54=== modified file 'lib/lp/registry/browser/productseries.py'
55--- lib/lp/registry/browser/productseries.py 2015-06-25 00:33:52 +0000
56+++ lib/lp/registry/browser/productseries.py 2015-07-02 07:06:37 +0000
57@@ -71,7 +71,6 @@
58 )
59 from lp.bugs.interfaces.bugtask import IBugTaskSet
60 from lp.code.browser.branchref import BranchRef
61-from lp.code.enums import RevisionControlSystems
62 from lp.code.interfaces.branchtarget import IBranchTarget
63 from lp.registry.browser import (
64 add_subscribe_link,
65@@ -85,6 +84,7 @@
66 PillarInvolvementView,
67 )
68 from lp.registry.browser.product import ProductSetBranchView
69+from lp.registry.enums import VCSType
70 from lp.registry.errors import CannotPackageProprietaryProduct
71 from lp.registry.interfaces.packaging import (
72 IPackaging,
73@@ -92,6 +92,7 @@
74 )
75 from lp.registry.interfaces.productseries import IProductSeries
76 from lp.registry.interfaces.series import SeriesStatus
77+from lp.services.config import config
78 from lp.services.propertycache import cachedproperty
79 from lp.services.webapp import (
80 ApplicationMenu,
81@@ -379,6 +380,20 @@
82 """The country associated with the IP of the request."""
83 return ICountry(self.request, None)
84
85+ @property
86+ def golang_import_spec(self):
87+ """Meta string for golang remote import path.
88+ See: https://golang.org/cmd/go/#hdr-Remote_import_paths
89+ """
90+ if (self.context.product.vcs == VCSType.BZR and
91+ self.context.product.development_focus.branch):
92+ return ("{base_url}/{name} bzr {root}{name}").format(
93+ base_url=config.vhost.mainsite.hostname,
94+ name=self.context.branch.unique_name,
95+ root=config.codehosting.supermirror_root)
96+ else:
97+ return None
98+
99 def browserLanguages(self):
100 """The languages the user's browser requested."""
101 return browser_languages(self.request)
102
103=== modified file 'lib/lp/registry/browser/tests/test_product.py'
104--- lib/lp/registry/browser/tests/test_product.py 2015-07-02 01:50:50 +0000
105+++ lib/lp/registry/browser/tests/test_product.py 2015-07-02 07:06:37 +0000
106@@ -27,6 +27,7 @@
107 PROPRIETARY_INFORMATION_TYPES,
108 ServiceUsage,
109 )
110+from lp.code.interfaces.gitrepository import IGitRepositorySet
111 from lp.registry.browser.product import (
112 ProjectAddStepOne,
113 ProjectAddStepTwo,
114@@ -295,6 +296,81 @@
115 super(TestProductView, self).setUp()
116 self.product = self.factory.makeProduct(name='fnord')
117
118+ def test_golang_meta_renders_git(self):
119+ # ensure golang meta import path is rendered if project has
120+ # git default vcs.
121+ # See: https://golang.org/cmd/go/#hdr-Remote_import_paths
122+ repo = self.factory.makeGitRepository()
123+ view = create_initialized_view(repo.target, '+index')
124+ with person_logged_in(repo.target.owner):
125+ getUtility(IGitRepositorySet).setDefaultRepository(
126+ target=repo.target, repository=repo)
127+ repo.target.vcs = VCSType.GIT
128+
129+ golang_import = '{base}/{product_name} git {repo_url}'.format(
130+ base=config.vhost.mainsite.hostname,
131+ product_name=repo.target.name,
132+ repo_url=repo.git_https_url
133+ )
134+ self.assertEqual(golang_import, view.golang_import_spec)
135+ meta_tag = Tag('go-import-meta', 'meta',
136+ attrs={'name': 'go-import', 'content': golang_import})
137+ browser = self.getViewBrowser(repo.target, '+index',
138+ user=repo.target.owner)
139+ self.assertThat(browser.contents, HTMLContains(meta_tag))
140+
141+ def test_golang_meta_renders_bzr(self):
142+ # ensure golang meta import path is rendered if project has
143+ # bzr default vcs.
144+ # See: https://golang.org/cmd/go/#hdr-Remote_import_paths
145+ owner = self.factory.makePerson(name='zardoz')
146+ product = self.factory.makeProduct(name='wapcaplet')
147+ branch = self.factory.makeBranch(product=product, name='a-branch',
148+ owner=owner)
149+ view = create_initialized_view(branch.product, '+index')
150+
151+ with person_logged_in(branch.product.owner):
152+ branch.product.development_focus.branch = branch
153+ branch.product.vcs = VCSType.BZR
154+
155+ golang_import = (
156+ "{base}/~zardoz/wapcaplet/a-branch bzr "
157+ "{root}~zardoz/wapcaplet/a-branch").format(
158+ base=config.vhost.mainsite.hostname,
159+ root=config.codehosting.supermirror_root
160+ )
161+ self.assertEqual(golang_import, view.golang_import_spec)
162+ meta_tag = Tag('go-import-meta', 'meta',
163+ attrs={'name': 'go-import', 'content': golang_import})
164+ browser = self.getViewBrowser(branch.product, '+index',
165+ user=branch.owner)
166+ self.assertThat(browser.contents, HTMLContains(meta_tag))
167+
168+ def test_golang_meta_no_default_vcs(self):
169+ # ensure golang meta import path is not rendered without
170+ # a default vcs
171+ branch = self.factory.makeBranch()
172+ view = create_initialized_view(branch.product, '+index')
173+ self.assertIsNone(view.golang_import_spec)
174+
175+ def test_golang_meta_no_default_branch(self):
176+ # ensure golang meta import path is not rendered without
177+ # a product development_focus.
178+ branch = self.factory.makeBranch()
179+ view = create_initialized_view(branch.product, '+index')
180+ with person_logged_in(branch.product.owner):
181+ branch.product.vcs = VCSType.BZR
182+ self.assertIsNone(view.golang_import_spec)
183+
184+ def test_golang_meta_no_default_repo(self):
185+ # ensure golang meta import path is not rendered without
186+ # a default repo.
187+ repo = self.factory.makeGitRepository()
188+ view = create_initialized_view(repo.target, '+index')
189+ with person_logged_in(repo.target.owner):
190+ repo.target.vcs = VCSType.GIT
191+ self.assertIsNone(view.golang_import_spec)
192+
193 def test_show_programming_languages_without_languages(self):
194 # show_programming_languages is false when there are no programming
195 # languages set.
196
197=== modified file 'lib/lp/registry/browser/tests/test_productseries_views.py'
198--- lib/lp/registry/browser/tests/test_productseries_views.py 2013-04-03 03:09:04 +0000
199+++ lib/lp/registry/browser/tests/test_productseries_views.py 2015-07-02 07:06:37 +0000
200@@ -15,6 +15,8 @@
201 BugTaskStatus,
202 BugTaskStatusSearch,
203 )
204+from lp.registry.enums import VCSType
205+from lp.services.config import config
206 from lp.services.webapp import canonical_url
207 from lp.testing import (
208 BrowserTestCase,
209@@ -30,6 +32,34 @@
210
211 layer = DatabaseFunctionalLayer
212
213+ def test_golang_meta_renders(self):
214+ # ensure golang meta import path is rendered if project has
215+ # bzr default vcs.
216+ # See: https://golang.org/cmd/go/#hdr-Remote_import_paths
217+ owner = self.factory.makePerson(name='zardoz')
218+ product = self.factory.makeProduct(name='wapcaplet')
219+ branch = self.factory.makeBranch(product=product, name='a-branch',
220+ owner=owner)
221+ view = create_initialized_view(branch.product.development_focus,
222+ '+index')
223+ with person_logged_in(branch.product.owner):
224+ branch.product.development_focus.branch = branch
225+ branch.product.vcs = VCSType.BZR
226+
227+ golang_import = (
228+ "{base}/~zardoz/wapcaplet/a-branch bzr "
229+ "{root}~zardoz/wapcaplet/a-branch").format(
230+ base=config.vhost.mainsite.hostname,
231+ root=config.codehosting.supermirror_root
232+ )
233+ self.assertEqual(golang_import, view.golang_import_spec)
234+ meta_tag = soupmatchers.Tag('go-import-meta', 'meta',
235+ attrs={'name': 'go-import',
236+ 'content': golang_import})
237+ browser = self.getViewBrowser(branch.product.development_focus,
238+ '+index', user=branch.owner)
239+ self.assertThat(browser.contents, soupmatchers.HTMLContains(meta_tag))
240+
241 def test_information_type_public(self):
242 # A ProductSeries view should include its information_type,
243 # which defaults to Public for new projects.
244
245=== modified file 'lib/lp/registry/templates/product-index.pt'
246--- lib/lp/registry/templates/product-index.pt 2015-06-19 01:10:52 +0000
247+++ lib/lp/registry/templates/product-index.pt 2015-07-02 07:06:37 +0000
248@@ -25,6 +25,9 @@
249 });
250 </script>
251 </tal:uses_launchpad_bugtracker>
252+
253+ <meta name="go-import" tal:condition="view/golang_import_spec"
254+ tal:attributes="content view/golang_import_spec" />
255 </tal:head-epilogue>
256 </head>
257
258
259=== modified file 'lib/lp/registry/templates/productseries-index.pt'
260--- lib/lp/registry/templates/productseries-index.pt 2012-10-16 15:12:09 +0000
261+++ lib/lp/registry/templates/productseries-index.pt 2015-07-02 07:06:37 +0000
262@@ -25,6 +25,8 @@
263 });
264 </script>
265 </tal:uses_launchpad_bugtracker>
266+ <meta name="go-import" tal:condition="view/golang_import_spec"
267+ tal:attributes="content view/golang_import_spec" />
268 </metal:block>
269
270 <tal:heading metal:fill-slot="heading">