forked from mirrors/gecko-dev
96 lines
2.9 KiB
Python
96 lines
2.9 KiB
Python
# This Source Code Form is subject to the terms of the Mozilla Public
|
|
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
|
|
|
|
import re
|
|
|
|
|
|
def attrmatch(attributes, **kwargs):
|
|
"""Determine whether the given set of task attributes matches.
|
|
|
|
The conditions are given as keyword arguments, where each keyword names an
|
|
attribute. The keyword value can be a literal, a set, or a callable:
|
|
|
|
* A literal must match the attribute exactly.
|
|
* Given a set or list, the attribute value must be contained within it.
|
|
* A callable is called with the attribute value and returns a boolean.
|
|
|
|
If an attribute is specified as a keyword argument but not present in the
|
|
task's attributes, the result is False.
|
|
|
|
Args:
|
|
attributes (dict): The task's attributes object.
|
|
kwargs (dict): The conditions the task's attributes must satisfy in
|
|
order to match.
|
|
Returns:
|
|
bool: Whether the task's attributes match the conditions or not.
|
|
"""
|
|
for kwkey, kwval in kwargs.items():
|
|
if kwkey not in attributes:
|
|
return False
|
|
attval = attributes[kwkey]
|
|
if isinstance(kwval, (set, list)):
|
|
if attval not in kwval:
|
|
return False
|
|
elif callable(kwval):
|
|
if not kwval(attval):
|
|
return False
|
|
elif kwval != attributes[kwkey]:
|
|
return False
|
|
return True
|
|
|
|
|
|
def keymatch(attributes, target):
|
|
"""Determine if any keys in attributes are a match to target, then return
|
|
a list of matching values. First exact matches will be checked. Failing
|
|
that, regex matches and finally a default key.
|
|
"""
|
|
# exact match
|
|
if target in attributes:
|
|
return [attributes[target]]
|
|
|
|
# regular expression match
|
|
matches = [v for k, v in attributes.items() if re.match(k + "$", target)]
|
|
if matches:
|
|
return matches
|
|
|
|
# default
|
|
if "default" in attributes:
|
|
return [attributes["default"]]
|
|
|
|
return []
|
|
|
|
|
|
def _match_run_on(key, run_on):
|
|
"""
|
|
Determine whether the given parameter is included in the corresponding `run-on-attribute`.
|
|
"""
|
|
if "all" in run_on:
|
|
return True
|
|
return key in run_on
|
|
|
|
|
|
match_run_on_projects = _match_run_on
|
|
match_run_on_tasks_for = _match_run_on
|
|
|
|
|
|
def match_run_on_git_branches(git_branch, run_on_git_branches):
|
|
"""
|
|
Determine whether the given project is included in the `run-on-git-branches` parameter.
|
|
Allows 'all'.
|
|
"""
|
|
if "all" in run_on_git_branches:
|
|
return True
|
|
|
|
for expected_git_branch_pattern in run_on_git_branches:
|
|
if re.match(expected_git_branch_pattern, git_branch):
|
|
return True
|
|
|
|
return False
|
|
|
|
|
|
def sorted_unique_list(*args):
|
|
"""Join one or more lists, and return a sorted list of unique members"""
|
|
combined = set().union(*args)
|
|
return sorted(combined)
|