diff options
Diffstat (limited to 'morphlib/morphologyfactory.py')
-rw-r--r-- | morphlib/morphologyfactory.py | 96 |
1 files changed, 13 insertions, 83 deletions
diff --git a/morphlib/morphologyfactory.py b/morphlib/morphologyfactory.py index cd1972be..1a8e374e 100644 --- a/morphlib/morphologyfactory.py +++ b/morphlib/morphologyfactory.py @@ -37,31 +37,6 @@ 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): '''A way of creating morphologies which will provide a default''' @@ -75,16 +50,17 @@ class MorphologyFactory(object): if self._app is not None: self._app.status(*args, **kwargs) - def _get_morphology_text(self, reponame, sha1, filename): + def _load_morphology(self, reponame, sha1, filename): morph_name = os.path.splitext(os.path.basename(filename))[0] + loader = morphlib.morphloader.MorphologyLoader() if self._lrc.has_repo(reponame): self.status(msg="Looking for %s in local repo cache" % filename, chatty=True) try: repo = self._lrc.get_repo(reponame) - text = repo.cat(sha1, filename) + morph = loader.load_from_string(repo.cat(sha1, filename)) except IOError: - text = None + morph = None file_list = repo.ls_tree(sha1) elif self._rrc is not None: self.status(msg="Retrieving %(reponame)s %(sha1)s %(filename)s" @@ -93,35 +69,28 @@ class MorphologyFactory(object): chatty=True) try: text = self._rrc.cat_file(reponame, sha1, filename) + morph = loader.load_from_string(text) except morphlib.remoterepocache.CatFileError: - text = None + morph = None file_list = self._rrc.ls_tree(reponame, sha1) else: raise NotcachedError(reponame) - if text is None: + if morph is None: self.status(msg="File %s doesn't exist: attempting to infer " "chunk morph from repo's build system" % filename, chatty=True) bs = morphlib.buildsystem.detect_build_system(file_list) if bs is None: raise MorphologyNotFoundError(filename) - text = bs.get_morphology_text(morph_name) - return morph_name, text + morph = bs.get_morphology(morph_name) + loader.validate(morph) + loader.set_commands(morph) + loader.set_defaults(morph) + return morph def get_morphology(self, reponame, sha1, filename): - morph_name, text = self._get_morphology_text(reponame, sha1, filename) - - try: - morphology = morphlib.morph2.Morphology(text) - except morphlib.YAMLError as e: # pragma: no cover - raise morphlib.Error("Error parsing %s: %s" % - (filename, str(e))) - - if morph_name != morphology['name']: - raise morphlib.Error( - "Name %s does not match basename of morphology file %s" % - (morphology['name'], filename)) + morphology = self._load_morphology(reponame, sha1, filename) method_name = '_check_and_tweak_%s' % morphology['kind'] if hasattr(self, method_name): @@ -133,54 +102,17 @@ class MorphologyFactory(object): def _check_and_tweak_system(self, morphology, reponame, sha1, filename): '''Check and tweak a system morphology.''' - if morphology['arch'] is None: # pragma: no cover - raise morphlib.Error('No arch specified in system %s ' - '(arch is a mandatory field)' % - filename) - - if morphology['arch'] == 'armv7': - morphology._dict['arch'] = 'armv7l' - - if morphology['arch'] not in morphlib.valid_archs: - raise morphlib.Error('Unknown arch %s. This version of Morph ' - 'supports the following architectures: %s' % - (morphology['arch'], - ', '.join(morphlib.valid_archs))) - name = morphology['name'] morphology.builds_artifacts = [name + '-rootfs'] morphology.needs_artifact_metadata_cached = False - morphlib.morphloader.MorphologyLoader._validate_stratum_specs_fields( - morphology, 'strata') - morphlib.morphloader.MorphologyLoader._set_stratum_specs_defaults( - morphology, 'strata') - def _check_and_tweak_stratum(self, morphology, reponame, sha1, filename): '''Check and tweak a stratum morphology.''' - 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 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 - morphlib.morphloader.MorphologyLoader._validate_stratum_specs_fields( - morphology, 'build-depends') - morphlib.morphloader.MorphologyLoader._set_stratum_specs_defaults( - morphology, 'build-depends') - def _check_and_tweak_chunk(self, morphology, reponame, sha1, filename): '''Check and tweak a chunk morphology.''' @@ -191,5 +123,3 @@ class MorphologyFactory(object): morphology.builds_artifacts = [morphology['name']] morphology.needs_artifact_metadata_cached = False - - morphlib.morphloader.MorphologyLoader._validate_chunk(morphology) |