diff options
Diffstat (limited to 'meta/lib')
-rw-r--r-- | meta/lib/oe/license.py | 36 | ||||
-rw-r--r-- | meta/lib/test.py | 3 |
2 files changed, 39 insertions, 0 deletions
diff --git a/meta/lib/oe/license.py b/meta/lib/oe/license.py index 7ab66e762..3543cfe1f 100644 --- a/meta/lib/oe/license.py +++ b/meta/lib/oe/license.py @@ -3,6 +3,7 @@ import ast import re +from fnmatch import fnmatchcase as fnmatch class InvalidLicense(StandardError): def __init__(self, license): @@ -60,3 +61,38 @@ def flattened_licenses(licensestr, choose_licenses): flatten = FlattenVisitor(choose_licenses) flatten.visit_string(licensestr) return flatten.licenses + +def is_included(licensestr, whitelist=None, blacklist=None): + """Given a license string and whitelist and blacklist, determine if the + license string matches the whitelist and does not match the blacklist. + + Returns a tuple holding the boolean state and a list of the applicable + licenses which were excluded (or None, if the state is True) + """ + + def include_license(license): + return (any(fnmatch(license, pattern) for pattern in whitelist) and not + any(fnmatch(license, pattern) for pattern in blacklist)) + + def choose_licenses(alpha, beta): + """Select the option in an OR which is the 'best' (has the most + included licenses).""" + alpha_weight = len(filter(include_license, alpha)) + beta_weight = len(filter(include_license, beta)) + if alpha_weight > beta_weight: + return alpha + else: + return beta + + if not whitelist: + whitelist = ['*'] + + if not blacklist: + blacklist = [] + + licenses = flattened_licenses(licensestr, choose_licenses) + excluded = filter(lambda lic: not include_license(lic), licenses) + if excluded: + return False, excluded + else: + return True, None diff --git a/meta/lib/test.py b/meta/lib/test.py new file mode 100644 index 000000000..12f4d837d --- /dev/null +++ b/meta/lib/test.py @@ -0,0 +1,3 @@ +import oe.license + +print(oe.license.is_included('LGPLv2.1 | GPLv3', ['*'], [])) |