summaryrefslogtreecommitdiff
path: root/morphlib/sourceresolver.py
diff options
context:
space:
mode:
Diffstat (limited to 'morphlib/sourceresolver.py')
-rw-r--r--morphlib/sourceresolver.py84
1 files changed, 61 insertions, 23 deletions
diff --git a/morphlib/sourceresolver.py b/morphlib/sourceresolver.py
index cbab0f7f..42398ce7 100644
--- a/morphlib/sourceresolver.py
+++ b/morphlib/sourceresolver.py
@@ -21,6 +21,7 @@ import os
import pylru
import shutil
import tempfile
+import warnings
import yaml
import cliapp
@@ -289,6 +290,36 @@ class SourceResolver(object):
return morphlib.definitions_version.check_version_file(version_text)
+ def _get_defaults(self, definitions_checkout_dir,
+ definitions_version=7): # pragma: no cover
+ '''Return the default build system commands, and default split rules.
+
+ This function returns a tuple with two dicts.
+
+ The defaults are read from a file named DEFAULTS in the definitions
+ directory, if the definitions follow format version 7 or later. If the
+ definitions follow version 6 or earlier, hardcoded defaults are used.
+
+ '''
+ # Read default build systems and split rules from DEFAULTS file.
+ defaults_text = self._get_file_contents_from_definitions(
+ definitions_checkout_dir, 'DEFAULTS')
+
+ if definitions_version < 7:
+ if defaults_text is not None:
+ warnings.warn(
+ "Ignoring DEFAULTS file, because these definitions are "
+ "version %i" % definitions_version)
+ defaults_text = None
+ else:
+ if defaults_text is None:
+ warnings.warn("No DEFAULTS file found.")
+
+ defaults = morphlib.defaults.Defaults(definitions_version,
+ text=defaults_text)
+
+ return defaults.build_systems(), defaults.split_rules()
+
def _get_morphology(self, resolved_morphologies, definitions_checkout_dir,
definitions_repo, definitions_absref, morph_loader,
reponame, sha1, filename): # pragma: no cover
@@ -311,17 +342,12 @@ class SourceResolver(object):
return morph
- def _process_definitions_with_children(self,
- resolved_morphologies,
- definitions_checkout_dir,
- definitions_repo,
- definitions_ref,
- definitions_absref,
- definitions_tree,
- definitions_version,
- morph_loader,
- system_filenames,
- visit): # pragma: no cover
+ def _process_definitions_with_children(
+ self, resolved_morphologies, definitions_checkout_dir,
+ definitions_repo, definitions_ref, definitions_absref,
+ definitions_tree, definitions_version, morph_loader,
+ system_filenames, visit,
+ predefined_split_rules): # pragma: no cover
definitions_queue = collections.deque(system_filenames)
chunk_queue = set()
@@ -341,7 +367,8 @@ class SourceResolver(object):
raise MorphologyNotFoundError(filename)
visit(definitions_repo, definitions_ref, filename,
- definitions_absref, definitions_tree, morphology)
+ definitions_absref, definitions_tree, morphology,
+ predefined_split_rules)
if morphology['kind'] == 'cluster':
raise cliapp.AppException(
@@ -462,7 +489,8 @@ class SourceResolver(object):
resolved_buildsystems, definitions_checkout_dir,
definitions_repo, definitions_absref,
definitions_version, morph_loader, chunk_repo, chunk_ref,
- filename, chunk_buildsystem, visit): # pragma: no cover
+ filename, chunk_buildsystem, visit,
+ predefined_split_rules): # pragma: no cover
absref = None
tree = None
chunk_key = None
@@ -483,7 +511,8 @@ class SourceResolver(object):
if morphology:
absref, tree = self._resolve_ref(resolved_trees, chunk_repo,
chunk_ref)
- visit(chunk_repo, chunk_ref, filename, absref, tree, morphology)
+ visit(chunk_repo, chunk_ref, filename, absref, tree, morphology,
+ predefined_split_rules)
return
absref, tree = self._resolve_ref(resolved_trees, chunk_repo, chunk_ref)
@@ -552,7 +581,8 @@ class SourceResolver(object):
morphology = generate_morph_and_cache_buildsystem(
buildsystem)
- visit(chunk_repo, chunk_ref, filename, absref, tree, morphology)
+ visit(chunk_repo, chunk_ref, filename, absref, tree, morphology,
+ predefined_split_rules)
def traverse_morphs(self, definitions_repo, definitions_ref,
system_filenames,
@@ -582,9 +612,15 @@ class SourceResolver(object):
definitions_absref, definitions_checkout_dir)
definitions_version = self._check_version_file(
- definitions_checkout_dir)
+ definitions_checkout_dir)
+
+ predefined_build_systems, predefined_split_rules = \
+ self._get_defaults(
+ definitions_checkout_dir, definitions_version)
+
morph_loader = morphlib.morphloader.MorphologyLoader(
- definitions_version=definitions_version)
+ definitions_version=definitions_version,
+ predefined_build_systems=predefined_build_systems)
# First, process the system and its stratum morphologies. These
# will all live in the same Git repository, and will point to
@@ -593,7 +629,7 @@ class SourceResolver(object):
resolved_morphologies, definitions_checkout_dir,
definitions_repo, definitions_ref, definitions_absref,
definitions_tree, definitions_version, morph_loader,
- system_filenames, visit)
+ system_filenames, visit, predefined_split_rules)
# Now process all the chunks involved in the build.
for repo, ref, filename, buildsystem in chunk_queue:
@@ -602,7 +638,8 @@ class SourceResolver(object):
definitions_checkout_dir,
definitions_repo, definitions_absref,
definitions_version, morph_loader, repo,
- ref, filename, buildsystem, visit)
+ ref, filename, buildsystem, visit,
+ predefined_split_rules)
def create_source_pool(lrc, rrc, repo, ref, filenames, cachedir,
@@ -624,10 +661,11 @@ def create_source_pool(lrc, rrc, repo, ref, filenames, cachedir,
'''
pool = morphlib.sourcepool.SourcePool()
- def add_to_pool(reponame, ref, filename, absref, tree, morphology):
- sources = morphlib.source.make_sources(reponame, ref,
- filename, absref,
- tree, morphology)
+ def add_to_pool(reponame, ref, filename, absref, tree, morphology,
+ predefined_split_rules):
+ sources = morphlib.source.make_sources(
+ reponame, ref, filename, absref, tree, morphology,
+ predefined_split_rules)
for source in sources:
pool.add(source)