in src/buildstream/_loader/loader.py [0:0]
def _load_file_no_deps(self, filename, provenance_node=None):
self._assert_element_name(filename, provenance_node)
# 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=self.load_context.rewritable, project=self.project
)
except LoadError as e:
if e.reason == LoadErrorReason.MISSING_FILE:
if self.project.junction:
message = "Could not find element '{}' in project referred to by junction element '{}'".format(
filename, self.project.junction.name
)
else:
message = "Could not find element '{}' in elements directory '{}'".format(filename, self._basedir)
if provenance_node:
message = "{}: {}".format(provenance_node.get_provenance(), message)
# If we can't find the file, try to suggest plausible
# alternatives by stripping the element-path from the given
# filename, and verifying that it exists.
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)):
detail = "Did you mean '{}'?".format(element_relpath)
raise LoadError(message, LoadErrorReason.MISSING_FILE, detail=detail) from e
# Otherwise, we don't know the reason, so just raise
raise
kind = node.get_str(Symbol.KIND)
if kind in ("junction", "link"):
self._first_pass_options.process_node(node)
else:
self.project.ensure_fully_loaded()
self._includes.process(node)
element = LoadElement(node, filename, self)
self._elements[filename] = element
#
# Update link caches in the ancestry
#
if element.link_target is not None:
link_path = filename
target_path = element.link_target.as_str() # pylint: disable=no-member
# First resolve the link in this loader's cache
#
self._resolve_link(link_path, target_path)
# Now resolve the link in parent project loaders
#
loader = self
while loader._parent:
junction = loader.project.junction
link_path = junction.name + ":" + link_path
target_path = junction.name + ":" + target_path
# Resolve the link
loader = loader._parent
loader._resolve_link(link_path, target_path)
return element