summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--morphlib/builder.py3
-rw-r--r--morphlib/morphologyloader.py30
2 files changed, 30 insertions, 3 deletions
diff --git a/morphlib/builder.py b/morphlib/builder.py
index 643ce04a..bcd934ef 100644
--- a/morphlib/builder.py
+++ b/morphlib/builder.py
@@ -673,7 +673,8 @@ class Builder(object): # pragma: no cover
if 'morph' in source
else source['name'])
filename = '%s.morph' % filename
- chunk = self.morph_loader.load(treeish, filename)
+ chunk = self.morph_loader.load(treeish, filename,
+ chunk_name=source['name'])
cache_id = self.get_cache_id(chunk)
kids.append(cache_id)
elif morph.kind == 'system':
diff --git a/morphlib/morphologyloader.py b/morphlib/morphologyloader.py
index dd2dd183..02c58f80 100644
--- a/morphlib/morphologyloader.py
+++ b/morphlib/morphologyloader.py
@@ -27,20 +27,46 @@ class MorphologyLoader(object):
self.settings = settings
self.morphologies = {}
- def load(self, treeish, filename):
+ def load(self, treeish, filename, chunk_name=None):
key = (treeish, filename)
if key in self.morphologies:
return self.morphologies[key]
else:
- morph = self._get_morph_from_git(treeish, filename)
+ try:
+ morph = self._get_morph_from_git(treeish, filename)
+ except morphlib.excecute.CommandFailure: # pragma: no cover
+ morph = None
+ if morph is None and chunk_name is not None: # pragma: no cover
+ morph = self._autodetect_morph(treeish, filename, chunk_name)
+ if morph is None: # pragma: no cover
+ raise Exception("Can't find morphology %s" % filename)
self.morphologies[key] = morph
return morph
+ def _autodetect_morph(self, treeish, filename, chunk): # pragma: no cover
+ def exists(x):
+ try:
+ self._get_morph_text(treeish, x)
+ except morphlib.execute.CommandFailure:
+ return False
+ else:
+ return True
+ bs = morphlib.buildsystem.detect_build_system(exists)
+ if bs is not None:
+ morph_text = bs.get_morphology_text(chunk)
+ return self._get_morph(treeish, filename, morph_text)
+ else:
+ return None
+
def _get_morph_text(self, treeish, filename): # pragma: no cover
return morphlib.git.get_morph_text(treeish, filename)
def _get_morph_from_git(self, treeish, filename):
morph_text = self._get_morph_text(treeish, filename)
+ return self._get_morph(treeish, filename, morph_text)
+
+ def _get_morph(self, treeish, filename, morph_text):
fp = StringIO.StringIO(morph_text)
fp.name = filename
return morphlib.morphology.Morphology(treeish, fp)
+