diff options
author | Abderrahim Kitouni <akitouni@gnome.org> | 2020-03-18 11:54:47 +0100 |
---|---|---|
committer | Abderrahim Kitouni <akitouni@gnome.org> | 2020-04-05 09:13:55 +0100 |
commit | 9d837bb19b98e878c4e4ba4bcb3365969138d5a7 (patch) | |
tree | 3328a5b35b081812499c68d837d896937c84bf2f | |
parent | 0c21df1ea72e9509d7ed035752f125ebb0228e56 (diff) | |
download | buildstream-9d837bb19b98e878c4e4ba4bcb3365969138d5a7.tar.gz |
_project.py: resolve options before running the final assertionsabderrahim/options
otherwise, having an optional list append in theh configuration wouldn't work
This also avoids special casing for element and source overrides
-rw-r--r-- | src/buildstream/_project.py | 22 | ||||
-rw-r--r-- | tests/format/option-list-directive.py | 19 | ||||
-rw-r--r-- | tests/format/option-list-directive/project.conf | 18 |
3 files changed, 46 insertions, 13 deletions
diff --git a/src/buildstream/_project.py b/src/buildstream/_project.py index 0593abe6f..7b31f44b8 100644 --- a/src/buildstream/_project.py +++ b/src/buildstream/_project.py @@ -789,15 +789,6 @@ class Project: # def _load_pass(self, config, output, *, ignore_unknown=False): - # Element and Source type configurations will be composited later onto - # element/source types, so we delete it from here and run our final - # assertion after. - output.element_overrides = config.get_mapping("elements", default={}) - output.source_overrides = config.get_mapping("sources", default={}) - config.safe_del("elements") - config.safe_del("sources") - config._assert_fully_composited() - self._load_plugin_factories(config, output) # Load project options @@ -821,11 +812,16 @@ class Project: # Now resolve any conditionals in the remaining configuration, # any conditionals specified for project option declarations, # or conditionally specifying the project name; will be ignored. - # - # Don't forget to also resolve options in the element and source overrides. output.options.process_node(config) - output.options.process_node(output.element_overrides) - output.options.process_node(output.source_overrides) + + # Element and Source type configurations will be composited later onto + # element/source types, so we delete it from here and run our final + # assertion after. + output.element_overrides = config.get_mapping("elements", default={}) + output.source_overrides = config.get_mapping("sources", default={}) + config.safe_del("elements") + config.safe_del("sources") + config._assert_fully_composited() # Load base variables output.base_variables = config.get_mapping("variables") diff --git a/tests/format/option-list-directive.py b/tests/format/option-list-directive.py new file mode 100644 index 000000000..2df5b6f77 --- /dev/null +++ b/tests/format/option-list-directive.py @@ -0,0 +1,19 @@ +# Pylint doesn't play well with fixtures and dependency injection from pytest +# pylint: disable=redefined-outer-name + +import os +import pytest +from buildstream.testing.runcli import cli # pylint: disable=unused-import + +# Project directory +DATA_DIR = os.path.dirname(os.path.realpath(__file__)) + + +@pytest.mark.datafiles(DATA_DIR) +@pytest.mark.parametrize("mount_devices", [("true"), ("false")]) +def test_override(cli, datafiles, mount_devices): + project = os.path.join(datafiles.dirname, datafiles.basename, "option-list-directive") + + bst_args = ["--option", "shell_mount_devices", mount_devices, "build"] + result = cli.run(project=project, silent=True, args=bst_args) + result.assert_success() diff --git a/tests/format/option-list-directive/project.conf b/tests/format/option-list-directive/project.conf new file mode 100644 index 000000000..5b2b64fe8 --- /dev/null +++ b/tests/format/option-list-directive/project.conf @@ -0,0 +1,18 @@ +name: test + +options: + shell_mount_devices: + type: bool + description: whether to mount devices in the shell + default: false + +shell: + host-files: + - '/etc/passwd' + - '/etc/group' + + (?): + - shell_mount_devices: + host-files: + (>): + - '/dev/dri' |