summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDor Askayo <dor.askayo@gmail.com>2019-01-26 01:53:42 +0200
committerJames Ennis <james.ennis@codethink.com>2019-02-05 08:45:11 +0000
commit880a5c9a5237544559d126d1666150c865dabc16 (patch)
tree12c1faf1f2c7aa74d965c450d6da6e899e02d4dd
parentf4fa33c8583607d8f481259a81fd77bf1ef33945 (diff)
downloadbuildstream-doraskayo/filter-indirect-deps-fix-1.2.tar.gz
filter.py: don't recurse when staging dependenciesdoraskayo/filter-indirect-deps-fix-1.2
Also bump the element's version so cached artifacts would be invalidated. Fixes #883 (cherry picked from commit 03111d39e093b11ffc6589071f2f5040d5f61ab4)
-rw-r--r--buildstream/plugins/elements/filter.py6
-rw-r--r--tests/plugins/filter.py20
-rw-r--r--tests/plugins/filter/basic/elements/input-with-deps.bst14
-rw-r--r--tests/plugins/filter/basic/elements/output-include-with-indirect-deps.bst5
4 files changed, 43 insertions, 2 deletions
diff --git a/buildstream/plugins/elements/filter.py b/buildstream/plugins/elements/filter.py
index 22fddd14f..b2c292261 100644
--- a/buildstream/plugins/elements/filter.py
+++ b/buildstream/plugins/elements/filter.py
@@ -47,7 +47,9 @@ from buildstream import Element, ElementError, Scope
class FilterElement(Element):
# pylint: disable=attribute-defined-outside-init
- # The filter element's output is it's dependencies, so
+ BST_ARTIFACT_VERSION = 1
+
+ # The filter element's output is its dependencies, so
# we must rebuild if the dependencies change even when
# not in strict build plans.
BST_STRICT_REBUILD = True
@@ -102,7 +104,7 @@ class FilterElement(Element):
def assemble(self, sandbox):
with self.timed_activity("Staging artifact", silent_nested=True):
- for dep in self.dependencies(Scope.BUILD):
+ for dep in self.dependencies(Scope.BUILD, recurse=False):
dep.stage_artifact(sandbox, include=self.include,
exclude=self.exclude, orphans=self.include_orphans)
return ""
diff --git a/tests/plugins/filter.py b/tests/plugins/filter.py
index 559815a8b..982b6d2c2 100644
--- a/tests/plugins/filter.py
+++ b/tests/plugins/filter.py
@@ -452,3 +452,23 @@ def test_filter_track_multi_exclude(datafiles, cli, tmpdir):
assert "ref" not in new_input["sources"][0]
new_input2 = _yaml.load(input2_file)
assert new_input2["sources"][0]["ref"] == ref
+
+
+@pytest.mark.datafiles(os.path.join(DATA_DIR, 'basic'))
+def test_filter_include_with_indirect_deps(datafiles, cli, tmpdir):
+ project = os.path.join(datafiles.dirname, datafiles.basename)
+ result = cli.run(project=project, args=[
+ 'build', 'output-include-with-indirect-deps.bst'])
+ result.assert_success()
+
+ checkout = os.path.join(tmpdir.dirname, tmpdir.basename, 'checkout')
+ result = cli.run(project=project, args=[
+ 'checkout', 'output-include-with-indirect-deps.bst', checkout])
+ result.assert_success()
+
+ # direct dependencies should be staged and filtered
+ assert os.path.exists(os.path.join(checkout, "baz"))
+
+ # indirect dependencies shouldn't be staged and filtered
+ assert not os.path.exists(os.path.join(checkout, "foo"))
+ assert not os.path.exists(os.path.join(checkout, "bar"))
diff --git a/tests/plugins/filter/basic/elements/input-with-deps.bst b/tests/plugins/filter/basic/elements/input-with-deps.bst
new file mode 100644
index 000000000..50aab573c
--- /dev/null
+++ b/tests/plugins/filter/basic/elements/input-with-deps.bst
@@ -0,0 +1,14 @@
+kind: import
+
+depends:
+- filename: input.bst
+
+sources:
+- kind: local
+ path: files
+
+public:
+ bst:
+ split-rules:
+ baz:
+ - /baz
diff --git a/tests/plugins/filter/basic/elements/output-include-with-indirect-deps.bst b/tests/plugins/filter/basic/elements/output-include-with-indirect-deps.bst
new file mode 100644
index 000000000..8325853e2
--- /dev/null
+++ b/tests/plugins/filter/basic/elements/output-include-with-indirect-deps.bst
@@ -0,0 +1,5 @@
+kind: filter
+
+depends:
+- filename: input-with-deps.bst
+ type: build