summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--morphlib/sourceresolver.py26
-rw-r--r--morphlib/sourceresolver_tests.py23
2 files changed, 40 insertions, 9 deletions
diff --git a/morphlib/sourceresolver.py b/morphlib/sourceresolver.py
index 29069d7d..0c2d1a0a 100644
--- a/morphlib/sourceresolver.py
+++ b/morphlib/sourceresolver.py
@@ -233,6 +233,7 @@ class SourceResolver(object):
loader = morphlib.morphloader.MorphologyLoader()
+ morph = None
if defs_filename and os.path.exists(defs_filename): # pragma: no cover
morph = loader.load_from_file(defs_filename)
elif self.lrc.has_repo(reponame):
@@ -245,7 +246,6 @@ class SourceResolver(object):
morph = loader.load_from_string(text)
except IOError:
morph = None
- file_list = repo.list_files(ref=sha1, recurse=False)
elif self.rrc is not None:
self.status(msg="Looking for %(reponame)s:%(filename)s in the "
"remote repo cache.",
@@ -280,16 +280,28 @@ class SourceResolver(object):
"chunk morph from repo's build system" %
expected_filename, chatty=True)
+ file_list = None
+
if self.lrc.has_repo(reponame):
repo = self.lrc.get_repo(reponame)
file_list = repo.list_files(ref=sha1, recurse=False)
elif self.rrc is not None:
- file_list = self.rrc.ls_tree(reponame, sha1)
- else:
- # We assume that _resolve_ref() must have already been called and
- # so the repo in question would have been made available already
- # if it had been possible.
- raise NotcachedError(reponame)
+ try:
+ # This may or may not succeed; if the is repo not
+ # hosted on the same Git server as the cache server then
+ # it'll definitely fail.
+ file_list = self.rrc.ls_tree(reponame, sha1)
+ except morphlib.remoterepocache.LsTreeError:
+ pass
+ if not file_list:
+ if self.update:
+ self.status(msg='Caching git repository %(reponame)s',
+ reponame=reponame)
+ repo = self.lrc.cache_repo(reponame)
+ repo.update()
+ file_list = repo.list_files(ref=sha1, recurse=False)
+ else: # pragma: no cover
+ raise NotcachedError(reponame)
buildsystem = morphlib.buildsystem.detect_build_system(file_list)
diff --git a/morphlib/sourceresolver_tests.py b/morphlib/sourceresolver_tests.py
index 2410218a..6d6a83fa 100644
--- a/morphlib/sourceresolver_tests.py
+++ b/morphlib/sourceresolver_tests.py
@@ -24,7 +24,7 @@ from morphlib.sourceresolver import (SourceResolver,
PickleCacheManager,
MorphologyNotFoundError,
NotcachedError)
-from morphlib.remoterepocache import CatFileError
+from morphlib.remoterepocache import CatFileError, LsTreeError
class FakeRemoteRepoCache(object):
@@ -135,6 +135,9 @@ class FakeLocalRepo(object):
def list_files(self, ref, recurse):
return self.morphologies.keys()
+ def update(self):
+ pass
+
class FakeLocalRepoCache(object):
@@ -147,6 +150,9 @@ class FakeLocalRepoCache(object):
def get_repo(self, reponame):
return self.lr
+ def cache_repo(self, reponame):
+ return self.lr
+
class SourceResolverTests(unittest.TestCase):
@@ -188,6 +194,9 @@ class SourceResolverTests(unittest.TestCase):
def noremotefile(self, *args):
raise CatFileError('reponame', 'ref', 'filename')
+ def noremoterepo(self, *args):
+ raise LsTreeError('reponame', 'ref')
+
def localmorph(self, *args):
return ['chunk.morph']
@@ -241,6 +250,15 @@ class SourceResolverTests(unittest.TestCase):
'assumed-local.morph')
self.assertEqual('autotools', name)
+ def test_cache_repo_if_not_in_either_cache(self):
+ self.lrc.has_repo = self.doesnothaverepo
+ self.lr.read_file = self.nolocalmorph
+ self.lr.list_files = self.autotoolsbuildsystem
+ self.rrc.ls_tree = self.noremoterepo
+ name = self.sr._detect_build_system('reponame', 'sha1',
+ 'assumed-local.morph')
+ self.assertEqual('autotools', name)
+
def test_autodetects_remote_morphology(self):
self.lrc.has_repo = self.doesnothaverepo
self.rrc.cat_file = self.noremotemorph
@@ -262,7 +280,8 @@ class SourceResolverTests(unittest.TestCase):
def test_raises_error_when_repo_does_not_exist(self):
self.lrc.has_repo = self.doesnothaverepo
- self.assertRaises(NotcachedError, self.lsr._detect_build_system,
+ self.assertRaises(MorphologyNotFoundError,
+ self.lsr._detect_build_system,
'reponame', 'sha1', 'non-existent.morph')
def test_raises_error_when_failed_to_detect_build_system(self):