diff options
author | Tristan Van Berkom <tristan.vanberkom@codethink.co.uk> | 2017-10-11 13:17:17 +0900 |
---|---|---|
committer | Tristan Van Berkom <tristan.vanberkom@codethink.co.uk> | 2017-10-11 13:39:02 +0900 |
commit | 30be82c6f00e437c1dae070e1364083202762d9a (patch) | |
tree | 7ca310c829920d424460f104d7642f47e381c0c0 /buildstream/_options | |
parent | bf679177ffd3041ad72600a87086bee19807753c (diff) | |
download | buildstream-30be82c6f00e437c1dae070e1364083202762d9a.tar.gz |
_options/optionpool.py: Implement the (!) assertion directive
These are processed inline with conditionals and before each
iteration of conditional processing, ensuring that we always
trigger the first assertion ever composited.
Diffstat (limited to 'buildstream/_options')
-rw-r--r-- | buildstream/_options/optionpool.py | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/buildstream/_options/optionpool.py b/buildstream/_options/optionpool.py index 3686ee6e3..22a846f8e 100644 --- a/buildstream/_options/optionpool.py +++ b/buildstream/_options/optionpool.py @@ -170,7 +170,7 @@ class OptionPool(): # Keep processing conditionals on the root node until # all directly nested conditionals are resolved. # - while self.process_conditional(node): + while self.process_one_node(node): pass # Now recurse into nested dictionaries and lists @@ -197,8 +197,17 @@ class OptionPool(): # # Return true if a conditional was processed. # - def process_conditional(self, node): + def process_one_node(self, node): conditions = _yaml.node_get(node, list, '(?)', default_value=[]) or None + assertion = _yaml.node_get(node, str, '(!)', default_value='') or None + + # Process assersions first, we want to abort on the first encountered + # assertion in a given dictionary, and not lose an assertion due to + # it being overwritten by a later assertion which might also trigger. + if assertion is not None: + p = _yaml.node_get_provenance(node, '(!)') + raise LoadError(LoadErrorReason.USER_ASSERTION, + "{}: {}".format(p, assertion.strip())) if conditions is not None: |