summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdam Coldrick <adam.coldrick@codethink.co.uk>2015-03-10 15:07:52 +0000
committerAdam Coldrick <adam.coldrick@codethink.co.uk>2015-03-10 15:13:34 +0000
commitf4399e58c07c692c001fa3e9d2c2f5d0076b528c (patch)
tree7828ac9b80a5c92a1b17a576a33fc3cb6c3ab500
parent3de96d2b769e0068a57b8e45766509912c190115 (diff)
downloadmorph-baserock/adamcoldrick/speed-up-distbuild-ipc.tar.gz
-rw-r--r--distbuild/serialise.py53
1 files changed, 28 insertions, 25 deletions
diff --git a/distbuild/serialise.py b/distbuild/serialise.py
index 6cbc8fbc..fdbb7a7b 100644
--- a/distbuild/serialise.py
+++ b/distbuild/serialise.py
@@ -60,54 +60,53 @@ def serialise_artifact(artifact, repo, ref):
arch = artifact.arch
a_dict = {
- 'root_filename': artifact.source.filename,
'arch': arch,
'cache_key': a.source.cache_key,
- 'basename': a.basename(),
'filename': a.source.filename,
'name': a.name,
'kind': a.source.morphology['kind'],
'repo': repo,
'ref': ref,
- 'dependencies': [],
'source_repo': a.source.repo_name,
'source_ref': a.source.sha1,
- 'source_artifacts': []
}
- for dep in a.source.dependencies:
- a_dict['dependencies'].append(dep.basename())
- for other in a.source.artifacts:
- a_dict['source_artifacts'].append(other)
- return a_dict
+ deps = [dep.basename() for dep in a.source.dependencies]
+ sa = [other for other in a.source.artifacts]
+ return a_dict, deps, sa
def encode_artifact_reference(a):
a_dict = dict(a._dict)
- a_dict['dependencies'] = [dep.basename() for dep in a.dependencies]
- a_dict['source_artifacts'] = [str(sa) for sa in a.source_artifacts]
- return a_dict
-
- def handle_artifact_reference(a):
- if a.basename() in encoded_artifacts:
- return
- visited_artifacts[a.basename()] = a
- for dep in a.dependencies:
- handle_artifact_reference(dep)
- encoded_artifacts[a.basename()] = encode_artifact_reference(a)
+ deps = [dep.basename() for dep in a.dependencies]
+ sa = [str(sa) for sa in a.source_artifacts]
+ return a_dict, deps, sa
encoded_artifacts = {}
+ encoded_deps = {}
+ encoded_source_artifacts = {}
visited_artifacts = {}
if isinstance(artifact, morphlib.artifact.Artifact):
+ root_filename = artifact.source.filename
for a in artifact.walk():
if a.basename() not in encoded_artifacts: # pragma: no cover
- encoded_artifacts[a.basename()] = encode_artifact(a)
+ a_dict, deps, sa = encode_artifact(a)
+ encoded_artifacts[a.basename()] = a_dict
+ encoded_deps[a.source.cache_key] = deps
+ encoded_source_artifacts[a.source.cache_key] = sa
visited_artifacts[artifact.basename()] = artifact
elif isinstance(artifact, ArtifactReference):
- encoded_artifacts[artifact.basename()] = encode_artifact_reference(artifact)
+ root_filename = artifact.root_filename
+ a_dict, deps, sa = encode_artifact_reference(artifact)
+ encoded_artifacts[artifact.basename()] = a_dict
+ encoded_deps[artifact.cache_key] = deps
+ encoded_source_artifacts[artifact.cache_key] = sa
content = {
'root-artifact': artifact.basename(),
- 'artifacts': encoded_artifacts
+ 'root-filename': root_filename,
+ 'artifacts': encoded_artifacts,
+ 'dependencies': encoded_deps,
+ 'source-artifacts': encoded_source_artifacts
}
logging.debug('SERIALISE: dumping content')
ret = json.dumps(yaml.dump(content))
@@ -137,18 +136,22 @@ def deserialise_artifact(encoded):
content = yaml.load(json.loads(encoded))
root = content['root-artifact']
encoded_artifacts = content['artifacts']
+ encoded_deps = content['dependencies']
+ encoded_sa = content['source-artifacts']
artifacts = {}
# decode artifacts
for basename, artifact_dict in encoded_artifacts.iteritems():
artifact = ArtifactReference(basename, artifact_dict)
+ artifact.root_filename = content['root-filename']
artifacts[basename] = artifact
# add dependencies
for basename, a_dict in encoded_artifacts.iteritems():
artifact = artifacts[basename]
- artifact.dependencies = [artifacts.get(dep)
- for dep in a_dict['dependencies']]
+ deps = encoded_deps[artifact.cache_key]
+ artifact.dependencies = [artifacts.get(dep) for dep in deps]
+ artifact.source_artifacts = encoded_sa[artifact.cache_key]
return artifacts[root]