diff options
Diffstat (limited to 'src/buildstream/_loader/loader.py')
-rw-r--r-- | src/buildstream/_loader/loader.py | 155 |
1 files changed, 37 insertions, 118 deletions
diff --git a/src/buildstream/_loader/loader.py b/src/buildstream/_loader/loader.py index d703bd711..729b3c5e8 100644 --- a/src/buildstream/_loader/loader.py +++ b/src/buildstream/_loader/loader.py @@ -74,9 +74,7 @@ class Loader: self._context = context self._options = project.options # Project options (OptionPool) self._basedir = basedir # Base project directory - self._first_pass_options = ( - project.first_pass_config.options - ) # Project options (OptionPool) + self._first_pass_options = project.first_pass_config.options # Project options (OptionPool) self._parent = parent # The parent loader self._fetch_subprojects = fetch_subprojects @@ -101,9 +99,7 @@ class Loader: # Raises: LoadError # # Returns: The toplevel LoadElement - def load( - self, targets, task, rewritable=False, ticker=None, ignore_workspaces=False - ): + def load(self, targets, task, rewritable=False, ticker=None, ignore_workspaces=False): for filename in targets: if os.path.isabs(filename): @@ -111,9 +107,7 @@ class Loader: # Expect that the caller gives us the right thing at least ? raise LoadError( "Target '{}' was not specified as a relative " - "path to the base project directory: {}".format( - filename, self._basedir - ), + "path to the base project directory: {}".format(filename, self._basedir), LoadErrorReason.INVALID_DATA, ) @@ -155,11 +149,7 @@ class Loader: # Finally, wrap what we have into LoadElements and return the target # - ret.append( - loader._collect_element( - element, task, ignore_workspaces=ignore_workspaces - ) - ) + ret.append(loader._collect_element(element, task, ignore_workspaces=ignore_workspaces)) self._clean_caches() @@ -241,9 +231,7 @@ class Loader: # Load the data and process any conditional statements therein fullpath = os.path.join(self._basedir, filename) try: - node = _yaml.load( - fullpath, shortname=filename, copy_tree=rewritable, project=self.project - ) + node = _yaml.load(fullpath, shortname=filename, copy_tree=rewritable, project=self.project) except LoadError as e: if e.reason == LoadErrorReason.MISSING_FILE: @@ -252,9 +240,7 @@ class Loader: filename, self.project.junction.name ) else: - message = "Could not find element '{}' in elements directory '{}'".format( - filename, self._basedir - ) + message = "Could not find element '{}' in elements directory '{}'".format(filename, self._basedir) if provenance: message = "{}: {}".format(provenance, message) @@ -265,14 +251,10 @@ class Loader: detail = None elements_dir = os.path.relpath(self._basedir, self.project.directory) element_relpath = os.path.relpath(filename, elements_dir) - if filename.startswith(elements_dir) and os.path.exists( - os.path.join(self._basedir, element_relpath) - ): + if filename.startswith(elements_dir) and os.path.exists(os.path.join(self._basedir, element_relpath)): detail = "Did you mean '{}'?".format(element_relpath) - raise LoadError( - message, LoadErrorReason.MISSING_FILE, detail=detail - ) from e + raise LoadError(message, LoadErrorReason.MISSING_FILE, detail=detail) from e if e.reason == LoadErrorReason.LOADING_DIRECTORY: # If a <directory>.bst file exists in the element path, @@ -284,9 +266,7 @@ class Loader: if os.path.exists(os.path.join(self._basedir, filename + ".bst")): element_name = filename + ".bst" detail = "Did you mean '{}'?\n".format(element_name) - raise LoadError( - message, LoadErrorReason.LOADING_DIRECTORY, detail=detail - ) from e + raise LoadError(message, LoadErrorReason.LOADING_DIRECTORY, detail=detail) from e # Otherwise, we don't know the reason, so just raise raise @@ -355,14 +335,9 @@ class Loader: if dep.junction: self._load_file(dep.junction, rewritable, ticker, dep.provenance) loader = self._get_loader( - dep.junction, - rewritable=rewritable, - ticker=ticker, - provenance=dep.provenance, - ) - dep_element = loader._load_file( - dep.name, rewritable, ticker, dep.provenance + dep.junction, rewritable=rewritable, ticker=ticker, provenance=dep.provenance, ) + dep_element = loader._load_file(dep.name, rewritable, ticker, dep.provenance) else: dep_element = self._elements.get(dep.name) @@ -370,19 +345,14 @@ class Loader: # The loader does not have this available so we need to # either recursively cause it to be loaded, or else we # need to push this onto the loader queue in this loader - dep_element = self._load_file_no_deps( - dep.name, rewritable, dep.provenance - ) + dep_element = self._load_file_no_deps(dep.name, rewritable, dep.provenance) dep_deps = extract_depends_from_node(dep_element.node) loader_queue.append((dep_element, list(reversed(dep_deps)), [])) # Pylint is not very happy about Cython and can't understand 'node' is a 'MappingNode' - if ( - dep_element.node.get_str(Symbol.KIND) == "junction" - ): # pylint: disable=no-member + if dep_element.node.get_str(Symbol.KIND) == "junction": # pylint: disable=no-member raise LoadError( - "{}: Cannot depend on junction".format(dep.provenance), - LoadErrorReason.INVALID_DATA, + "{}: Cannot depend on junction".format(dep.provenance), LoadErrorReason.INVALID_DATA, ) # All is well, push the dependency onto the LoadElement @@ -429,16 +399,12 @@ class Loader: # Create `chain`, the loop of element dependencies from this # element back to itself, by trimming everything before this # element from the sequence under consideration. - chain = [ - element.full_name - for element in sequence[sequence.index(element) :] - ] + chain = [element.full_name for element in sequence[sequence.index(element) :]] chain.append(element.full_name) raise LoadError( - ( - "Circular dependency detected at element: {}\n" - + "Dependency chain: {}" - ).format(element.full_name, " -> ".join(chain)), + ("Circular dependency detected at element: {}\n" + "Dependency chain: {}").format( + element.full_name, " -> ".join(chain) + ), LoadErrorReason.CIRCULAR_DEPENDENCY, ) if element not in validated: @@ -488,9 +454,7 @@ class Loader: if workspace and not ignore_workspaces: workspace_node = {"kind": "workspace"} workspace_node["path"] = workspace.get_absolute_path() - workspace_node["ref"] = str( - workspace.to_dict().get("last_successful", "ignored") - ) + workspace_node["ref"] = str(workspace.to_dict().get("last_successful", "ignored")) node[Symbol.SOURCES] = [workspace_node] skip_workspace = False @@ -507,9 +471,7 @@ class Loader: directory = source.get_str(Symbol.DIRECTORY, default=None) if directory: del source[Symbol.DIRECTORY] - meta_source = MetaSource( - element.name, index, element_kind, kind, source, directory - ) + meta_source = MetaSource(element.name, index, element_kind, kind, source, directory) meta_sources.append(meta_source) meta_element = MetaElement( @@ -548,11 +510,7 @@ class Loader: # def _collect_element(self, top_element, task, ignore_workspaces=False): element_queue = [top_element] - meta_element_queue = [ - self._collect_element_no_deps( - top_element, task, ignore_workspaces=ignore_workspaces - ) - ] + meta_element_queue = [self._collect_element_no_deps(top_element, task, ignore_workspaces=ignore_workspaces)] while element_queue: element = element_queue.pop() @@ -569,9 +527,7 @@ class Loader: name = dep.element.name if name not in loader._meta_elements: - meta_dep = loader._collect_element_no_deps( - dep.element, task, ignore_workspaces=ignore_workspaces - ) + meta_dep = loader._collect_element_no_deps(dep.element, task, ignore_workspaces=ignore_workspaces) element_queue.append(dep.element) meta_element_queue.append(meta_dep) else: @@ -598,9 +554,7 @@ class Loader: # Raises: LoadError # # Returns: A Loader or None if specified junction does not exist - def _get_loader( - self, filename, *, rewritable=False, ticker=None, level=0, provenance=None - ): + def _get_loader(self, filename, *, rewritable=False, ticker=None, level=0, provenance=None): provenance_str = "" if provenance is not None: @@ -626,11 +580,7 @@ class Loader: # junctions in the parent take precedence over junctions defined # in subprojects loader = self._parent._get_loader( - filename, - rewritable=rewritable, - ticker=ticker, - level=level + 1, - provenance=provenance, + filename, rewritable=rewritable, ticker=ticker, level=level + 1, provenance=provenance, ) if loader: self._loaders[filename] = loader @@ -662,14 +612,10 @@ class Loader: # # Any task counting *inside* the junction will be handled by # its loader. - meta_element = self._collect_element_no_deps( - self._elements[filename], _NO_PROGRESS - ) + meta_element = self._collect_element_no_deps(self._elements[filename], _NO_PROGRESS) if meta_element.kind != "junction": raise LoadError( - "{}{}: Expected junction but element kind is {}".format( - provenance_str, filename, meta_element.kind - ), + "{}{}: Expected junction but element kind is {}".format(provenance_str, filename, meta_element.kind), LoadErrorReason.INVALID_DATA, ) @@ -688,8 +634,7 @@ class Loader: # but since we haven't loaded those yet that's impossible. if self._elements[filename].dependencies: raise LoadError( - "Dependencies are forbidden for 'junction' elements", - LoadErrorReason.INVALID_JUNCTION, + "Dependencies are forbidden for 'junction' elements", LoadErrorReason.INVALID_JUNCTION, ) element = Element._new_from_meta(meta_element) @@ -699,28 +644,17 @@ class Loader: # find loader for that project. if element.target: subproject_loader = self._get_loader( - element.target_junction, - rewritable=rewritable, - ticker=ticker, - level=level, - provenance=provenance, + element.target_junction, rewritable=rewritable, ticker=ticker, level=level, provenance=provenance, ) loader = subproject_loader._get_loader( - element.target_element, - rewritable=rewritable, - ticker=ticker, - level=level, - provenance=provenance, + element.target_element, rewritable=rewritable, ticker=ticker, level=level, provenance=provenance, ) self._loaders[filename] = loader return loader # Handle the case where a subproject needs to be fetched # - if ( - element._get_consistency() >= Consistency.RESOLVED - and not element._source_cached() - ): + if element._get_consistency() >= Consistency.RESOLVED and not element._source_cached(): if ticker: ticker(filename, "Fetching subproject") self._fetch_subprojects([element]) @@ -728,13 +662,9 @@ class Loader: # Handle the case where a subproject has no ref # elif element._get_consistency() == Consistency.INCONSISTENT: - detail = "Try tracking the junction element with `bst source track {}`".format( - filename - ) + detail = "Try tracking the junction element with `bst source track {}`".format(filename) raise LoadError( - "{}Subproject has no ref for junction: {}".format( - provenance_str, filename - ), + "{}Subproject has no ref for junction: {}".format(provenance_str, filename), LoadErrorReason.SUBPROJECT_INCONSISTENT, detail=detail, ) @@ -747,11 +677,7 @@ class Loader: # Stage sources element._set_required() basedir = os.path.join( - self.project.directory, - ".bst", - "staged-junctions", - filename, - element._get_cache_key(), + self.project.directory, ".bst", "staged-junctions", filename, element._get_cache_key(), ) if not os.path.exists(basedir): os.makedirs(basedir, exist_ok=True) @@ -773,17 +699,12 @@ class Loader: except LoadError as e: if e.reason == LoadErrorReason.MISSING_PROJECT_CONF: message = ( - provenance_str - + "Could not find the project.conf file in the project " + provenance_str + "Could not find the project.conf file in the project " "referred to by junction element '{}'.".format(element.name) ) if element.path: - message += " Was expecting it at path '{}' in the junction's source.".format( - element.path - ) - raise LoadError( - message=message, reason=LoadErrorReason.INVALID_JUNCTION - ) from e + message += " Was expecting it at path '{}' in the junction's source.".format(element.path) + raise LoadError(message=message, reason=LoadErrorReason.INVALID_JUNCTION) from e # Otherwise, we don't know the reason, so just raise raise @@ -817,9 +738,7 @@ class Loader: return None, junction_path[-1], self else: self._load_file(junction_path[-2], rewritable, ticker) - loader = self._get_loader( - junction_path[-2], rewritable=rewritable, ticker=ticker - ) + loader = self._get_loader(junction_path[-2], rewritable=rewritable, ticker=ticker) return junction_path[-2], junction_path[-1], loader # Print a warning message, checks warning_token against project configuration |