From af5157422f1f24617936c90a370e58c45ae62647 Mon Sep 17 00:00:00 2001 From: Tristan Maat Date: Thu, 2 Nov 2017 17:03:44 +0000 Subject: Issue #142: Ensure we don't append provenances twice --- buildstream/_options/optionpool.py | 11 +++++++++-- buildstream/_yaml.py | 4 +--- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/buildstream/_options/optionpool.py b/buildstream/_options/optionpool.py index 41990ce4a..f38682aec 100644 --- a/buildstream/_options/optionpool.py +++ b/buildstream/_options/optionpool.py @@ -233,12 +233,19 @@ class OptionPool(): expression, value = tuples[0] try: - if self.evaluate(expression): - _yaml.composite(node, value) + apply_fragment = self.evaluate(expression) except LoadError as e: # Prepend the provenance of the error raise LoadError(e.reason, "{}: {}".format(p, e)) from e + if not hasattr(value, 'get'): + raise LoadError(LoadErrorReason.ILLEGAL_COMPOSITE, + "{}: Only values of type 'dict' can be composed.".format(p)) + + # Apply the yaml fragment if its condition evaluates to true + if apply_fragment: + _yaml.composite(node, value) + return True return False diff --git a/buildstream/_yaml.py b/buildstream/_yaml.py index 6b1464272..376d3dd7e 100644 --- a/buildstream/_yaml.py +++ b/buildstream/_yaml.py @@ -745,9 +745,7 @@ def composite_dict(target, source, path=None): # Like composite_dict(), but raises an all purpose LoadError for convenience # def composite(target, source): - if not hasattr(source, 'get'): - raise LoadError(LoadErrorReason.ILLEGAL_COMPOSITE, - "Only values of type 'dict' can be composed.") + assert hasattr(source, 'get') source_provenance = node_get_provenance(source) try: -- cgit v1.2.1