diff options
-rw-r--r-- | morphlib/sourceresolver.py | 69 |
1 files changed, 40 insertions, 29 deletions
diff --git a/morphlib/sourceresolver.py b/morphlib/sourceresolver.py index 0c2d1a0a..832266dd 100644 --- a/morphlib/sourceresolver.py +++ b/morphlib/sourceresolver.py @@ -214,29 +214,12 @@ class SourceResolver(object): return absref, tree - def _get_morphology(self, reponame, sha1, filename): - '''Read the morphology at the specified location. - - Returns None if the file does not exist in the specified commit. - - ''' - key = (reponame, sha1, filename) - if key in self._resolved_morphologies: - return self._resolved_morphologies[key] + def _get_morphology_from_definitions(self, loader, filename): + return loader.load_from_file(filename) - if reponame == self._definitions_repo and \ - sha1 == self._definitions_absref: # pragma: no cover - defs_filename = os.path.join(self._definitions_checkout_dir, - filename) - else: - defs_filename = None - - - 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): + def _get_morphology_from_chunk_repo(self, loader, reponame, sha1, + filename): + if self.lrc.has_repo(reponame): self.status(msg="Looking for %(reponame)s:%(filename)s in the " "local repo cache.", reponame=reponame, filename=filename, chatty=True) @@ -261,6 +244,34 @@ class SourceResolver(object): # if it had been possible. raise NotcachedError(reponame) + return morph + + def _get_morphology(self, reponame, sha1, filename, + look_in_chunk_repo=True): + '''Read the morphology at the specified location. + + Returns None if the file does not exist in the specified commit. + + ''' + key = (reponame, sha1, filename) + if key in self._resolved_morphologies: + return self._resolved_morphologies[key] + + if reponame == self._definitions_repo and \ + sha1 == self._definitions_absref: # pragma: no cover + defs_filename = os.path.join(self._definitions_checkout_dir, + filename) + else: + defs_filename = None + + + loader = morphlib.morphloader.MorphologyLoader() + morph = None + if defs_filename and os.path.exists(defs_filename): # pragma: no cover + morph = self._get_morphology_from_definitions(loader, defs_filename) + elif look_in_chunk_repo: + morph = self._get_morphology_from_chunk_repo(loader, reponame, sha1, filename) + if morph is None: return None else: @@ -378,18 +389,18 @@ class SourceResolver(object): morph_name = os.path.splitext(os.path.basename(filename))[0] - morphology = None + morphology = self._get_morphology( + *definition_key, look_in_chunk_repo=False) buildsystem = None if chunk_key in self._resolved_buildsystems: buildsystem = self._resolved_buildsystems[chunk_key] - if buildsystem is None: - # The morphologies aren't locally cached, so a morphology - # for a chunk kept in the chunk repo will be read every time. - # So, always keep your chunk morphs in your definitions repo, - # not in the chunk repo! - morphology = self._get_morphology(*definition_key) + if morphology is None and buildsystem is None: + # This is a slow operation (looking for a file in Git repo may + # potentially require cloning the whole thing). + morphology = self._get_morphology( + *definition_key, look_in_chunk_repo=True) if morphology is None: if buildsystem is None: |