diff options
author | Lars Wirzenius <lars.wirzenius@codethink.co.uk> | 2014-06-26 10:59:56 +0000 |
---|---|---|
committer | Lars Wirzenius <lars.wirzenius@codethink.co.uk> | 2014-06-26 10:59:56 +0000 |
commit | c8c325f3573c0dba853e472ff157e4c6ba0f1554 (patch) | |
tree | bf3e27323c66df6ec5a608c058b7ffbb8dfb405c | |
parent | 7309431873fd9f9e5f6a39025d75e3305c3c8a19 (diff) | |
parent | 244feb97ef207ba724f080826d6b4ad3a2d7cd33 (diff) | |
download | morph-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.py | 57 | ||||
-rw-r--r-- | morphlib/morphologyfactory_tests.py | 11 |
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): |