diff --git a/buildstream/element.py b/buildstream/element.py index 54b764eb96df2d1d2fce3aad1764309d0749659c..bc939bc92fed0efc04a97dee1d20c23b636d8abd 100644 --- a/buildstream/element.py +++ b/buildstream/element.py @@ -685,6 +685,7 @@ class Element(Plugin): files_written = {} old_dep_keys = {} workspace = self._get_workspace() + project = self._get_project() if self.__can_build_incrementally() and workspace.last_successful: old_dep_keys = self.__get_artifact_metadata_dependencies(workspace.last_successful) @@ -746,9 +747,8 @@ class Element(Plugin): overlapping_elements = elements[1:] for elm in overlapping_elements: element = self.search(scope, elm) - element_project = element._get_project() if not element.__file_is_whitelisted(f): - if element_project.fail_on_overlap: + if project.fail_on_overlap: overlap_error_elements.append(elm) overlap_error = True else: diff --git a/tests/frontend/overlaps.py b/tests/frontend/overlaps.py index 36e15acd74b82ac33fd3dffcd8ce615bc24b6166..7c86445f641464266d1e8f0413b5e220b01bed7c 100644 --- a/tests/frontend/overlaps.py +++ b/tests/frontend/overlaps.py @@ -1,6 +1,7 @@ import os import pytest from tests.testutils.runcli import cli +from tests.testutils import generate_junction from buildstream._exceptions import ErrorDomain from buildstream import _yaml @@ -10,15 +11,12 @@ DATA_DIR = os.path.join( "overlaps" ) -project_template = { - "name": "test", - "element-path": "." -} - -def gen_project(project_dir, fail_on_overlap): - template = dict(project_template) - template["fail-on-overlap"] = fail_on_overlap +def gen_project(project_dir, fail_on_overlap, project_name="test"): + template = { + "name": project_name, + "fail-on-overlap": fail_on_overlap + } projectfile = os.path.join(project_dir, "project.conf") _yaml.dump(template, projectfile) @@ -82,3 +80,30 @@ def test_overlaps_script(cli, datafiles): result = cli.run(project=project_dir, silent=True, args=[ 'build', 'script.bst']) result.assert_success() + + +@pytest.mark.datafiles(DATA_DIR) +@pytest.mark.parametrize("project_policy", [('fail'), ('warn')]) +@pytest.mark.parametrize("subproject_policy", [('fail'), ('warn')]) +def test_overlap_subproject(cli, tmpdir, datafiles, project_policy, subproject_policy): + project_dir = str(datafiles) + subproject_dir = os.path.join(project_dir, 'sub-project') + junction_path = os.path.join(project_dir, 'sub-project.bst') + + gen_project(project_dir, bool(project_policy == 'fail'), project_name='test') + gen_project(subproject_dir, bool(subproject_policy == 'fail'), project_name='subtest') + generate_junction(tmpdir, subproject_dir, junction_path) + + # Here we have a dependency chain where the project element + # always overlaps with the subproject element. + # + # Test that overlap error vs warning policy for this overlap + # is always controlled by the project and not the subproject. + # + result = cli.run(project=project_dir, silent=True, args=['build', 'sub-collect.bst']) + if project_policy == 'fail': + result.assert_main_error(ErrorDomain.STREAM, None) + result.assert_task_error(ErrorDomain.ELEMENT, "overlap-error") + else: + result.assert_success() + assert "WARNING Non-whitelisted overlaps detected" in result.stderr diff --git a/tests/frontend/overlaps/sub-collect.bst b/tests/frontend/overlaps/sub-collect.bst new file mode 100644 index 0000000000000000000000000000000000000000..85d327e1b12bb1da234f2517b60feb1f6a53c989 --- /dev/null +++ b/tests/frontend/overlaps/sub-collect.bst @@ -0,0 +1,11 @@ +kind: compose + +depends: +- filename: c.bst + type: build +- filename: a-sub.bst + junction: sub-project.bst + type: build +- filename: z-sub.bst + junction: sub-project.bst + type: build diff --git a/tests/frontend/overlaps/sub-project/a-sub.bst b/tests/frontend/overlaps/sub-project/a-sub.bst new file mode 100644 index 0000000000000000000000000000000000000000..40b8f5d9c656233d3c5919b4074e8fc437d2a474 --- /dev/null +++ b/tests/frontend/overlaps/sub-project/a-sub.bst @@ -0,0 +1,7 @@ +kind: import +config: + source: / + target: / +sources: +- kind: local + path: "files/a" diff --git a/tests/frontend/overlaps/sub-project/files/a/file3 b/tests/frontend/overlaps/sub-project/files/a/file3 new file mode 100644 index 0000000000000000000000000000000000000000..e416e0d0d54d6e26ef0812d7d99dbe4b442bd7fb --- /dev/null +++ b/tests/frontend/overlaps/sub-project/files/a/file3 @@ -0,0 +1 @@ +barny diff --git a/tests/frontend/overlaps/sub-project/files/z/file1 b/tests/frontend/overlaps/sub-project/files/z/file1 new file mode 100644 index 0000000000000000000000000000000000000000..257cc5642cb1a054f08cc83f2d943e56fd3ebe99 --- /dev/null +++ b/tests/frontend/overlaps/sub-project/files/z/file1 @@ -0,0 +1 @@ +foo diff --git a/tests/frontend/overlaps/sub-project/files/z/file2 b/tests/frontend/overlaps/sub-project/files/z/file2 new file mode 100644 index 0000000000000000000000000000000000000000..5716ca5987cbf97d6bb54920bea6adde242d87e6 --- /dev/null +++ b/tests/frontend/overlaps/sub-project/files/z/file2 @@ -0,0 +1 @@ +bar diff --git a/tests/frontend/overlaps/sub-project/z-sub.bst b/tests/frontend/overlaps/sub-project/z-sub.bst new file mode 100644 index 0000000000000000000000000000000000000000..e9729ae31dda3f49bae1df9b78041bfd2753380f --- /dev/null +++ b/tests/frontend/overlaps/sub-project/z-sub.bst @@ -0,0 +1,7 @@ +kind: import +config: + source: / + target: / +sources: +- kind: local + path: "files/z"