summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenjamin Schubert <contact@benschubert.me>2020-05-14 07:36:57 +0000
committerbst-marge-bot <marge-bot@buildstream.build>2020-05-19 08:31:46 +0000
commita8b322246b54a5061fac9d47e743534b1c15fc08 (patch)
tree11b68228831bfb029a4bbd5deba315415f9abb30
parentef00fc2f384631a001442b5cd2b5765c58809720 (diff)
downloadbuildstream-bschubert/ensure-composite-works-with-variables.tar.gz
node.pyx: Deep clone ScalarNode toobschubert/ensure-composite-works-with-variables
This ensures that when resolving variables, we do not overwrite the values for a different element in the case we were using composition.
-rw-r--r--src/buildstream/node.pyx6
-rw-r--r--tests/format/variables.py21
-rw-r--r--tests/format/variables/shared_variables/one.bst6
-rw-r--r--tests/format/variables/shared_variables/project.conf2
-rw-r--r--tests/format/variables/shared_variables/shared.yml3
-rw-r--r--tests/format/variables/shared_variables/two.bst6
6 files changed, 42 insertions, 2 deletions
diff --git a/src/buildstream/node.pyx b/src/buildstream/node.pyx
index ea61d9366..32b8c130c 100644
--- a/src/buildstream/node.pyx
+++ b/src/buildstream/node.pyx
@@ -106,7 +106,7 @@ cdef class Node:
raise NotImplementedError()
cpdef object strip_node_info(self):
- """ Remove all the node information (provenance) and return the underlying data as plain python objects
+ """ Remove all the node information (provenance) and return the underlying data as plain python objects
Returns:
(list, dict, str, None): the underlying data that was held in the node structure.
@@ -420,7 +420,9 @@ cdef class ScalarNode(Node):
#############################################################
cpdef ScalarNode clone(self):
- return self
+ return ScalarNode.__new__(
+ ScalarNode, self.file_index, self.line, self.column, self.value
+ )
cpdef object strip_node_info(self):
return self.value
diff --git a/tests/format/variables.py b/tests/format/variables.py
index 81bda291b..5f07067f3 100644
--- a/tests/format/variables.py
+++ b/tests/format/variables.py
@@ -117,3 +117,24 @@ def test_use_of_protected_var_in_element(cli, datafiles, protected_var):
result = cli.run(project=project, args=["build", "target.bst"])
result.assert_main_error(ErrorDomain.LOAD, LoadErrorReason.PROTECTED_VARIABLE_REDEFINED)
+
+
+@pytest.mark.datafiles(os.path.join(DATA_DIR, "shared_variables"))
+def test_variables_are_resolved_in_elements_context(cli, datafiles):
+ project = str(datafiles)
+
+ result = cli.run(project=project, args=["build"])
+ result.assert_success()
+
+ checkout_dir = os.path.join(project, "checkout")
+ for elem in ["one", "two"]:
+ result = cli.run(
+ project=project,
+ args=["artifact", "checkout", "--directory", os.path.join(checkout_dir, elem), "{}.bst".format(elem)],
+ )
+ result.assert_success()
+
+ assert (os.listdir(os.path.join(checkout_dir, "one")), os.listdir(os.path.join(checkout_dir, "two"))) == (
+ ["one.bst"],
+ ["two.bst"],
+ )
diff --git a/tests/format/variables/shared_variables/one.bst b/tests/format/variables/shared_variables/one.bst
new file mode 100644
index 000000000..0f19e91b1
--- /dev/null
+++ b/tests/format/variables/shared_variables/one.bst
@@ -0,0 +1,6 @@
+kind: import
+
+(@): shared.yml
+
+variables:
+ import-path: one.bst
diff --git a/tests/format/variables/shared_variables/project.conf b/tests/format/variables/shared_variables/project.conf
new file mode 100644
index 000000000..ee1dfb2c7
--- /dev/null
+++ b/tests/format/variables/shared_variables/project.conf
@@ -0,0 +1,2 @@
+name: shared-vars
+min-version: 2.0
diff --git a/tests/format/variables/shared_variables/shared.yml b/tests/format/variables/shared_variables/shared.yml
new file mode 100644
index 000000000..8266757cd
--- /dev/null
+++ b/tests/format/variables/shared_variables/shared.yml
@@ -0,0 +1,3 @@
+sources:
+ - kind: local
+ path: "%{import-path}"
diff --git a/tests/format/variables/shared_variables/two.bst b/tests/format/variables/shared_variables/two.bst
new file mode 100644
index 000000000..ad621d760
--- /dev/null
+++ b/tests/format/variables/shared_variables/two.bst
@@ -0,0 +1,6 @@
+kind: import
+
+(@): shared.yml
+
+variables:
+ import-path: two.bst