diff options
author | Lars Wirzenius <lars.wirzenius@codethink.co.uk> | 2013-08-09 10:17:39 +0000 |
---|---|---|
committer | Lars Wirzenius <lars.wirzenius@codethink.co.uk> | 2013-08-09 10:17:39 +0000 |
commit | 82cb8f46e5283f97e9a110adff8a49a60bcdb497 (patch) | |
tree | 1c64a0ee2fda50c73adf2ee5c07d02fb7e37a3a6 | |
parent | 3a87d9f94b8d30f6e988c790d23789a3e0bb56c0 (diff) | |
parent | edc50cf457a92575a22e202e648d64b0ef1a3527 (diff) | |
download | definitions-82cb8f46e5283f97e9a110adff8a49a60bcdb497.tar.gz |
Merge remote-tracking branch 'origin/baserock/richardmaw/S8532/validate-stratum-build-depends'
-rw-r--r-- | morphlib/builder2.py | 9 | ||||
-rw-r--r-- | morphlib/morphologyfactory.py | 41 | ||||
-rw-r--r-- | morphlib/morphologyfactory_tests.py | 77 | ||||
-rwxr-xr-x | tests/setup | 1 | ||||
-rwxr-xr-x | tests/show-dependencies.setup | 24 |
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" } ] |