diff options
author | Richard Maw <richard.maw@codethink.co.uk> | 2014-10-13 13:09:24 +0000 |
---|---|---|
committer | Richard Maw <richard.maw@codethink.co.uk> | 2014-10-13 13:09:24 +0000 |
commit | 61291bd59fcefdbfcbaf0a50e46e071ccee52fcf (patch) | |
tree | 8a60f2df079e7e32e7e277fc2e37c5e90f5da01f | |
parent | b78a65c72a97dbe07d4eaf38a16aaf7ecfbdc757 (diff) | |
parent | 639bca2a58e872238e991311676f448065093ea2 (diff) | |
download | morph-61291bd59fcefdbfcbaf0a50e46e071ccee52fcf.tar.gz |
Merge branch 'baserock/richardipsum/arfix'
Reviewed-by: Richard Maw
Reviewed-by: Richard Ipsum
Reviewed-by: Sam Thursfield
-rw-r--r-- | morphlib/artifactresolver.py | 125 |
1 files changed, 51 insertions, 74 deletions
diff --git a/morphlib/artifactresolver.py b/morphlib/artifactresolver.py index 8c8b37d0..e53c7511 100644 --- a/morphlib/artifactresolver.py +++ b/morphlib/artifactresolver.py @@ -56,85 +56,67 @@ class ArtifactResolver(object): return [a for a in self._resolve_artifacts(source_pool) if not a.dependents] + def _resolve_system_artifacts(self, source, artifacts): # pragma: no cover + systems = [source.artifacts[name] for name + in source.split_rules.artifacts] + + artifacts += systems + artifacts += self._resolve_system_dependencies(systems, source) + + def _resolve_stratum_artifacts(self, source, artifacts): + # Iterate split_rules.artifacts, rather than + # artifacts.values() to preserve ordering + strata = [source.artifacts[name] + for name in source.split_rules.artifacts + if name in source.artifacts] + + # If we were not given systems, return the strata here, + # rather than have the systems return them. + if not any(s.morphology['kind'] == 'system' + for s in self._source_pool): + for stratum in (s for s in strata + if s not in self._added_artifacts): + artifacts.append(stratum) + self._added_artifacts.add(stratum) + + resolved_artifacts = self._resolve_stratum_dependencies( + strata, source) + + for artifact in resolved_artifacts: + if not artifact in self._added_artifacts: + artifacts.append(artifact) + self._added_artifacts.add(artifact) + + def _resolve_chunk_artifacts(self, source, artifacts): + chunks = [source.artifacts[name] + for name in source.split_rules.artifacts] + # If we were only given chunks, return them here, rather than + # have the strata return them. + if not any(s.morphology['kind'] == 'stratum' + for s in self._source_pool): + for chunk in (c for c in chunks + if c not in self._added_artifacts): + artifacts.append(chunk) + self._added_artifacts.add(chunk) + def _resolve_artifacts(self, source_pool): self._source_pool = source_pool self._added_artifacts = set() + artifacts = [] - artifacts = self._resolve_artifacts_recursively() # TODO perform cycle detection, e.g. based on: # http://stackoverflow.com/questions/546655/finding-all-cycles-in-graph - return artifacts - def _resolve_artifacts_recursively(self): - artifacts = [] + resolvers = {'system': self._resolve_system_artifacts, + 'stratum': self._resolve_stratum_artifacts, + 'chunk': self._resolve_chunk_artifacts} - queue = self._create_initial_queue() - while queue: - source = queue.popleft() - - if source.morphology['kind'] == 'system': # pragma: no cover - systems = [source.artifacts[name] - for name in source.split_rules.artifacts] - - for system in (s for s in systems - if s not in self._added_artifacts): - artifacts.append(system) - self._added_artifacts.add(system) - - resolved_artifacts = self._resolve_system_dependencies( - systems, source, queue) - - for artifact in resolved_artifacts: - if not artifact in self._added_artifacts: - artifacts.append(artifact) - self._added_artifacts.add(artifact) - elif source.morphology['kind'] == 'stratum': - # Iterate split_rules.artifacts, rather than - # artifacts.values() to preserve ordering - strata = [source.artifacts[name] - for name in source.split_rules.artifacts - if name in source.artifacts] - - # If we were not given systems, return the strata here, - # rather than have the systems return them. - if not any(s.morphology['kind'] == 'system' - for s in self._source_pool): - for stratum in (s for s in strata - if s not in self._added_artifacts): - artifacts.append(stratum) - self._added_artifacts.add(stratum) - - resolved_artifacts = self._resolve_stratum_dependencies( - strata, source, queue) - - for artifact in resolved_artifacts: - if not artifact in self._added_artifacts: - artifacts.append(artifact) - self._added_artifacts.add(artifact) - elif source.morphology['kind'] == 'chunk': - chunks = [source.artifacts[name] - for name in source.split_rules.artifacts] - # If we were only given chunks, return them here, rather than - # have the strata return them. - if not any(s.morphology['kind'] == 'stratum' - for s in self._source_pool): - for chunk in (c for c in chunks - if c not in self._added_artifacts): - artifacts.append(chunk) - self._added_artifacts.add(chunk) + for source in self._source_pool: + resolvers[source.morphology['kind']](source, artifacts) return artifacts - def _create_initial_queue(self): - if all([x.morphology['kind'] == 'chunk' for x in self._source_pool]): - return collections.deque(self._source_pool) - else: - sources = [x for x in self._source_pool - if x.morphology['kind'] != 'chunk'] - return collections.deque(sources) - - def _resolve_system_dependencies(self, systems, - source, queue): # pragma: no cover + def _resolve_system_dependencies(self, systems, source): # pragma: no cover artifacts = [] for info in source.morphology['strata']: @@ -156,11 +138,9 @@ class ArtifactResolver(object): source.add_dependency(stratum_artifact) artifacts.append(stratum_artifact) - queue.append(stratum_source) - return artifacts - def _resolve_stratum_dependencies(self, strata, source, queue): + def _resolve_stratum_dependencies(self, strata, source): artifacts = [] stratum_build_depends = [] @@ -191,8 +171,6 @@ class ArtifactResolver(object): source.add_dependency(other_stratum) - queue.append(other_source) - # 'name' here is the chunk artifact name name_to_processed_artifacts = {} @@ -237,7 +215,6 @@ class ArtifactResolver(object): if chunk_artifact not in artifacts: artifacts.append(chunk_artifact) - # Add these chunks to the processed artifacts, so other # chunks may refer to them. name_to_processed_artifacts[info['name']] = \ |