From 7083d19af908a779f096afc2ae48f68d796116eb Mon Sep 17 00:00:00 2001 From: Lars Wirzenius Date: Fri, 30 Mar 2012 17:18:13 +0100 Subject: Automatically deduce type of chunk if one doesn't exist --- morphlib/builder.py | 3 ++- morphlib/morphologyloader.py | 30 ++++++++++++++++++++++++++++-- 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) + -- cgit v1.2.1