summaryrefslogtreecommitdiff
path: root/morphlib/morphologyfactory.py
diff options
context:
space:
mode:
Diffstat (limited to 'morphlib/morphologyfactory.py')
-rw-r--r--morphlib/morphologyfactory.py96
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)