← Back to team overview

launchpad-reviewers team mailing list archive

[Merge] lp:~cjwatson/launchpad/snap-source-tarball into lp:launchpad

 

Colin Watson has proposed merging lp:~cjwatson/launchpad/snap-source-tarball into lp:launchpad.

Commit message:
Add an option to build source tarballs for snaps.

Requested reviews:
  Launchpad code reviewers (launchpad-reviewers)
Related bugs:
  Bug #1763639 in Launchpad itself: "Recovery tarballs for snap builds"
  https://bugs.launchpad.net/launchpad/+bug/1763639

For more details, see:
https://code.launchpad.net/~cjwatson/launchpad/snap-source-tarball/+merge/343727

See https://code.launchpad.net/~cjwatson/launchpad-buildd/snap-source-tarball/+merge/343721 and https://code.launchpad.net/~cjwatson/launchpad/db-snap-source-tarball/+merge/343726.
-- 
Your team Launchpad code reviewers is requested to review the proposed merge of lp:~cjwatson/launchpad/snap-source-tarball into lp:launchpad.
=== modified file 'lib/lp/snappy/browser/snap.py'
--- lib/lp/snappy/browser/snap.py	2018-04-04 13:28:28 +0000
+++ lib/lp/snappy/browser/snap.py	2018-04-20 19:38:01 +0000
@@ -320,6 +320,7 @@
         'private',
         'require_virtualized',
         'allow_internet',
+        'source_tarball',
         'auto_build',
         'store_upload',
         ])
@@ -374,6 +375,7 @@
         'owner',
         'name',
         'store_distro_series',
+        'source_tarball',
         'auto_build',
         'auto_build_archive',
         'auto_build_pocket',
@@ -511,6 +513,7 @@
             auto_build_archive=data['auto_build_archive'],
             auto_build_pocket=data['auto_build_pocket'],
             processors=data['processors'], private=private,
+            source_tarball=data['source_tarball'],
             store_upload=data['store_upload'],
             store_series=data['store_distro_series'].snappy_series,
             store_name=data['store_name'],
@@ -681,6 +684,7 @@
         'vcs',
         'branch',
         'git_ref',
+        'source_tarball',
         'auto_build',
         'auto_build_archive',
         'auto_build_pocket',

=== modified file 'lib/lp/snappy/browser/tests/test_snap.py'
--- lib/lp/snappy/browser/tests/test_snap.py	2018-04-04 14:14:30 +0000
+++ lib/lp/snappy/browser/tests/test_snap.py	2018-04-20 19:38:01 +0000
@@ -243,6 +243,11 @@
             "Source:\n%s\nEdit snap package" % source_display,
             MatchesTagText(content, "source"))
         self.assertThat(
+            "Source tarball:\n"
+            "Builds of this snap package will not build a source tarball.\n"
+            "Edit snap package",
+            MatchesTagText(content, "source_tarball"))
+        self.assertThat(
             "Build schedule:\n(?)\nBuilt on request\nEdit snap package\n",
             MatchesTagText(content, "auto_build"))
         self.assertThat(
@@ -277,6 +282,11 @@
             "Source:\n%s\nEdit snap package" % source_display,
             MatchesTagText(content, "source"))
         self.assertThat(
+            "Source tarball:\n"
+            "Builds of this snap package will not build a source tarball.\n"
+            "Edit snap package",
+            MatchesTagText(content, "source_tarball"))
+        self.assertThat(
             "Build schedule:\n(?)\nBuilt on request\nEdit snap package\n",
             MatchesTagText(content, "auto_build"))
         self.assertThat(
@@ -355,6 +365,22 @@
             extract_text(find_tag_by_id(browser.contents, "privacy"))
         )
 
+    def test_create_new_snap_source_tarball(self):
+        # We can create a new snap and ask for it to build a source tarball.
+        branch = self.factory.makeAnyBranch()
+        browser = self.getViewBrowser(
+            branch, view_name="+new-snap", user=self.person)
+        browser.getControl(name="field.name").value = "snap-name"
+        browser.getControl("Build source tarball").selected = True
+        browser.getControl("Create snap package").click()
+
+        content = find_main_content(browser.contents)
+        self.assertThat(
+            "Source tarball:\n"
+            "Builds of this snap package will also build a source tarball.\n"
+            "Edit snap package",
+            MatchesTagText(content, "source_tarball"))
+
     def test_create_new_snap_auto_build(self):
         # Creating a new snap and asking for it to be automatically built
         # sets all the appropriate fields.
@@ -686,6 +712,7 @@
         browser.getControl("Git repository").value = (
             new_git_ref.repository.identity)
         browser.getControl("Git branch").value = new_git_ref.path
+        browser.getControl("Build source tarball").selected = True
         browser.getControl(
             "Automatically build when branch changes").selected = True
         browser.getControl("PPA").click()
@@ -705,6 +732,11 @@
             "Source:\n%s\nEdit snap package" % new_git_ref.display_name,
             MatchesTagText(content, "source"))
         self.assertThat(
+            "Source tarball:\n"
+            "Builds of this snap package will also build a source tarball.\n"
+            "Edit snap package",
+            MatchesTagText(content, "source_tarball"))
+        self.assertThat(
             "Build schedule:\n(?)\nBuilt automatically\nEdit snap package\n",
             MatchesTagText(content, "auto_build"))
         self.assertThat(
@@ -1223,6 +1255,8 @@
             Owner: Test Person
             Distribution series: Ubuntu Shiny
             Source: lp://dev/~test-person/\\+junk/snap-branch
+            Source tarball:
+            Builds of this snap package will not build a source tarball.
             Build schedule: \(\?\)
             Built on request
             Source archive for automatic builds:
@@ -1250,6 +1284,8 @@
             Owner: Test Person
             Distribution series: Ubuntu Shiny
             Source: ~test-person/\\+git/snap-repository:master
+            Source tarball:
+            Builds of this snap package will not build a source tarball.
             Build schedule: \(\?\)
             Built on request
             Source archive for automatic builds:
@@ -1277,6 +1313,8 @@
             Owner: Test Person
             Distribution series: Ubuntu Shiny
             Source: https://git.example.org/foo master
+            Source tarball:
+            Builds of this snap package will not build a source tarball.
             Build schedule: \(\?\)
             Built on request
             Source archive for automatic builds:

=== modified file 'lib/lp/snappy/interfaces/snap.py'
--- lib/lp/snappy/interfaces/snap.py	2018-04-15 16:23:14 +0000
+++ lib/lp/snappy/interfaces/snap.py	2018-04-20 19:38:01 +0000
@@ -498,6 +498,13 @@
             "The Git branch containing a snap/snapcraft.yaml, snapcraft.yaml, "
             "or .snapcraft.yaml recipe at the top level.")))
 
+    source_tarball = exported(Bool(
+        title=_("Build source tarball"),
+        required=True, readonly=False,
+        description=_(
+            "Whether builds of this snap package should also build a tarball "
+            "containing all source code, including external dependencies.")))
+
     auto_build = exported(Bool(
         title=_("Automatically build when branch changes"),
         required=True, readonly=False,

=== modified file 'lib/lp/snappy/model/snap.py'
--- lib/lp/snappy/model/snap.py	2018-04-04 14:14:30 +0000
+++ lib/lp/snappy/model/snap.py	2018-04-20 19:38:01 +0000
@@ -200,6 +200,8 @@
 
     allow_internet = Bool(name='allow_internet', allow_none=False)
 
+    source_tarball = Bool(name='source_tarball', allow_none=False)
+
     store_upload = Bool(name='store_upload', allow_none=False)
 
     store_series_id = Int(name='store_series', allow_none=True)
@@ -216,8 +218,8 @@
                  auto_build_archive=None, auto_build_pocket=None,
                  auto_build_channels=None, require_virtualized=True,
                  date_created=DEFAULT, private=False, allow_internet=True,
-                 store_upload=False, store_series=None, store_name=None,
-                 store_secrets=None, store_channels=None):
+                 source_tarball=False, store_upload=False, store_series=None,
+                 store_name=None, store_secrets=None, store_channels=None):
         """Construct a `Snap`."""
         super(Snap, self).__init__()
         self.registrant = registrant
@@ -236,6 +238,7 @@
         self.date_last_modified = date_created
         self.private = private
         self.allow_internet = allow_internet
+        self.source_tarball = source_tarball
         self.store_upload = store_upload
         self.store_series = store_series
         self.store_name = store_name
@@ -672,8 +675,9 @@
             auto_build_archive=None, auto_build_pocket=None,
             auto_build_channels=None, require_virtualized=True,
             processors=None, date_created=DEFAULT, private=False,
-            allow_internet=True, store_upload=False, store_series=None,
-            store_name=None, store_secrets=None, store_channels=None):
+            allow_internet=True, source_tarball=False, store_upload=False,
+            store_series=None, store_name=None, store_secrets=None,
+            store_channels=None):
         """See `ISnapSet`."""
         if not registrant.inTeam(owner):
             if owner.is_team:
@@ -717,9 +721,9 @@
             auto_build_channels=auto_build_channels,
             require_virtualized=require_virtualized, date_created=date_created,
             private=private, allow_internet=allow_internet,
-            store_upload=store_upload, store_series=store_series,
-            store_name=store_name, store_secrets=store_secrets,
-            store_channels=store_channels)
+            source_tarball=source_tarball, store_upload=store_upload,
+            store_series=store_series, store_name=store_name,
+            store_secrets=store_secrets, store_channels=store_channels)
         store.add(snap)
 
         if processors is None:

=== modified file 'lib/lp/snappy/model/snapbuildbehaviour.py'
--- lib/lp/snappy/model/snapbuildbehaviour.py	2018-04-04 14:14:30 +0000
+++ lib/lp/snappy/model/snapbuildbehaviour.py	2018-04-20 19:38:01 +0000
@@ -132,6 +132,7 @@
             raise CannotBuild(
                 "Source branch/repository for ~%s/%s has been deleted." %
                 (build.snap.owner.name, build.snap.name))
+        args["source_tarball"] = build.snap.source_tarball
         defer.returnValue(args)
 
     @defer.inlineCallbacks

=== modified file 'lib/lp/snappy/templates/snap-edit.pt'
--- lib/lp/snappy/templates/snap-edit.pt	2017-03-27 19:28:36 +0000
+++ lib/lp/snappy/templates/snap-edit.pt	2018-04-20 19:38:01 +0000
@@ -60,6 +60,10 @@
           </td>
         </tr>
 
+        <tal:widget define="widget nocall:view/widgets/source_tarball">
+          <metal:block use-macro="context/@@launchpad_form/widget_row" />
+        </tal:widget>
+
         <tal:widget define="widget nocall:view/widgets/auto_build">
           <metal:block use-macro="context/@@launchpad_form/widget_row" />
         </tal:widget>

=== modified file 'lib/lp/snappy/templates/snap-index.pt'
--- lib/lp/snappy/templates/snap-index.pt	2017-01-04 20:52:12 +0000
+++ lib/lp/snappy/templates/snap-index.pt	2018-04-20 19:38:01 +0000
@@ -61,6 +61,19 @@
           <a tal:replace="structure view/menu:overview/edit/fmt:icon"/>
         </dd>
       </dl>
+      <dl id="source_tarball"
+          tal:define="source_tarball context/source_tarball">
+        <dt>Source tarball:</dt>
+        <dd>
+          <span tal:condition="source_tarball">
+            Builds of this snap package will also build a source tarball.
+          </span>
+          <span tal:condition="not: source_tarball">
+            Builds of this snap package will not build a source tarball.
+          </span>
+          <a tal:replace="structure view/menu:overview/edit/fmt:icon"/>
+        </dd>
+      </dl>
 
       <dl id="auto_build">
         <dt>Build schedule:

=== modified file 'lib/lp/snappy/templates/snap-new.pt'
--- lib/lp/snappy/templates/snap-new.pt	2017-03-27 19:28:36 +0000
+++ lib/lp/snappy/templates/snap-new.pt	2018-04-20 19:38:01 +0000
@@ -35,6 +35,9 @@
         <tal:widget define="widget nocall:view/widgets/processors">
           <metal:block use-macro="context/@@launchpad_form/widget_row" />
         </tal:widget>
+        <tal:widget define="widget nocall:view/widgets/source_tarball">
+          <metal:block use-macro="context/@@launchpad_form/widget_row" />
+        </tal:widget>
 
         <tal:widget define="widget nocall:view/widgets/auto_build">
           <metal:block use-macro="context/@@launchpad_form/widget_row" />

=== modified file 'lib/lp/snappy/tests/test_snap.py'
--- lib/lp/snappy/tests/test_snap.py	2018-04-15 16:23:14 +0000
+++ lib/lp/snappy/tests/test_snap.py	2018-04-20 19:38:01 +0000
@@ -654,6 +654,7 @@
         self.assertTrue(snap.require_virtualized)
         self.assertFalse(snap.private)
         self.assertTrue(snap.allow_internet)
+        self.assertFalse(snap.source_tarball)
 
     def test_creation_git(self):
         # The metadata entries supplied when a Snap is created for a Git
@@ -676,6 +677,7 @@
         self.assertTrue(snap.require_virtualized)
         self.assertFalse(snap.private)
         self.assertTrue(snap.allow_internet)
+        self.assertFalse(snap.source_tarball)
 
     def test_creation_git_url(self):
         # A Snap can be backed directly by a URL for an external Git
@@ -1381,6 +1383,7 @@
             self.assertIsNone(snap["git_ref_link"])
             self.assertTrue(snap["require_virtualized"])
             self.assertTrue(snap["allow_internet"])
+            self.assertFalse(snap["source_tarball"])
 
     def test_new_git(self):
         # Ensure Snap creation based on a Git branch works.
@@ -1402,6 +1405,7 @@
             self.assertEqual(self.getURL(ref), snap["git_ref_link"])
             self.assertTrue(snap["require_virtualized"])
             self.assertTrue(snap["allow_internet"])
+            self.assertFalse(snap["source_tarball"])
 
     def test_new_private(self):
         # Ensure private Snap creation works.

=== modified file 'lib/lp/snappy/tests/test_snapbuildbehaviour.py'
--- lib/lp/snappy/tests/test_snapbuildbehaviour.py	2018-04-04 14:14:30 +0000
+++ lib/lp/snappy/tests/test_snapbuildbehaviour.py	2018-04-20 19:38:01 +0000
@@ -283,6 +283,7 @@
             "proxy_url": self.proxy_url,
             "revocation_endpoint": self.revocation_endpoint,
             "series": "unstable",
+            "source_tarball": False,
             "trusted_keys": expected_trusted_keys,
             }, args)
 
@@ -307,6 +308,7 @@
             "proxy_url": self.proxy_url,
             "revocation_endpoint": self.revocation_endpoint,
             "series": "unstable",
+            "source_tarball": False,
             "trusted_keys": expected_trusted_keys,
             }, args)
 
@@ -331,6 +333,7 @@
             "proxy_url": self.proxy_url,
             "revocation_endpoint": self.revocation_endpoint,
             "series": "unstable",
+            "source_tarball": False,
             "trusted_keys": expected_trusted_keys,
             }, args)
 
@@ -357,6 +360,7 @@
             "proxy_url": self.proxy_url,
             "revocation_endpoint": self.revocation_endpoint,
             "series": "unstable",
+            "source_tarball": False,
             "trusted_keys": expected_trusted_keys,
             }, args)
 
@@ -381,6 +385,7 @@
             "proxy_url": self.proxy_url,
             "revocation_endpoint": self.revocation_endpoint,
             "series": "unstable",
+            "source_tarball": False,
             "trusted_keys": expected_trusted_keys,
             }, args)
 
@@ -414,6 +419,7 @@
         self.assertFalse(isProxy(args["channels"]))
         self.assertEqual({"snapcraft": "edge"}, args["channels"])
 
+    @defer.inlineCallbacks
     def test_extraBuildArgs_disallow_internet(self):
         # If external network access is not allowed for the snap,
         # _extraBuildArgs does not dispatch a proxy token.
@@ -423,6 +429,14 @@
         self.assertNotIn("revocation_endpoint", args)
 
     @defer.inlineCallbacks
+    def test_extraBuildArgs_source_tarball(self):
+        # If the snap requests building of a source tarball, _extraBuildArgs
+        # sends the appropriate arguments.
+        job = self.makeJob(source_tarball=True)
+        args = yield job._extraBuildArgs()
+        self.assertTrue(args["source_tarball"])
+
+    @defer.inlineCallbacks
     def test_composeBuildRequest_proxy_url_set(self):
         job = self.makeJob()
         build_request = yield job.composeBuildRequest(None)

=== modified file 'lib/lp/testing/factory.py'
--- lib/lp/testing/factory.py	2018-04-04 14:14:30 +0000
+++ lib/lp/testing/factory.py	2018-04-20 19:38:01 +0000
@@ -4673,8 +4673,8 @@
                  auto_build_channels=None, is_stale=None,
                  require_virtualized=True, processors=None,
                  date_created=DEFAULT, private=False, allow_internet=True,
-                 store_upload=False, store_series=None, store_name=None,
-                 store_secrets=None, store_channels=None):
+                 source_tarball=False, store_upload=False, store_series=None,
+                 store_name=None, store_secrets=None, store_channels=None):
         """Make a new Snap."""
         if registrant is None:
             registrant = self.makePerson()
@@ -4699,9 +4699,10 @@
             auto_build=auto_build, auto_build_archive=auto_build_archive,
             auto_build_pocket=auto_build_pocket,
             auto_build_channels=auto_build_channels, private=private,
-            allow_internet=allow_internet, store_upload=store_upload,
-            store_series=store_series, store_name=store_name,
-            store_secrets=store_secrets, store_channels=store_channels)
+            allow_internet=allow_internet, source_tarball=source_tarball,
+            store_upload=store_upload, store_series=store_series,
+            store_name=store_name, store_secrets=store_secrets,
+            store_channels=store_channels)
         if is_stale is not None:
             removeSecurityProxy(snap).is_stale = is_stale
         IStore(snap).flush()


Follow ups