Allow for wildcard filtering in `qmk mass-compile` (#19625)

This commit is contained in:
Nick Brassel 2023-01-19 09:36:32 +11:00 committed by GitHub
parent d73ad52040
commit 17c9388af5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 8 additions and 4 deletions

View File

@ -2,6 +2,7 @@
This will compile everything in parallel, for testing purposes. This will compile everything in parallel, for testing purposes.
""" """
import fnmatch
import logging import logging
import multiprocessing import multiprocessing
import os import os
@ -58,7 +59,8 @@ def _load_keymap_info(keyboard, keymap):
arg_only=True, arg_only=True,
action='append', action='append',
default=[], default=[],
help="Filter the list of keyboards based on the supplied value in rules.mk. Matches info.json structure, and accepts the format 'features.rgblight=true'. May be passed multiple times, all filters need to match." help= # noqa: `format-python` and `pytest` don't agree here.
"Filter the list of keyboards based on the supplied value in rules.mk. Matches info.json structure, and accepts the format 'features.rgblight=true'. May be passed multiple times, all filters need to match. Value may include wildcards such as '*' and '?'." # noqa: `format-python` and `pytest` don't agree here.
) )
@cli.argument('-km', '--keymap', type=str, default='default', help="The keymap name to build. Default is 'default'.") @cli.argument('-km', '--keymap', type=str, default='default', help="The keymap name to build. Default is 'default'.")
@cli.argument('-e', '--env', arg_only=True, action='append', default=[], help="Set a variable to be passed to make. May be passed multiple times.") @cli.argument('-e', '--env', arg_only=True, action='append', default=[], help="Set a variable to be passed to make. May be passed multiple times.")
@ -102,11 +104,13 @@ def mass_compile(cli):
cli.log.info(f'Filtering on condition ("{key}" == "{value}")...') cli.log.info(f'Filtering on condition ("{key}" == "{value}")...')
def _make_filter(k, v): def _make_filter(k, v):
expr = fnmatch.translate(v)
rule = re.compile(expr, re.IGNORECASE)
def f(e): def f(e):
lhs = e[2].get(k) lhs = e[2].get(k)
lhs = str(False if lhs is None else lhs).lower() lhs = str(False if lhs is None else lhs)
rhs = str(v).lower() return rule.search(lhs) is not None
return lhs == rhs
return f return f