← Back to team overview

launchpad-reviewers team mailing list archive

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

 

Bayard 'kit' Randel has proposed merging lp:~blr/launchpad/project-meta-go-import into lp:launchpad with lp:~blr/launchpad/ui-project-setbranch as a prerequisite.

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

Requested reviews:
  Launchpad code reviewers (launchpad-reviewers)
Related bugs:
  Bug #1465467 in Launchpad itself: "put <meta name="go-import"> tags on project, series pages"
  https://bugs.launchpad.net/launchpad/+bug/1465467

For more details, see:
https://code.launchpad.net/~blr/launchpad/project-meta-go-import/+merge/262550

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
-- 
Your team Launchpad code reviewers is requested to review the proposed merge of lp:~blr/launchpad/project-meta-go-import into lp:launchpad.
=== modified file 'lib/lp/registry/browser/product.py'
--- lib/lp/registry/browser/product.py	2015-06-22 03:15:41 +0000
+++ lib/lp/registry/browser/product.py	2015-06-22 03:15:42 +0000
@@ -165,7 +165,7 @@
 from lp.code.interfaces.gitcollection import IGitCollection
 from lp.code.interfaces.gitrepository import IGitRepositorySet
 from lp.code.browser.vcslisting import TargetDefaultVCSNavigationMixin
-
+from lp.code.interfaces.gitrepository import IGitRepositorySet
 from lp.registry.browser import (
     add_subscribe_link,
     BaseRdfView,
@@ -221,6 +221,7 @@
     stepto,
     structured,
     )
+from lp.services.config import config
 from lp.services.webapp.authorization import check_permission
 from lp.services.webapp.batching import BatchNavigator
 from lp.services.webapp.breadcrumb import Breadcrumb
@@ -1026,6 +1027,29 @@
     def requestCountry(self):
         return ICountry(self.request, None)
 
+    @property
+    def golang_import_spec(self):
+        """Meta string for golang remote import path.
+        See: https://golang.org/cmd/go/#hdr-Remote_import_paths
+        """
+        if self.context.vcs == VCSType.GIT:
+            repo = getUtility(IGitRepositorySet).getDefaultRepository(
+                self.context)
+            if repo:
+                return "{base_url}/{product} git {git_https_url}".format(
+                    base_url=config.vhost.mainsite.hostname,
+                    product=self.context.name,
+                    git_https_url=repo.git_https_url)
+            else:
+                return None
+        elif self.context.vcs == VCSType.BZR:
+            return "{base_url}/{product} bzr {codebrowse_root}{product}".format(
+                base_url=config.vhost.mainsite.hostname,
+                product=self.context.name,
+                codebrowse_root=config.codehosting.secure_codebrowse_root)
+        else:
+            return None
+
     def browserLanguages(self):
         return browser_languages(self.request)
 

=== modified file 'lib/lp/registry/browser/productseries.py'
--- lib/lp/registry/browser/productseries.py	2015-06-22 03:15:41 +0000
+++ lib/lp/registry/browser/productseries.py	2015-06-22 03:15:42 +0000
@@ -80,11 +80,13 @@
     RegistryDeleteViewMixin,
     StatusCount,
     )
+from lp.code.interfaces.gitrepository import IGitRepositorySet
 from lp.registry.browser.pillar import (
     InvolvedMenu,
     PillarInvolvementView,
     )
 from lp.registry.browser.product import ProductSetBranchView
+from lp.registry.enums import VCSType
 from lp.registry.errors import CannotPackageProprietaryProduct
 from lp.registry.interfaces.packaging import (
     IPackaging,
@@ -92,6 +94,7 @@
     )
 from lp.registry.interfaces.productseries import IProductSeries
 from lp.registry.interfaces.series import SeriesStatus
+from lp.services.config import config
 from lp.services.propertycache import cachedproperty
 from lp.services.webapp import (
     ApplicationMenu,
@@ -379,6 +382,21 @@
         """The country associated with the IP of the request."""
         return ICountry(self.request, None)
 
+    @property
+    def golang_import_spec(self):
+        """Meta string for golang remote import path.
+        See: https://golang.org/cmd/go/#hdr-Remote_import_paths
+        """
+        if self.context.product.vcs == VCSType.BZR:
+            return ("{base_url}/{product}/{series} bzr "
+                    "{root}{product}/{series}").format(
+                        base_url=config.launchpad.non_restricted_hostname,
+                        product=self.context.product.name,
+                        root=config.codehosting.secure_codebrowse_root,
+                        series=self.context.name)
+        else:
+            return None
+
     def browserLanguages(self):
         """The languages the user's browser requested."""
         return browser_languages(self.request)

=== modified file 'lib/lp/registry/browser/tests/test_product.py'
--- lib/lp/registry/browser/tests/test_product.py	2015-06-22 03:15:41 +0000
+++ lib/lp/registry/browser/tests/test_product.py	2015-06-22 03:15:42 +0000
@@ -27,6 +27,7 @@
     PROPRIETARY_INFORMATION_TYPES,
     ServiceUsage,
     )
+from lp.code.interfaces.gitrepository import IGitRepositorySet
 from lp.registry.browser.product import (
     ProjectAddStepOne,
     ProjectAddStepTwo,
@@ -295,6 +296,40 @@
         super(TestProductView, self).setUp()
         self.product = self.factory.makeProduct(name='fnord')
 
+    def test_golang_meta_renders_git(self):
+        # ensure golang meta import path is rendered if project has
+        # git default vcs.
+        # See: https://golang.org/cmd/go/#hdr-Remote_import_paths
+        repo = self.factory.makeGitRepository()
+        view = create_initialized_view(repo.target, '+index')
+        with person_logged_in(repo.target.owner):
+            getUtility(IGitRepositorySet).setDefaultRepository(
+                target=repo.target, repository=repo)
+            repo.target.vcs = VCSType.GIT
+
+        golang_import = '{base}/{product_name} git {repo_url}'.format(
+            base=config.vhost.mainsite.hostname,
+            product_name=repo.target.name,
+            repo_url=repo.git_https_url
+            )
+        self.assertEqual(golang_import, view.golang_import_spec)
+
+    def test_golang_meta_renders_bzr(self):
+        # ensure golang meta import path is rendered if project has
+        # bzr default vcs.
+        # See: https://golang.org/cmd/go/#hdr-Remote_import_paths
+        branch = self.factory.makeBranch()
+        view = create_initialized_view(branch.product, '+index')
+        with person_logged_in(branch.product.owner):
+            branch.product.vcs = VCSType.BZR
+
+        golang_import = '{base}/{name} bzr {repo_url}{name}'.format(
+            base=config.vhost.mainsite.hostname,
+            name=branch.target.name,
+            repo_url=config.codehosting.secure_codebrowse_root
+            )
+        self.assertEqual(golang_import, view.golang_import_spec)
+
     def test_show_programming_languages_without_languages(self):
         # show_programming_languages is false when there are no programming
         # languages set.

=== modified file 'lib/lp/registry/browser/tests/test_productseries_views.py'
--- lib/lp/registry/browser/tests/test_productseries_views.py	2013-04-03 03:09:04 +0000
+++ lib/lp/registry/browser/tests/test_productseries_views.py	2015-06-22 03:15:42 +0000
@@ -8,6 +8,7 @@
 
 import soupmatchers
 from testtools.matchers import Not
+from zope.component import getUtility
 from zope.security.proxy import removeSecurityProxy
 
 from lp.app.enums import InformationType
@@ -15,6 +16,9 @@
     BugTaskStatus,
     BugTaskStatusSearch,
     )
+from lp.code.interfaces.gitrepository import IGitRepositorySet
+from lp.registry.enums import VCSType
+from lp.services.config import config
 from lp.services.webapp import canonical_url
 from lp.testing import (
     BrowserTestCase,
@@ -30,6 +34,24 @@
 
     layer = DatabaseFunctionalLayer
 
+    def test_golang_meta_renders(self):
+        # ensure golang meta import path is rendered if project has
+        # bzr default vcs.
+        # See: https://golang.org/cmd/go/#hdr-Remote_import_paths
+        branch = self.factory.makeBranch()
+        view = create_initialized_view(branch.product.development_focus,
+                                       '+index')
+        with person_logged_in(branch.product.owner):
+            branch.product.vcs = VCSType.BZR
+
+        golang_import = ("{base}/{name}/{series} bzr "
+                         "{repo_url}{name}/{series}").format(
+                             base=config.vhost.mainsite.hostname,
+                             name=branch.product.name,
+                             repo_url=config.codehosting.secure_codebrowse_root,
+                             series=branch.product.development_focus.name)
+        self.assertEqual(golang_import, view.golang_import_spec)
+
     def test_information_type_public(self):
         # A ProductSeries view should include its information_type,
         # which defaults to Public for new projects.

=== modified file 'lib/lp/registry/templates/product-index.pt'
--- lib/lp/registry/templates/product-index.pt	2015-06-22 03:15:41 +0000
+++ lib/lp/registry/templates/product-index.pt	2015-06-22 03:15:42 +0000
@@ -25,6 +25,9 @@
           });
       </script>
     </tal:uses_launchpad_bugtracker>
+
+    <meta name="go-import" tal:condition="view/golang_import_spec"
+          tal:attributes="content view/golang_import_spec" />
   </tal:head-epilogue>
 </head>
 

=== modified file 'lib/lp/registry/templates/productseries-index.pt'
--- lib/lp/registry/templates/productseries-index.pt	2012-10-16 15:12:09 +0000
+++ lib/lp/registry/templates/productseries-index.pt	2015-06-22 03:15:42 +0000
@@ -25,6 +25,8 @@
           });
       </script>
     </tal:uses_launchpad_bugtracker>
+    <meta name="go-import" tal:condition="view/golang_import_spec"
+          tal:attributes="content view/golang_import_spec" />
   </metal:block>
 
     <tal:heading metal:fill-slot="heading">


Follow ups