diff options
Diffstat (limited to 'morphlib/sourceresolver.py')
-rw-r--r-- | morphlib/sourceresolver.py | 84 |
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) |