summaryrefslogtreecommitdiff
path: root/src/buildstream/_loader/loader.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/buildstream/_loader/loader.py')
-rw-r--r--src/buildstream/_loader/loader.py155
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