summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--morphlib/morphloader.py11
-rw-r--r--morphlib/morphloader_tests.py14
2 files changed, 25 insertions, 0 deletions
diff --git a/morphlib/morphloader.py b/morphlib/morphloader.py
index 47cb03d7..0c69baac 100644
--- a/morphlib/morphloader.py
+++ b/morphlib/morphloader.py
@@ -195,6 +195,14 @@ class EmptySystemError(MorphologyValidationError):
self, 'System %(system_name)s has no strata.' % locals())
+class DependsOnSelfError(MorphologyValidationError):
+
+ def __init__(self, name, filename):
+ msg = ("Stratum %(name)s build-depends on itself (%(filename)s)"
+ % locals())
+ MorphologyValidationError.__init__(self, msg)
+
+
class MultipleValidationErrors(MorphologyValidationError):
def __init__(self, name, errors):
@@ -536,6 +544,9 @@ class MorphologyLoader(object):
raise InvalidTypeError(
'build-depends', list, type(morph['build-depends']),
morph['name'])
+ for dep in morph['build-depends']:
+ if dep['morph'] == morph.filename:
+ raise DependsOnSelfError(morph['name'], morph.filename)
else:
for spec in morph['chunks']:
if spec.get('build-mode') in ['bootstrap', 'test']:
diff --git a/morphlib/morphloader_tests.py b/morphlib/morphloader_tests.py
index f9fa2a34..db1872a8 100644
--- a/morphlib/morphloader_tests.py
+++ b/morphlib/morphloader_tests.py
@@ -225,6 +225,20 @@ build-system: dummy
morphlib.morphloader.EmptyRefError):
self.loader.validate(m)
+ def test_fails_to_validate_stratum_which_build_depends_on_self(self):
+ text = '''\
+name: bad-stratum
+kind: stratum
+build-depends:
+- morph: strata/bad-stratum.morph
+chunks:
+- name: chunk
+ repo: test:repo
+ ref: foo'''
+ self.assertRaises(
+ morphlib.morphloader.DependsOnSelfError,
+ self.loader.load_from_string, text, 'strata/bad-stratum.morph')
+
def test_fails_to_validate_system_with_obsolete_system_kind_field(self):
m = morphlib.morphology.Morphology({
'kind': 'system',