Issue #142: Ensure we don't append provenances twice
diff --git a/buildstream/_options/optionpool.py b/buildstream/_options/optionpool.py
index 41990ce..f38682a 100644
--- a/buildstream/_options/optionpool.py
+++ b/buildstream/_options/optionpool.py
@@ -233,12 +233,19 @@
 
                 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 6b14642..376d3dd 100644
--- a/buildstream/_yaml.py
+++ b/buildstream/_yaml.py
@@ -745,9 +745,7 @@
 # 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: