in src/buildstream/_project.py [0:0]
def _load(self, *, parent_loader=None, provenance_node=None):
# Load builtin default
projectfile = os.path.join(self.directory, _PROJECT_CONF_FILE)
self._default_config_node = _yaml.load(_site.default_project_config, shortname="projectconfig.yaml")
# Load project local config and override the builtin
try:
self._project_conf = _yaml.load(projectfile, shortname=_PROJECT_CONF_FILE, project=self)
except LoadError as e:
# Raise a more specific error here
if e.reason == LoadErrorReason.MISSING_FILE:
raise LoadError(str(e), LoadErrorReason.MISSING_PROJECT_CONF) from e
# Otherwise re-raise the original exception
raise
pre_config_node = self._default_config_node.clone()
self._project_conf._composite(pre_config_node)
# Assert project's minimum required version early, before validating toplevel keys
self._validate_version(pre_config_node)
self._validate_toplevel_node(pre_config_node, first_pass=True)
# The project name, element path and option declarations
# are constant and cannot be overridden by option conditional statements
# FIXME: we should be keeping node information for further composition here
self.name = self._project_conf.get_str("name")
# Validate that project name is a valid symbol name
_assert_symbol_name(self.name, "project name", ref_node=pre_config_node.get_node("name"))
self.element_path = os.path.join(
self.directory, self.get_path_from_node(pre_config_node.get_scalar("element-path"), check_is_dir=True)
)
self.config.options = OptionPool(self.element_path)
self.first_pass_config.options = OptionPool(self.element_path)
defaults = pre_config_node.get_mapping("defaults")
defaults.validate_keys(["targets"])
self._default_targets = defaults.get_str_list("targets")
# Fatal warnings
self._fatal_warnings = pre_config_node.get_str_list("fatal-warnings", default=[])
# Junction configuration
junctions_node = pre_config_node.get_mapping("junctions", default={})
junctions_node.validate_keys(["duplicates", "internal", "disallow-subproject-uris"])
if self.junction and self.junction._get_project().disallow_subproject_uris:
# If the parent project doesn't allow subproject URIs, this must
# be enforced for nested subprojects as well.
self.disallow_subproject_uris = True
# The `disallow-subproject-uris` flag also implies fatal `unaliased-url` in subprojects
# to ensure no subproject URIs escape the parent project's control.
if CoreWarnings.UNALIASED_URL not in self._fatal_warnings:
self._fatal_warnings.append(CoreWarnings.UNALIASED_URL)
else:
self.disallow_subproject_uris = junctions_node.get_bool("disallow-subproject-uris", default=False)
# Parse duplicates
junction_duplicates = junctions_node.get_mapping("duplicates", default={})
for project_name, junctions in junction_duplicates.items():
self._junction_duplicates[project_name] = junctions
# Parse internal
self._junction_internal = junctions_node.get_sequence("internal", default=[])
self.loader = Loader(self, parent=parent_loader, provenance_node=provenance_node)
self._project_includes = Includes(self.loader, copy_tree=False)
project_conf_first_pass = self._project_conf.clone()
self._project_includes.process(project_conf_first_pass, only_local=True, process_project_options=False)
config_no_include = self._default_config_node.clone()
project_conf_first_pass._composite(config_no_include)
# Plugin factories must be defined in project.conf, not included from elsewhere.
self._load_plugin_factories(config_no_include)
self._load_pass(config_no_include, self.first_pass_config, ignore_unknown=True)
# Use separate file for storing source references
ref_storage_node = pre_config_node.get_scalar("ref-storage")
self.ref_storage = ref_storage_node.as_str()
if self.ref_storage not in [ProjectRefStorage.INLINE, ProjectRefStorage.PROJECT_REFS]:
p = ref_storage_node.get_provenance()
raise LoadError(
"{}: Invalid value '{}' specified for ref-storage".format(p, self.ref_storage),
LoadErrorReason.INVALID_DATA,
)
if self.ref_storage == ProjectRefStorage.PROJECT_REFS:
self.junction_refs.load(self.first_pass_config.options)