def get_loader()

in src/buildstream/_loader/loader.py [0:0]


    def get_loader(self, name, provenance_node, *, load_subprojects=True):
        junction_path = name.split(":")
        loader = self

        #
        # In this case we are attempting to load a subproject element via the
        # command line instead of referencing the subproject through a project
        # element or otherwise.
        #
        if provenance_node is None and load_subprojects:
            self.project.ensure_fully_loaded()

        circular_provenance_node = self._loader_search_provenances.get(name, None)
        if circular_provenance_node and load_subprojects:

            assert provenance_node

            detail = None
            if circular_provenance_node is not provenance_node:
                detail = "Already searching for '{}' at: {}".format(name, circular_provenance_node.get_provenance())
            raise LoadError(
                "{}: Circular reference while searching for '{}'".format(provenance_node.get_provenance(), name),
                LoadErrorReason.CIRCULAR_REFERENCE,
                detail=detail,
            )

        if load_subprojects and provenance_node:
            self._loader_search_provenances[name] = provenance_node

        for junction_name in junction_path:
            loader = loader._get_loader(junction_name, provenance_node, load_subprojects=load_subprojects)
            if not loader:
                # `loader` should never be None if `load_subprojects` is True
                assert not load_subprojects
                return None

        if load_subprojects and provenance_node:
            del self._loader_search_provenances[name]

        return loader