summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTristan Van Berkom <tristan.van.berkom@gmail.com>2019-02-22 10:28:36 +0000
committerTristan Van Berkom <tristan.van.berkom@gmail.com>2019-02-22 10:28:36 +0000
commit79bbefe26a3fcd13d3de558aed6b5b4d5bc1235a (patch)
tree89cda6890943eec6f4c00a60548133dde82223d9
parentc270d09a5bb473a3a7f2f7243440a306b792bc89 (diff)
parentad5264418049b9c18f2030b92e25e331771716dc (diff)
downloadbuildstream-79bbefe26a3fcd13d3de558aed6b5b4d5bc1235a.tar.gz
Merge branch 'tristan/fix-overlap-subproject-policy-1.2' into 'bst-1.2'
Observe fail-on-overlap policy on building element's project See merge request BuildStream/buildstream!1172
-rw-r--r--buildstream/element.py4
-rw-r--r--tests/frontend/overlaps.py41
-rw-r--r--tests/frontend/overlaps/sub-collect.bst11
-rw-r--r--tests/frontend/overlaps/sub-project/a-sub.bst7
-rw-r--r--tests/frontend/overlaps/sub-project/files/a/file31
-rw-r--r--tests/frontend/overlaps/sub-project/files/z/file11
-rw-r--r--tests/frontend/overlaps/sub-project/files/z/file21
-rw-r--r--tests/frontend/overlaps/sub-project/z-sub.bst7
8 files changed, 63 insertions, 10 deletions
diff --git a/buildstream/element.py b/buildstream/element.py
index 54b764eb9..bc939bc92 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 36e15acd7..7c86445f6 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 000000000..85d327e1b
--- /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 000000000..40b8f5d9c
--- /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 000000000..e416e0d0d
--- /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 000000000..257cc5642
--- /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 000000000..5716ca598
--- /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 000000000..e9729ae31
--- /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"