diff --git a/src/buildstream/_loader/loader.py b/src/buildstream/_loader/loader.py index 25548dd81..8f79eda53 100644 --- a/src/buildstream/_loader/loader.py +++ b/src/buildstream/_loader/loader.py @@ -128,6 +128,15 @@ def load(self, targets): for target in targets: with PROFILER.profile(Topics.LOAD_PROJECT, target): + + # As we are attempting to load a subproject element via the + # command line ensure fully loaded. + # + # Other callers of `_parse_name` or `_load_file` that reference + # files through a project element or otherwise do not need to + # ensure fully loaded. + self.project.ensure_fully_loaded() + _junction, name, loader = self._parse_name(target, None) element = loader._load_file(name, None) target_elements.append(element) @@ -190,14 +199,6 @@ 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: @@ -796,15 +797,12 @@ def provenance_str(): # immediately and move on to the target. # if load_element.link_target: - _, filename, loader = self._parse_name( - load_element.link_target.as_str(), load_element.link_target, load_subprojects=load_subprojects + return self.get_loader( + load_element.link_target.as_str(), + load_element.link_target, + load_subprojects=load_subprojects, ) - if not loader: - # `loader` should never be None if `load_subprojects` is True - assert not load_subprojects - return None - return loader.get_loader(filename, load_element.link_target, load_subprojects=load_subprojects) # If we're only performing a lookup, we're done here. # diff --git a/tests/format/junctions.py b/tests/format/junctions.py index 458aa3a53..bf4919b94 100644 --- a/tests/format/junctions.py +++ b/tests/format/junctions.py @@ -593,10 +593,17 @@ def test_override_twice(cli, tmpdir, datafiles): @pytest.mark.parametrize( "target,expected_result", [ - ("target.bst", "pony"), - ("self-junction.bst:target.bst", "horsy"), + ("subproject.bst:target.bst", "pony"), + ("subproject.bst:self-junction.bst:target.bst", "horsy"), + ("link.bst", "pony"), + ("nested-link.bst", "horsy"), + ], + ids=[ + "direct-target", + "override-target", + "link-target", + "link-override-target", ], - ids=["direct-target", "override-target"], ) def test_override_self(cli, datafiles, target, expected_result): project = os.path.join(str(datafiles), "override-self") @@ -922,7 +929,7 @@ def test_include_vars_optional(cli, datafiles, use_species, expected_result): @pytest.mark.datafiles(DATA_DIR) @pytest.mark.parametrize( "target", - ["target.bst", "subproject.bst:target.bst"], + ["target.bst", "subproject.bst:target.bst", "intermediate-project.bst:subproject.bst:target.bst"], ids=["toplevel-target", "subproject-target"], ) @pytest.mark.parametrize( diff --git a/tests/format/junctions/include-complex/alternative-placeholder.bst b/tests/format/junctions/include-complex/alternative-placeholder.bst new file mode 100644 index 000000000..066a03328 --- /dev/null +++ b/tests/format/junctions/include-complex/alternative-placeholder.bst @@ -0,0 +1 @@ +kind: stack diff --git a/tests/format/junctions/include-complex/intermediate-project.bst b/tests/format/junctions/include-complex/intermediate-project.bst new file mode 100644 index 000000000..25d9930f5 --- /dev/null +++ b/tests/format/junctions/include-complex/intermediate-project.bst @@ -0,0 +1,12 @@ +kind: junction + +sources: +- kind: local + path: intermediate-project + +config: + overrides: + subproject.bst:placeholder.bst: alternative-placeholder.bst + + options: + animal: '%{animal}' diff --git a/tests/format/junctions/include-complex/intermediate-project/project.conf b/tests/format/junctions/include-complex/intermediate-project/project.conf new file mode 100644 index 000000000..9a00c9e7f --- /dev/null +++ b/tests/format/junctions/include-complex/intermediate-project/project.conf @@ -0,0 +1,15 @@ +name: intermediate-project +min-version: 2.0 + +(@): +- subproject.bst:include.yml + +options: + animal: + type: enum + description: the animal + values: + - pony + - horsy + default: pony + variable: animal diff --git a/tests/format/junctions/include-complex/intermediate-project/subproject.bst b/tests/format/junctions/include-complex/intermediate-project/subproject.bst new file mode 100644 index 000000000..4d1041390 --- /dev/null +++ b/tests/format/junctions/include-complex/intermediate-project/subproject.bst @@ -0,0 +1,9 @@ +kind: junction +sources: +- kind: local + path: subproject + +config: + + options: + target_animal: '%{animal}' diff --git a/tests/format/junctions/include-complex/subproject/include.yml b/tests/format/junctions/include-complex/intermediate-project/subproject/include.yml similarity index 100% rename from tests/format/junctions/include-complex/subproject/include.yml rename to tests/format/junctions/include-complex/intermediate-project/subproject/include.yml diff --git a/tests/format/junctions/include-complex/intermediate-project/subproject/placeholder.bst b/tests/format/junctions/include-complex/intermediate-project/subproject/placeholder.bst new file mode 100644 index 000000000..066a03328 --- /dev/null +++ b/tests/format/junctions/include-complex/intermediate-project/subproject/placeholder.bst @@ -0,0 +1 @@ +kind: stack diff --git a/tests/format/junctions/include-complex/subproject/project.conf b/tests/format/junctions/include-complex/intermediate-project/subproject/project.conf similarity index 85% rename from tests/format/junctions/include-complex/subproject/project.conf rename to tests/format/junctions/include-complex/intermediate-project/subproject/project.conf index ad8a3b3de..700da1a30 100644 --- a/tests/format/junctions/include-complex/subproject/project.conf +++ b/tests/format/junctions/include-complex/intermediate-project/subproject/project.conf @@ -9,3 +9,4 @@ options: - pony - horsy default: pony + variable: target_animal diff --git a/tests/format/junctions/include-complex/subproject/target.bst b/tests/format/junctions/include-complex/intermediate-project/subproject/target.bst similarity index 100% rename from tests/format/junctions/include-complex/subproject/target.bst rename to tests/format/junctions/include-complex/intermediate-project/subproject/target.bst diff --git a/tests/format/junctions/include-complex/subproject.bst b/tests/format/junctions/include-complex/subproject.bst index daaea3091..191cd8051 100644 --- a/tests/format/junctions/include-complex/subproject.bst +++ b/tests/format/junctions/include-complex/subproject.bst @@ -1,8 +1,4 @@ -kind: junction -sources: -- kind: local - path: subproject +kind: link config: - options: - target_animal: '%{animal}' + target: intermediate-project.bst:subproject.bst diff --git a/tests/format/junctions/override-self/link.bst b/tests/format/junctions/override-self/link.bst new file mode 100644 index 000000000..3da195d89 --- /dev/null +++ b/tests/format/junctions/override-self/link.bst @@ -0,0 +1,4 @@ +kind: link + +config: + target: subproject.bst:target.bst diff --git a/tests/format/junctions/override-self/nested-link.bst b/tests/format/junctions/override-self/nested-link.bst new file mode 100644 index 000000000..fa2b2b571 --- /dev/null +++ b/tests/format/junctions/override-self/nested-link.bst @@ -0,0 +1,4 @@ +kind: link + +config: + target: subproject.bst:self-junction.bst:target.bst diff --git a/tests/format/junctions/override-self/project.conf b/tests/format/junctions/override-self/project.conf index cb98a9a41..ed7370c4f 100644 --- a/tests/format/junctions/override-self/project.conf +++ b/tests/format/junctions/override-self/project.conf @@ -1,6 +1,6 @@ name: test min-version: 2.0 -junctions: - internal: - - self-junction.bst + +(@): +- subproject.bst:self-junction.bst:include.yml diff --git a/tests/format/junctions/override-self/subproject.bst b/tests/format/junctions/override-self/subproject.bst new file mode 100644 index 000000000..c88189cb0 --- /dev/null +++ b/tests/format/junctions/override-self/subproject.bst @@ -0,0 +1,4 @@ +kind: junction +sources: +- kind: local + path: subproject diff --git a/tests/format/junctions/override-self/alternative.bst b/tests/format/junctions/override-self/subproject/alternative.bst similarity index 100% rename from tests/format/junctions/override-self/alternative.bst rename to tests/format/junctions/override-self/subproject/alternative.bst diff --git a/tests/format/junctions/override-self/subproject/include.yml b/tests/format/junctions/override-self/subproject/include.yml new file mode 100644 index 000000000..e69de29bb diff --git a/tests/format/junctions/override-self/subproject/project.conf b/tests/format/junctions/override-self/subproject/project.conf new file mode 100644 index 000000000..d3f3752d3 --- /dev/null +++ b/tests/format/junctions/override-self/subproject/project.conf @@ -0,0 +1,9 @@ +name: subproject +min-version: 2.0 + +junctions: + internal: + - self-junction.bst + +# (@): +# - self-junction.bst:include.yml diff --git a/tests/format/junctions/override-self/self-junction.bst b/tests/format/junctions/override-self/subproject/self-junction.bst similarity index 99% rename from tests/format/junctions/override-self/self-junction.bst rename to tests/format/junctions/override-self/subproject/self-junction.bst index aae6eef39..52ea670a0 100644 --- a/tests/format/junctions/override-self/self-junction.bst +++ b/tests/format/junctions/override-self/subproject/self-junction.bst @@ -3,6 +3,7 @@ sources: - kind: local path: . + config: overrides: target.bst: alternative.bst diff --git a/tests/format/junctions/override-self/target.bst b/tests/format/junctions/override-self/subproject/target.bst similarity index 100% rename from tests/format/junctions/override-self/target.bst rename to tests/format/junctions/override-self/subproject/target.bst