summaryrefslogtreecommitdiff
path: root/morphlib/source.py
diff options
context:
space:
mode:
authorRichard Maw <richard.maw@gmail.com>2014-09-03 21:03:56 +0000
committerRichard Maw <richard.maw@gmail.com>2014-09-19 12:43:26 +0000
commit30bd3185050bc7997a032ca32f0a5ac9b5e76ed9 (patch)
tree8f2c011823945af4d79e9e5bc850477a61b58e5f /morphlib/source.py
parente3400ec5a25b5163293adcb0d007d0a8cae53a4c (diff)
downloadmorph-30bd3185050bc7997a032ca32f0a5ac9b5e76ed9.tar.gz
Create multiple sources per stratum morphology
Building per-artifact results in undesirable behaviour, as multiple artifacts are produced for every chunk build. It therefore makes more sense to build per-source. This implies that actually, the model of one source per morphology is wrong and we should move the dependencies into the source. Unlike chunks however, where every chunk artifact has the same dependencies, stratum artifacts can have different dependencies. So before we can move the dependencies into the Source, we need to have as many Sources as Stratum Artifacts.
Diffstat (limited to 'morphlib/source.py')
-rw-r--r--morphlib/source.py52
1 files changed, 41 insertions, 11 deletions
diff --git a/morphlib/source.py b/morphlib/source.py
index d0f69a28..3d7e5a0f 100644
--- a/morphlib/source.py
+++ b/morphlib/source.py
@@ -35,8 +35,9 @@ class Source(object):
'''
- def __init__(self, repo_name, original_ref, sha1, tree, morphology,
- filename):
+ def __init__(self, name, repo_name, original_ref, sha1, tree, morphology,
+ filename, split_rules):
+ self.name = name
self.repo = None
self.repo_name = repo_name
self.original_ref = original_ref
@@ -45,17 +46,46 @@ class Source(object):
self.morphology = morphology
self.filename = filename
- kind = morphology['kind']
- unifier = getattr(morphlib.artifactsplitrule,
- 'unify_%s_matches' % kind)
- self.split_rules = unifier(morphology)
- self.artifacts = {name: morphlib.artifact.Artifact(self, name)
- for name in self.split_rules.artifacts}
+ self.split_rules = split_rules
+ self.artifacts = None
def __str__(self): # pragma: no cover
- return '%s|%s|%s' % (self.repo_name,
- self.original_ref,
- self.filename)
+ return '%s|%s|%s|%s' % (self.repo_name,
+ self.original_ref,
+ self.filename,
+ self.name)
def __repr__(self): # pragma: no cover
return 'Source(%s)' % str(self)
+
+
+def make_sources(reponame, ref, filename, absref, tree, morphology):
+ kind = morphology['kind']
+ if kind in ('system', 'chunk'):
+ unifier = getattr(morphlib.artifactsplitrule,
+ 'unify_%s_matches' % kind)
+ split_rules = unifier(morphology)
+ # chunk and system sources are named after the morphology
+ source_name = morphology['name']
+ source = morphlib.source.Source(source_name, reponame, ref,
+ absref, tree, morphology,
+ filename, split_rules)
+ source.artifacts = {name: morphlib.artifact.Artifact(source, name)
+ for name in split_rules.artifacts}
+ yield source
+ elif kind == 'stratum': # pragma: no cover
+ unifier = morphlib.artifactsplitrule.unify_stratum_matches
+ split_rules = unifier(morphology)
+ for name in split_rules.artifacts:
+ source = morphlib.source.Source(
+ name, # stratum source name is artifact name
+ reponame, ref, absref, tree, morphology, filename,
+ # stratum sources need to match the unified
+ # split rules, so they know to yield the match
+ # to a different source
+ split_rules)
+ source.artifacts = {name: morphlib.artifact.Artifact(source, name)}
+ yield source
+ else:
+ # cluster morphologies don't have sources
+ pass