summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLars Wirzenius <lars.wirzenius@codethink.co.uk>2013-08-09 10:17:39 +0000
committerLars Wirzenius <lars.wirzenius@codethink.co.uk>2013-08-09 10:17:39 +0000
commit82cb8f46e5283f97e9a110adff8a49a60bcdb497 (patch)
tree1c64a0ee2fda50c73adf2ee5c07d02fb7e37a3a6
parent3a87d9f94b8d30f6e988c790d23789a3e0bb56c0 (diff)
parentedc50cf457a92575a22e202e648d64b0ef1a3527 (diff)
downloaddefinitions-82cb8f46e5283f97e9a110adff8a49a60bcdb497.tar.gz
Merge remote-tracking branch 'origin/baserock/richardmaw/S8532/validate-stratum-build-depends'
-rw-r--r--morphlib/builder2.py9
-rw-r--r--morphlib/morphologyfactory.py41
-rw-r--r--morphlib/morphologyfactory_tests.py77
-rwxr-xr-xtests/setup1
-rwxr-xr-xtests/show-dependencies.setup24
5 files changed, 137 insertions, 15 deletions
diff --git a/morphlib/builder2.py b/morphlib/builder2.py
index daf50b56..e1eaaa86 100644
--- a/morphlib/builder2.py
+++ b/morphlib/builder2.py
@@ -469,8 +469,6 @@ class StratumBuilder(BuilderBase):
with self.build_watch('overall-build'):
constituents = [d for d in self.artifact.dependencies
if self.is_constituent(d)]
- if len(constituents) == 0:
- raise EmptyStratumError(self.artifact.name)
# the only reason the StratumBuilder has to download chunks is to
# check for overlap now that strata are lists of chunks
@@ -707,10 +705,3 @@ class Builder(object): # pragma: no cover
built_artifacts = o.build_and_cache()
logging.debug('Builder.build: done')
return built_artifacts
-
-
-class EmptyStratumError(cliapp.AppException):
-
- def __init__(self, stratum_name): # pragma: no cover
- cliapp.AppException.__init__(self,
- "Stratum %s is empty (has no dependencies)" % stratum_name)
diff --git a/morphlib/morphologyfactory.py b/morphlib/morphologyfactory.py
index d0d9ea04..ae5a4332 100644
--- a/morphlib/morphologyfactory.py
+++ b/morphlib/morphologyfactory.py
@@ -36,6 +36,31 @@ class NotcachedError(MorphologyFactoryError):
"remote cache specified" % repo_name)
+class StratumError(MorphologyFactoryError):
+ pass
+
+
+class NoChunkBuildDependsError(StratumError):
+ def __init__(self, stratum, chunk):
+ StratumError.__init__(
+ self, 'No build dependencies in stratum %s for chunk %s '
+ '(build-depends is a mandatory field)' % (stratum, chunk))
+
+
+class EmptyStratumError(StratumError):
+
+ def __init__(self, stratum):
+ cliapp.AppException.__init__(self,
+ "Stratum %s is empty (has no dependencies)" % stratum)
+
+
+class NoStratumBuildDependsError(StratumError):
+ def __init__(self, stratum):
+ StratumError.__init__(
+ self, 'Stratum %s has no build-dependencies listed '
+ 'and has no bootstrap chunks.' % stratum)
+
+
class MorphologyFactory(object):
'''An way of creating morphologies which will provide a default'''
@@ -136,14 +161,18 @@ class MorphologyFactory(object):
def _check_and_tweak_stratum(self, morphology, reponame, sha1, filename):
'''Check and tweak a stratum morphology.'''
- for source in morphology['chunks']: # pragma: no cover
+ if len(morphology['chunks']) == 0:
+ raise EmptyStratumError(morphology['name'])
+
+ for source in morphology['chunks']:
if source.get('build-depends', None) is None:
name = source.get('name', source.get('repo', 'unknown'))
- raise morphlib.Error('No build dependencies '
- 'stratum %s for chunk %s '
- '(build-depends is a mandatory '
- 'field)' %
- (filename, name))
+ raise NoChunkBuildDependsError(filename, name)
+
+ if (len(morphology['build-depends'] or []) == 0 and
+ not any(c.get('build-mode') in ('bootstrap', 'test')
+ for c in morphology['chunks'])):
+ raise NoStratumBuildDependsError(filename)
morphology.builds_artifacts = [morphology['name']]
morphology.needs_artifact_metadata_cached = True
diff --git a/morphlib/morphologyfactory_tests.py b/morphlib/morphologyfactory_tests.py
index b1a6a621..06489085 100644
--- a/morphlib/morphologyfactory_tests.py
+++ b/morphlib/morphologyfactory_tests.py
@@ -57,6 +57,62 @@ class FakeLocalRepo(object):
}''',
'stratum.morph': '''{
"name": "stratum",
+ "kind": "stratum",
+ "chunks": [
+ {
+ "name": "chunk",
+ "repo": "test:repo",
+ "ref": "sha1",
+ "build-mode": "bootstrap",
+ "build-depends": []
+ }
+ ]
+ }''',
+ 'stratum-no-chunk-bdeps.morph': '''{
+ "name": "stratum-no-chunk-bdeps",
+ "kind": "stratum",
+ "chunks": [
+ {
+ "name": "chunk",
+ "repo": "test:repo",
+ "ref": "sha1",
+ "build-mode": "bootstrap"
+ }
+ ]
+ }''',
+ 'stratum-no-bdeps-no-bootstrap.morph': '''{
+ "name": "stratum-no-bdeps-no-bootstrap",
+ "kind": "stratum",
+ "chunks": [
+ {
+ "name": "chunk",
+ "repo": "test:repo",
+ "ref": "sha1",
+ "build-depends": []
+ }
+ ]
+ }''',
+ 'stratum-bdeps-no-bootstrap.morph': '''{
+ "name": "stratum-bdeps-no-bootstrap",
+ "kind": "stratum",
+ "build-depends": [
+ {
+ "repo": "test:repo",
+ "ref": "sha1",
+ "morph": "stratum"
+ }
+ ],
+ "chunks": [
+ {
+ "name": "chunk",
+ "repo": "test:repo",
+ "ref": "sha1",
+ "build-depends": []
+ }
+ ]
+ }''',
+ 'stratum-empty.morph': '''{
+ "name": "stratum-empty",
"kind": "stratum"
}''',
'system.morph': '''{
@@ -261,3 +317,24 @@ class MorphologyFactoryTests(unittest.TestCase):
self.assertRaises(morphlib.Error, self.mf.get_morphology,
'reponame', 'sha1', 'parse-error.morph')
+ def test_fails_on_no_chunk_bdeps(self):
+ self.assertRaises(morphlib.morphologyfactory.NoChunkBuildDependsError,
+ self.mf.get_morphology, 'reponame', 'sha1',
+ 'stratum-no-chunk-bdeps.morph')
+
+ def test_fails_on_no_bdeps_or_bootstrap(self):
+ self.assertRaises(
+ morphlib.morphologyfactory.NoStratumBuildDependsError,
+ self.mf.get_morphology, 'reponame', 'sha1',
+ 'stratum-no-bdeps-no-bootstrap.morph')
+
+ def test_succeeds_on_bdeps_no_bootstrap(self):
+ self.mf.get_morphology(
+ 'reponame', 'sha1',
+ 'stratum-bdeps-no-bootstrap.morph')
+
+ def test_fails_on_empty_stratum(self):
+ self.assertRaises(
+ morphlib.morphologyfactory.EmptyStratumError,
+ self.mf.get_morphology, 'reponame', 'sha1', 'stratum-empty.morph')
+
diff --git a/tests/setup b/tests/setup
index b6d220f5..91a30236 100755
--- a/tests/setup
+++ b/tests/setup
@@ -95,6 +95,7 @@ cat <<EOF > hello-stratum.morph
"name": "hello",
"repo": "test:chunk-repo",
"ref": "farrokh",
+ "build-mode": "test",
"build-depends": []
}
]
diff --git a/tests/show-dependencies.setup b/tests/show-dependencies.setup
index 5d70d821..9c983d8a 100755
--- a/tests/show-dependencies.setup
+++ b/tests/show-dependencies.setup
@@ -71,6 +71,7 @@ cat <<EOF > gtk-stack.morph
"name": "freetype",
"repo": "test:test-repo",
"ref": "master",
+ "build-mode": "test",
"build-depends": [
]
},
@@ -78,6 +79,7 @@ cat <<EOF > gtk-stack.morph
"name": "fontconfig",
"repo": "test:test-repo",
"ref": "master",
+ "build-mode": "test",
"build-depends": [
]
},
@@ -85,6 +87,7 @@ cat <<EOF > gtk-stack.morph
"name": "cairo",
"repo": "test:test-repo",
"ref": "master",
+ "build-mode": "test",
"build-depends": [
]
},
@@ -92,6 +95,7 @@ cat <<EOF > gtk-stack.morph
"name": "pango",
"repo": "test:test-repo",
"ref": "master",
+ "build-mode": "test",
"build-depends": [
"freetype",
"fontconfig"
@@ -101,6 +105,7 @@ cat <<EOF > gtk-stack.morph
"name": "glib",
"repo": "test:test-repo",
"ref": "master",
+ "build-mode": "test",
"build-depends": [
]
},
@@ -108,6 +113,7 @@ cat <<EOF > gtk-stack.morph
"name": "gdk-pixbuf",
"repo": "test:test-repo",
"ref": "master",
+ "build-mode": "test",
"build-depends": [
"glib"
]
@@ -116,6 +122,7 @@ cat <<EOF > gtk-stack.morph
"name": "gtk",
"repo": "test:test-repo",
"ref": "master",
+ "build-mode": "test",
"build-depends": [
"cairo",
"gdk-pixbuf",
@@ -127,6 +134,7 @@ cat <<EOF > gtk-stack.morph
"name": "dbus",
"repo": "test:test-repo",
"ref": "master",
+ "build-mode": "test",
"build-depends": [
]
},
@@ -134,6 +142,7 @@ cat <<EOF > gtk-stack.morph
"name": "dbus-glib",
"repo": "test:test-repo",
"ref": "master",
+ "build-mode": "test",
"build-depends": [
"dbus",
"glib"
@@ -197,6 +206,7 @@ cat <<EOF > xfce-core.morph
"name": "libxfce4util",
"repo": "test:test-repo",
"ref": "master",
+ "build-mode": "test",
"build-depends": [
]
},
@@ -204,6 +214,7 @@ cat <<EOF > xfce-core.morph
"name": "xfconf",
"repo": "test:test-repo",
"ref": "master",
+ "build-mode": "test",
"build-depends": [
"libxfce4util"
]
@@ -212,6 +223,7 @@ cat <<EOF > xfce-core.morph
"name": "libxfce4ui",
"repo": "test:test-repo",
"ref": "master",
+ "build-mode": "test",
"build-depends": [
"xfconf"
]
@@ -220,6 +232,7 @@ cat <<EOF > xfce-core.morph
"name": "exo",
"repo": "test:test-repo",
"ref": "master",
+ "build-mode": "test",
"build-depends": [
"libxfce4util"
]
@@ -228,6 +241,7 @@ cat <<EOF > xfce-core.morph
"name": "garcon",
"repo": "test:test-repo",
"ref": "master",
+ "build-mode": "test",
"build-depends": [
"libxfce4util"
]
@@ -236,6 +250,7 @@ cat <<EOF > xfce-core.morph
"name": "thunar",
"repo": "test:test-repo",
"ref": "master",
+ "build-mode": "test",
"build-depends": [
"libxfce4ui",
"exo"
@@ -245,6 +260,7 @@ cat <<EOF > xfce-core.morph
"name": "tumbler",
"repo": "test:test-repo",
"ref": "master",
+ "build-mode": "test",
"build-depends": [
]
},
@@ -252,6 +268,7 @@ cat <<EOF > xfce-core.morph
"name": "xfce4-panel",
"repo": "test:test-repo",
"ref": "master",
+ "build-mode": "test",
"build-depends": [
"libxfce4ui",
"exo",
@@ -262,6 +279,7 @@ cat <<EOF > xfce-core.morph
"name": "xfce4-settings",
"repo": "test:test-repo",
"ref": "master",
+ "build-mode": "test",
"build-depends": [
"libxfce4ui",
"exo",
@@ -272,6 +290,7 @@ cat <<EOF > xfce-core.morph
"name": "xfce4-session",
"repo": "test:test-repo",
"ref": "master",
+ "build-mode": "test",
"build-depends": [
"libxfce4ui",
"exo",
@@ -282,6 +301,7 @@ cat <<EOF > xfce-core.morph
"name": "xfwm4",
"repo": "test:test-repo",
"ref": "master",
+ "build-mode": "test",
"build-depends": [
"libxfce4ui",
"xfconf"
@@ -291,6 +311,7 @@ cat <<EOF > xfce-core.morph
"name": "xfdesktop",
"repo": "test:test-repo",
"ref": "master",
+ "build-mode": "test",
"build-depends": [
"libxfce4ui",
"xfconf"
@@ -300,6 +321,7 @@ cat <<EOF > xfce-core.morph
"name": "xfce4-appfinder",
"repo": "test:test-repo",
"ref": "master",
+ "build-mode": "test",
"build-depends": [
"libxfce4ui",
"garcon",
@@ -310,6 +332,7 @@ cat <<EOF > xfce-core.morph
"name": "gtk-xfce-engine",
"repo": "test:test-repo",
"ref": "master",
+ "build-mode": "test",
"build-depends": [
"libxfce4ui",
"garcon",
@@ -332,6 +355,7 @@ cat <<EOF > xfce-system.morph
{
"repo": "test:test-repo",
"ref": "master",
+ "build-mode": "test",
"morph": "xfce-core"
}
]