summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbst-marge-bot <marge-bot@buildstream.build>2020-07-29 13:13:26 +0000
committerbst-marge-bot <marge-bot@buildstream.build>2020-07-29 13:13:26 +0000
commit0fee511a240d4b49532f9d2c2c3cf9fe0baebf7b (patch)
tree7204ce4e46795cce4967f9d79911c48caffc55eb
parentd300a7621403e0ddbeeea2e0fa5446f166736b3e (diff)
parent840c32d61eb934ad94e0ee8d0a7b69bceaf27156 (diff)
downloadbuildstream-0fee511a240d4b49532f9d2c2c3cf9fe0baebf7b.tar.gz
Merge branch 'tristan/bst-1/options-order' into 'bst-1'
Append lists when merging conditional statements (bst-1) See merge request BuildStream/buildstream!2003
-rw-r--r--buildstream/_yaml.py15
-rw-r--r--tests/format/include.py24
-rw-r--r--tests/format/include/conditional-conflicts-complex/element.bst1
-rw-r--r--tests/format/include/conditional-conflicts-complex/enable_work_around.yml5
-rw-r--r--tests/format/include/conditional-conflicts-complex/extra_conf.yml5
-rw-r--r--tests/format/include/conditional-conflicts-complex/extra_conf_i586.yml4
-rw-r--r--tests/format/include/conditional-conflicts-complex/extra_conf_x86_64.yml4
-rw-r--r--tests/format/include/conditional-conflicts-complex/options.yml9
-rw-r--r--tests/format/include/conditional-conflicts-complex/project.conf6
-rw-r--r--tests/format/include/conditional-conflicts-complex/work_around.yml3
-rw-r--r--tests/format/include/conditional-conflicts-element/element.bst5
-rw-r--r--tests/format/include/conditional-conflicts-element/extra_conf.yml6
-rw-r--r--tests/format/include/conditional-conflicts-element/project.conf10
-rw-r--r--tests/format/include/conditional-conflicts-element/work_around.yml5
-rw-r--r--tests/format/include/conditional-conflicts-options-included/element.bst1
-rw-r--r--tests/format/include/conditional-conflicts-options-included/extra_conf.yml6
-rw-r--r--tests/format/include/conditional-conflicts-options-included/options.yml9
-rw-r--r--tests/format/include/conditional-conflicts-options-included/project.conf6
-rw-r--r--tests/format/include/conditional-conflicts-options-included/work_around.yml5
-rw-r--r--tests/format/include/conditional-conflicts-project/element.bst1
-rw-r--r--tests/format/include/conditional-conflicts-project/extra_conf.yml6
-rw-r--r--tests/format/include/conditional-conflicts-project/project.conf14
-rw-r--r--tests/format/include/conditional-conflicts-project/work_around.yml5
-rw-r--r--tests/format/include/conditional-conflicts-toplevel-precedence/element.bst1
-rw-r--r--tests/format/include/conditional-conflicts-toplevel-precedence/extra_conf.yml6
-rw-r--r--tests/format/include/conditional-conflicts-toplevel-precedence/project.conf22
-rw-r--r--tests/format/include/conditional-conflicts-toplevel-precedence/work_around.yml5
27 files changed, 188 insertions, 1 deletions
diff --git a/buildstream/_yaml.py b/buildstream/_yaml.py
index 4f2f88329..405a10ec8 100644
--- a/buildstream/_yaml.py
+++ b/buildstream/_yaml.py
@@ -738,7 +738,20 @@ def composite_list(target_node, source_node, key):
"{}: List cannot overwrite value at: {}"
.format(source_key_provenance, target_key_provenance))
- composite_list_overwrite(target_node, key, source_node, key)
+ # Special case: The `project.conf` in some cases needs to composite
+ # include files before having resolved options, so there can be
+ # conditionals that need to be merged at this point.
+ #
+ # This unconditionally appends conditional statements to a matching
+ # conditional in the target so as to preserve them. The precedence
+ # of include files is preserved regardless due to the order in which
+ # included dictionaries are composited.
+ #
+ if key == "(?)":
+ composite_list_append(target_node, key, source_node, key)
+ else:
+ composite_list_overwrite(target_node, key, source_node, key)
+
return True
# When a composite list is encountered in the source, then
diff --git a/tests/format/include.py b/tests/format/include.py
index cfbfb66e3..f844eadc5 100644
--- a/tests/format/include.py
+++ b/tests/format/include.py
@@ -205,6 +205,30 @@ def test_conditional_in_fragment(cli, tmpdir, datafiles):
assert loaded['size'] == '8'
+@pytest.mark.parametrize(
+ "project_dir",
+ [
+ "conditional-conflicts-project",
+ "conditional-conflicts-element",
+ "conditional-conflicts-options-included",
+ "conditional-conflicts-complex",
+ "conditional-conflicts-toplevel-precedence",
+ ],
+)
+@pytest.mark.datafiles(DATA_DIR)
+def test_preserve_conditionals(cli, datafiles, project_dir):
+ project = os.path.join(str(datafiles), project_dir)
+
+ result = cli.run(
+ project=project,
+ args=["-o", "build_arch", "i586", "show", "--deps", "none", "--format", "%{vars}", "element.bst"],
+ )
+ result.assert_success()
+ loaded = _yaml.load_data(result.output)
+ assert loaded["enable-work-around"] == "true"
+ assert loaded["size"] == "4"
+
+
@pytest.mark.datafiles(DATA_DIR)
def test_inner(cli, datafiles):
project = os.path.join(str(datafiles), 'inner')
diff --git a/tests/format/include/conditional-conflicts-complex/element.bst b/tests/format/include/conditional-conflicts-complex/element.bst
new file mode 100644
index 000000000..4d7f70266
--- /dev/null
+++ b/tests/format/include/conditional-conflicts-complex/element.bst
@@ -0,0 +1 @@
+kind: manual
diff --git a/tests/format/include/conditional-conflicts-complex/enable_work_around.yml b/tests/format/include/conditional-conflicts-complex/enable_work_around.yml
new file mode 100644
index 000000000..7e56ae727
--- /dev/null
+++ b/tests/format/include/conditional-conflicts-complex/enable_work_around.yml
@@ -0,0 +1,5 @@
+variables:
+ enable-work-around: "false"
+ (?):
+ - build_arch == "i586":
+ enable-work-around: "true"
diff --git a/tests/format/include/conditional-conflicts-complex/extra_conf.yml b/tests/format/include/conditional-conflicts-complex/extra_conf.yml
new file mode 100644
index 000000000..a25eabe23
--- /dev/null
+++ b/tests/format/include/conditional-conflicts-complex/extra_conf.yml
@@ -0,0 +1,5 @@
+(?):
+- build_arch == "i586":
+ (@): extra_conf_i586.yml
+- build_arch == "x86_64":
+ (@): extra_conf_x86_64.yml
diff --git a/tests/format/include/conditional-conflicts-complex/extra_conf_i586.yml b/tests/format/include/conditional-conflicts-complex/extra_conf_i586.yml
new file mode 100644
index 000000000..caf872b98
--- /dev/null
+++ b/tests/format/include/conditional-conflicts-complex/extra_conf_i586.yml
@@ -0,0 +1,4 @@
+variables:
+ (?):
+ - build_arch == "i586":
+ size: 4
diff --git a/tests/format/include/conditional-conflicts-complex/extra_conf_x86_64.yml b/tests/format/include/conditional-conflicts-complex/extra_conf_x86_64.yml
new file mode 100644
index 000000000..9c5f64630
--- /dev/null
+++ b/tests/format/include/conditional-conflicts-complex/extra_conf_x86_64.yml
@@ -0,0 +1,4 @@
+variables:
+ (?):
+ - build_arch == "x86_64":
+ size: 8
diff --git a/tests/format/include/conditional-conflicts-complex/options.yml b/tests/format/include/conditional-conflicts-complex/options.yml
new file mode 100644
index 000000000..8bb07305a
--- /dev/null
+++ b/tests/format/include/conditional-conflicts-complex/options.yml
@@ -0,0 +1,9 @@
+
+options:
+ build_arch:
+ type: arch
+ description: Architecture
+ variable: build_arch
+ values:
+ - i586
+ - x86_64
diff --git a/tests/format/include/conditional-conflicts-complex/project.conf b/tests/format/include/conditional-conflicts-complex/project.conf
new file mode 100644
index 000000000..2c7ca7044
--- /dev/null
+++ b/tests/format/include/conditional-conflicts-complex/project.conf
@@ -0,0 +1,6 @@
+name: test
+
+(@):
+- extra_conf.yml
+- work_around.yml
+- options.yml
diff --git a/tests/format/include/conditional-conflicts-complex/work_around.yml b/tests/format/include/conditional-conflicts-complex/work_around.yml
new file mode 100644
index 000000000..d7e3ec1dc
--- /dev/null
+++ b/tests/format/include/conditional-conflicts-complex/work_around.yml
@@ -0,0 +1,3 @@
+(?):
+- build_arch == "i586":
+ (@): enable_work_around.yml
diff --git a/tests/format/include/conditional-conflicts-element/element.bst b/tests/format/include/conditional-conflicts-element/element.bst
new file mode 100644
index 000000000..bb1ba25d4
--- /dev/null
+++ b/tests/format/include/conditional-conflicts-element/element.bst
@@ -0,0 +1,5 @@
+kind: manual
+
+(@):
+ - extra_conf.yml
+ - work_around.yml
diff --git a/tests/format/include/conditional-conflicts-element/extra_conf.yml b/tests/format/include/conditional-conflicts-element/extra_conf.yml
new file mode 100644
index 000000000..dd58c9855
--- /dev/null
+++ b/tests/format/include/conditional-conflicts-element/extra_conf.yml
@@ -0,0 +1,6 @@
+variables:
+ (?):
+ - build_arch == "i586":
+ size: "4"
+ - build_arch == "x86_64":
+ size: "8"
diff --git a/tests/format/include/conditional-conflicts-element/project.conf b/tests/format/include/conditional-conflicts-element/project.conf
new file mode 100644
index 000000000..e6ac8a701
--- /dev/null
+++ b/tests/format/include/conditional-conflicts-element/project.conf
@@ -0,0 +1,10 @@
+name: test
+
+options:
+ build_arch:
+ type: arch
+ description: Architecture
+ variable: build_arch
+ values:
+ - i586
+ - x86_64
diff --git a/tests/format/include/conditional-conflicts-element/work_around.yml b/tests/format/include/conditional-conflicts-element/work_around.yml
new file mode 100644
index 000000000..a527fe124
--- /dev/null
+++ b/tests/format/include/conditional-conflicts-element/work_around.yml
@@ -0,0 +1,5 @@
+variables:
+ enable-work-around: "false"
+ (?):
+ - build_arch == "i586":
+ enable-work-around: "true"
diff --git a/tests/format/include/conditional-conflicts-options-included/element.bst b/tests/format/include/conditional-conflicts-options-included/element.bst
new file mode 100644
index 000000000..4d7f70266
--- /dev/null
+++ b/tests/format/include/conditional-conflicts-options-included/element.bst
@@ -0,0 +1 @@
+kind: manual
diff --git a/tests/format/include/conditional-conflicts-options-included/extra_conf.yml b/tests/format/include/conditional-conflicts-options-included/extra_conf.yml
new file mode 100644
index 000000000..dd58c9855
--- /dev/null
+++ b/tests/format/include/conditional-conflicts-options-included/extra_conf.yml
@@ -0,0 +1,6 @@
+variables:
+ (?):
+ - build_arch == "i586":
+ size: "4"
+ - build_arch == "x86_64":
+ size: "8"
diff --git a/tests/format/include/conditional-conflicts-options-included/options.yml b/tests/format/include/conditional-conflicts-options-included/options.yml
new file mode 100644
index 000000000..8bb07305a
--- /dev/null
+++ b/tests/format/include/conditional-conflicts-options-included/options.yml
@@ -0,0 +1,9 @@
+
+options:
+ build_arch:
+ type: arch
+ description: Architecture
+ variable: build_arch
+ values:
+ - i586
+ - x86_64
diff --git a/tests/format/include/conditional-conflicts-options-included/project.conf b/tests/format/include/conditional-conflicts-options-included/project.conf
new file mode 100644
index 000000000..ac1b06ad7
--- /dev/null
+++ b/tests/format/include/conditional-conflicts-options-included/project.conf
@@ -0,0 +1,6 @@
+name: test
+
+(@):
+- options.yml
+- extra_conf.yml
+- work_around.yml
diff --git a/tests/format/include/conditional-conflicts-options-included/work_around.yml b/tests/format/include/conditional-conflicts-options-included/work_around.yml
new file mode 100644
index 000000000..a527fe124
--- /dev/null
+++ b/tests/format/include/conditional-conflicts-options-included/work_around.yml
@@ -0,0 +1,5 @@
+variables:
+ enable-work-around: "false"
+ (?):
+ - build_arch == "i586":
+ enable-work-around: "true"
diff --git a/tests/format/include/conditional-conflicts-project/element.bst b/tests/format/include/conditional-conflicts-project/element.bst
new file mode 100644
index 000000000..4d7f70266
--- /dev/null
+++ b/tests/format/include/conditional-conflicts-project/element.bst
@@ -0,0 +1 @@
+kind: manual
diff --git a/tests/format/include/conditional-conflicts-project/extra_conf.yml b/tests/format/include/conditional-conflicts-project/extra_conf.yml
new file mode 100644
index 000000000..dd58c9855
--- /dev/null
+++ b/tests/format/include/conditional-conflicts-project/extra_conf.yml
@@ -0,0 +1,6 @@
+variables:
+ (?):
+ - build_arch == "i586":
+ size: "4"
+ - build_arch == "x86_64":
+ size: "8"
diff --git a/tests/format/include/conditional-conflicts-project/project.conf b/tests/format/include/conditional-conflicts-project/project.conf
new file mode 100644
index 000000000..82722e2c6
--- /dev/null
+++ b/tests/format/include/conditional-conflicts-project/project.conf
@@ -0,0 +1,14 @@
+name: test
+
+options:
+ build_arch:
+ type: arch
+ description: Architecture
+ variable: build_arch
+ values:
+ - i586
+ - x86_64
+
+(@):
+ - extra_conf.yml
+ - work_around.yml
diff --git a/tests/format/include/conditional-conflicts-project/work_around.yml b/tests/format/include/conditional-conflicts-project/work_around.yml
new file mode 100644
index 000000000..a527fe124
--- /dev/null
+++ b/tests/format/include/conditional-conflicts-project/work_around.yml
@@ -0,0 +1,5 @@
+variables:
+ enable-work-around: "false"
+ (?):
+ - build_arch == "i586":
+ enable-work-around: "true"
diff --git a/tests/format/include/conditional-conflicts-toplevel-precedence/element.bst b/tests/format/include/conditional-conflicts-toplevel-precedence/element.bst
new file mode 100644
index 000000000..4d7f70266
--- /dev/null
+++ b/tests/format/include/conditional-conflicts-toplevel-precedence/element.bst
@@ -0,0 +1 @@
+kind: manual
diff --git a/tests/format/include/conditional-conflicts-toplevel-precedence/extra_conf.yml b/tests/format/include/conditional-conflicts-toplevel-precedence/extra_conf.yml
new file mode 100644
index 000000000..dd58c9855
--- /dev/null
+++ b/tests/format/include/conditional-conflicts-toplevel-precedence/extra_conf.yml
@@ -0,0 +1,6 @@
+variables:
+ (?):
+ - build_arch == "i586":
+ size: "4"
+ - build_arch == "x86_64":
+ size: "8"
diff --git a/tests/format/include/conditional-conflicts-toplevel-precedence/project.conf b/tests/format/include/conditional-conflicts-toplevel-precedence/project.conf
new file mode 100644
index 000000000..1a970acde
--- /dev/null
+++ b/tests/format/include/conditional-conflicts-toplevel-precedence/project.conf
@@ -0,0 +1,22 @@
+name: test
+
+options:
+ build_arch:
+ type: arch
+ description: Architecture
+ variable: build_arch
+ values:
+ - i586
+ - x86_64
+
+# The work_around.yml sets this to false in it's conditional
+# and we set it to true, testing here that the including
+# fragment still takes precedence over any included fragments.
+variables:
+ (?):
+ - build_arch == "i586":
+ enable-work-around: "true"
+
+(@):
+ - extra_conf.yml
+ - work_around.yml
diff --git a/tests/format/include/conditional-conflicts-toplevel-precedence/work_around.yml b/tests/format/include/conditional-conflicts-toplevel-precedence/work_around.yml
new file mode 100644
index 000000000..e9991aaba
--- /dev/null
+++ b/tests/format/include/conditional-conflicts-toplevel-precedence/work_around.yml
@@ -0,0 +1,5 @@
+variables:
+ enable-work-around: "true"
+ (?):
+ - build_arch == "i586":
+ enable-work-around: "false"