summaryrefslogtreecommitdiff
path: root/morphlib/morphologyfactory.py
diff options
context:
space:
mode:
Diffstat (limited to 'morphlib/morphologyfactory.py')
-rw-r--r--morphlib/morphologyfactory.py56
1 files changed, 28 insertions, 28 deletions
diff --git a/morphlib/morphologyfactory.py b/morphlib/morphologyfactory.py
index cd59d4ec..1cde2c77 100644
--- a/morphlib/morphologyfactory.py
+++ b/morphlib/morphologyfactory.py
@@ -14,6 +14,8 @@
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+import os
+
import morphlib
import cliapp
@@ -74,43 +76,41 @@ class MorphologyFactory(object):
self._app.status(*args, **kwargs)
def _get_morphology_text(self, reponame, sha1, filename):
+ morph_name = os.path.splitext(os.path.basename(filename))[0]
if self._lrc.has_repo(reponame):
self.status(msg="Looking for %s in local repo cache" % filename,
chatty=True)
- repo = self._lrc.get_repo(reponame)
- file_list = repo.ls_tree(sha1)
-
- if filename in file_list:
- return repo.cat(sha1, filename)
+ try:
+ repo = self._lrc.get_repo(reponame)
+ text = repo.cat(sha1, filename)
+ except IOError:
+ text = None
+ file_list = repo.ls_tree(sha1)
elif self._rrc is not None:
- self.status(msg="Looking for %s in remote repo cache" % filename,
+ self.status(msg="Retrieving %(reponame)s %(sha1)s %(filename)s"
+ " from the remote artifact cache.",
+ reponame=reponame, sha1=sha1, filename=filename,
chatty=True)
- file_list = self._rrc.ls_tree(reponame, sha1)
-
- if filename in file_list:
- self.status(msg='Retrieving %s %s %s'
- 'from the remote artifact cache.'
- % (reponame, sha1, filename), chatty=True)
- return self._rrc.cat_file(reponame, sha1, filename)
+ try:
+ text = self._rrc.cat_file(reponame, sha1, filename)
+ except morphlib.remoterepocache.CatFileError:
+ text = None
+ file_list = self._rrc.ls_tree(reponame, sha1)
else:
raise NotcachedError(reponame)
- 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)
- # TODO consider changing how morphs are located to be by morph
- # name rather than filename, it would save creating a
- # filename only to strip it back to its morph name again
- # and would allow future changes like morphologies being
- # stored as git metadata instead of as a file in the repo
- morph_name = filename[:-len('.morph')]
- return bs.get_morphology_text(morph_name)
+ if text 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
def get_morphology(self, reponame, sha1, filename):
- text = self._get_morphology_text(reponame, sha1, filename)
+ morph_name, text = self._get_morphology_text(reponame, sha1, filename)
try:
morphology = morphlib.morph2.Morphology(text)
@@ -118,7 +118,7 @@ class MorphologyFactory(object):
raise morphlib.Error("Error parsing %s: %s" %
(filename, str(e)))
- if filename != morphology['name'] + '.morph':
+ if morph_name != morphology['name']:
raise morphlib.Error(
"Name %s does not match basename of morphology file %s" %
(morphology['name'], filename))