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
--- 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))