summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSam Thursfield <sam.thursfield@codethink.co.uk>2015-02-20 10:37:30 +0000
committerSam Thursfield <sam.thursfield@codethink.co.uk>2015-02-20 13:48:41 +0000
commit0b0f6631fc410b281bca45d30bf6f41105b0b0f8 (patch)
tree2582066a4f1eaee84e001ec2c957e51016b7ba91
parentafcb1146a2ed1a09244266f4e302ee78d8625b92 (diff)
downloadmorph-0b0f6631fc410b281bca45d30bf6f41105b0b0f8.tar.gz
sourceresolver: Fix InvalidRefError when local git cache is out of date
Code in sourceresolver.py assumed that resolve_ref() would be called for the chunk repo before get_morphology() was called, so the repo would always be up to date. This wasn't actually true. If your local repo cache was out of date, you might see the following sort of error: InvalidRefError: Git directory /src/cache/gits/git___git_baserock_org_delta_usbutils has no commit at ref c37f146eb2c6642c600f1b025a6d56996b0697ff^{tree}.
-rw-r--r--morphlib/sourceresolver.py18
1 files changed, 11 insertions, 7 deletions
diff --git a/morphlib/sourceresolver.py b/morphlib/sourceresolver.py
index 832266dd..de80515e 100644
--- a/morphlib/sourceresolver.py
+++ b/morphlib/sourceresolver.py
@@ -384,8 +384,11 @@ class SourceResolver(object):
def process_chunk(self, definition_repo, definition_ref, chunk_repo,
chunk_ref, filename, visit): # pragma: no cover
+ absref = None
+ tree = None
+
definition_key = (definition_repo, definition_ref, filename)
- chunk_key = (chunk_repo, chunk_ref, filename)
+ chunk_key = None
morph_name = os.path.splitext(os.path.basename(filename))[0]
@@ -399,8 +402,10 @@ class SourceResolver(object):
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).
+ absref, tree = self._resolve_ref(chunk_repo, chunk_ref)
+ chunk_key = (chunk_repo, absref, filename)
morphology = self._get_morphology(
- *definition_key, look_in_chunk_repo=True)
+ *chunk_key, look_in_chunk_repo=True)
if morphology is None:
if buildsystem is None:
@@ -413,7 +418,9 @@ class SourceResolver(object):
buildsystem, morph_name)
self._resolved_morphologies[definition_key] = morphology
- absref, tree = self._resolve_ref(chunk_repo, chunk_ref)
+ if not absref or not tree:
+ absref, tree = self._resolve_ref(chunk_repo, chunk_ref)
+
visit(chunk_repo, chunk_ref, filename, absref, tree, morphology)
def traverse_morphs(self, definitions_repo, definitions_ref,
@@ -452,10 +459,7 @@ class SourceResolver(object):
system_filenames, definitions_repo, definitions_ref,
definitions_absref, definitions_tree, visit)
- # Now process all the chunks involved in the build. First those
- # with morphologies in definitions.git, and then (for compatibility
- # reasons only) those with the morphology in the chunk's source
- # repository.
+ # Now process all the chunks involved in the build.
for repo, ref, filename in chunk_in_definitions_repo_queue:
self.process_chunk(definitions_repo, definitions_absref, repo,
ref, filename, visit)