summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLars Wirzenius <lars.wirzenius@codethink.co.uk>2014-06-26 10:59:56 +0000
committerLars Wirzenius <lars.wirzenius@codethink.co.uk>2014-06-26 10:59:56 +0000
commitc8c325f3573c0dba853e472ff157e4c6ba0f1554 (patch)
treebf3e27323c66df6ec5a608c058b7ffbb8dfb405c
parent7309431873fd9f9e5f6a39025d75e3305c3c8a19 (diff)
parent244feb97ef207ba724f080826d6b4ad3a2d7cd33 (diff)
downloadmorph-c8c325f3573c0dba853e472ff157e4c6ba0f1554.tar.gz
Merge remote-tracking branch 'origin/baserock/richardipsum/improve_getmorph_errmsg'
Reviewed-by: Lars Wirzenius Reviewed-by: Emmet Hikory
-rw-r--r--morphlib/morphologyfactory.py57
-rw-r--r--morphlib/morphologyfactory_tests.py11
2 files changed, 37 insertions, 31 deletions
diff --git a/morphlib/morphologyfactory.py b/morphlib/morphologyfactory.py
index 8a0b047a..cd59d4ec 100644
--- a/morphlib/morphologyfactory.py
+++ b/morphlib/morphologyfactory.py
@@ -22,11 +22,10 @@ class MorphologyFactoryError(cliapp.AppException):
pass
-class AutodetectError(MorphologyFactoryError):
- def __init__(self, repo_name, ref, filename):
+class MorphologyNotFoundError(MorphologyFactoryError):
+ def __init__(self, filename):
MorphologyFactoryError.__init__(
- self, "Failed to determine the build system of repo %s at "
- "ref %s: was looking for %s" % (repo_name, ref, filename))
+ self, "Couldn't find morphology: %s" % filename)
class NotcachedError(MorphologyFactoryError):
@@ -63,7 +62,7 @@ class NoStratumBuildDependsError(StratumError):
class MorphologyFactory(object):
- '''An way of creating morphologies which will provide a default'''
+ '''A way of creating morphologies which will provide a default'''
def __init__(self, local_repo_cache, remote_repo_cache=None, app=None):
self._lrc = local_repo_cache
@@ -74,36 +73,44 @@ class MorphologyFactory(object):
if self._app is not None:
self._app.status(*args, **kwargs)
- def get_morphology(self, reponame, sha1, filename):
-
- text = None
+ def _get_morphology_text(self, reponame, sha1, filename):
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:
- text = repo.cat(sha1, filename)
+ return repo.cat(sha1, filename)
elif self._rrc is not None:
+ self.status(msg="Looking for %s in remote repo cache" % filename,
+ chatty=True)
file_list = self._rrc.ls_tree(reponame, sha1)
+
if filename in file_list:
- self.status(msg="Retrieving %(reponame)s %(sha1)s %(filename)s"
- " from the remote artifact cache.",
- reponame=reponame, sha1=sha1, filename=filename,
- chatty=True)
- text = self._rrc.cat_file(reponame, sha1, filename)
+ 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)
else:
raise NotcachedError(reponame)
- if text is None:
- bs = morphlib.buildsystem.detect_build_system(file_list)
- if bs is None:
- raise AutodetectError(reponame, sha1, 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')]
- text = bs.get_morphology_text(morph_name)
+ 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)
+
+ def get_morphology(self, reponame, sha1, filename):
+ text = self._get_morphology_text(reponame, sha1, filename)
try:
morphology = morphlib.morph2.Morphology(text)
diff --git a/morphlib/morphologyfactory_tests.py b/morphlib/morphologyfactory_tests.py
index 39092857..47bf3153 100644
--- a/morphlib/morphologyfactory_tests.py
+++ b/morphlib/morphologyfactory_tests.py
@@ -19,7 +19,7 @@ import unittest
import morphlib
from morphlib.morph2 import Morphology
from morphlib.morphologyfactory import (MorphologyFactory,
- AutodetectError,
+ MorphologyNotFoundError,
NotcachedError)
from morphlib.remoterepocache import CatFileError
@@ -234,16 +234,15 @@ class MorphologyFactoryTests(unittest.TestCase):
'assumed-remote.morph')
self.assertEqual('assumed-remote', morph['name'])
- def test_raises_error_when_fails_detect_locally(self):
+ def test_raises_error_when_no_local_morph(self):
self.lr.cat = self.nolocalfile
- self.assertRaises(AutodetectError, self.mf.get_morphology,
+ self.assertRaises(MorphologyNotFoundError, self.mf.get_morphology,
'reponame', 'sha1', 'unreached.morph')
- def test_raises_error_when_fails_detect_remotely(self):
+ def test_raises_error_when_fails_no_remote_morph(self):
self.lrc.has_repo = self.doesnothaverepo
self.rrc.cat_file = self.noremotefile
-# self.mf.get_morphology('reponame', 'sha1', 'unreached.morph')
- self.assertRaises(AutodetectError, self.mf.get_morphology,
+ self.assertRaises(MorphologyNotFoundError, self.mf.get_morphology,
'reponame', 'sha1', 'unreached.morph')
def test_raises_error_when_name_mismatches(self):