diff options
-rw-r--r-- | morphlib/morphloader.py | 11 | ||||
-rw-r--r-- | morphlib/morphloader_tests.py | 14 |
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', |