launchpad-reviewers team mailing list archive
-
launchpad-reviewers team
-
Mailing list archive
-
Message #22405
[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