Bug 1302192: ensure that only one option matches by-*; r=wcosta draft
authorDustin J. Mitchell <dustin@mozilla.com>
Fri, 23 Dec 2016 21:20:51 +0000
changeset 454193 4cebe253a5222badd42b94aa52f9784295c70b45
parent 454192 0151d31825a978d73cc1e7b90984e4067b8bc885
child 454194 81ec5bf5701a3735ff609dce1cb858c51300ada8
push id39862
push userdmitchell@mozilla.com
push dateWed, 28 Dec 2016 14:40:33 +0000
reviewerswcosta
bugs1302192
milestone53.0a1
Bug 1302192: ensure that only one option matches by-*; r=wcosta If an item matches exactly, it is always selected. This will catch the case where multiple regular expressions match (the previous version would silently pick one based on dictionary order). I was worried this was occurring, but because exact matches items are selected, it is not; still, best to be sure. MozReview-Commit-ID: EtZBTr61SvE
taskcluster/taskgraph/transforms/base.py
--- a/taskcluster/taskgraph/transforms/base.py
+++ b/taskcluster/taskgraph/transforms/base.py
@@ -124,20 +124,26 @@ def get_keyed_by(item, field, item_name,
     keyed_by = value.keys()[0]
     if len(value) > 1 or not keyed_by.startswith('by-'):
         return value
 
     values = value[keyed_by]
     keyed_by = keyed_by[3:]  # strip 'by-' off the keyed-by field name
     if item[keyed_by] in values:
         return values[item[keyed_by]]
-    for k in values.keys():
-        if re.match(k, item[keyed_by]):
-            return values[k]
+
+    matches = [(k,v )for k, v in values.iteritems() if re.match(k, item[keyed_by])]
+    if len(matches) > 1:
+        raise Exception(
+            "Multiple matching values for {} {!r} found while determining item {} in {}".format(
+                keyed_by, item[keyed_by], field, item_name))
+    elif matches:
+        return matches[0][1]
+
     if 'default' in values:
         return values['default']
     for k in item[keyed_by], 'default':
         if k in values:
             return values[k]
     else:
         raise Exception(
-            "Neither {} {} nor 'default' found while determining item {} in {}".format(
+            "No {} matching {!r} nor 'default' found while determining item {} in {}".format(
                 keyed_by, item[keyed_by], field, item_name))