summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--buildstream/_yaml.py6
-rw-r--r--tests/yaml/data/listoverwriteempty.yaml3
-rw-r--r--tests/yaml/yaml.py14
3 files changed, 21 insertions, 2 deletions
diff --git a/buildstream/_yaml.py b/buildstream/_yaml.py
index 153e744f4..11b5fd219 100644
--- a/buildstream/_yaml.py
+++ b/buildstream/_yaml.py
@@ -552,8 +552,10 @@ def composite_list_append(target_node, target_key, source_node, source_key):
#
def composite_list_overwrite(target_node, target_key, source_node, source_key):
- source_list = node_get(source_node, list, source_key, default_value=[])
- if not source_list:
+ # We need to handle the legitimate case of overwriting a list with an empty
+ # list, hence the slightly odd default_value of [None] rather than [].
+ source_list = node_get(source_node, list, source_key, default_value=[None])
+ if source_list == [None]:
return False
target_provenance = node_get_provenance(target_node)
diff --git a/tests/yaml/data/listoverwriteempty.yaml b/tests/yaml/data/listoverwriteempty.yaml
new file mode 100644
index 000000000..f97a1eafe
--- /dev/null
+++ b/tests/yaml/data/listoverwriteempty.yaml
@@ -0,0 +1,3 @@
+# Composited on top of basics.yaml, effectively deleting its children list
+children:
+ (=): []
diff --git a/tests/yaml/yaml.py b/tests/yaml/yaml.py
index 0aae28f08..a462e18df 100644
--- a/tests/yaml/yaml.py
+++ b/tests/yaml/yaml.py
@@ -213,6 +213,20 @@ def test_list_composition(datafiles, filename,
assert_provenance(prov_file, prov_line, prov_col, child, 'mood')
+# Test that overwriting a list with an empty list works as expected.
+@pytest.mark.datafiles(os.path.join(DATA_DIR))
+def test_list_deletion(datafiles):
+ base = os.path.join(datafiles.dirname, datafiles.basename, 'basics.yaml')
+ overlay = os.path.join(datafiles.dirname, datafiles.basename, 'listoverwriteempty.yaml')
+
+ base = _yaml.load(base, shortname='basics.yaml')
+ overlay = _yaml.load(overlay, shortname='listoverwriteempty.yaml')
+ _yaml.composite_dict(base, overlay)
+
+ children = _yaml.node_get(base, list, 'children')
+ assert len(children) == 0
+
+
# Tests for deep list composition
#
# Same as test_list_composition(), but adds an additional file