diff --git a/lib/python/qmk/cli/lint.py b/lib/python/qmk/cli/lint.py index 8a128ce6d2..a05bd2fa7e 100644 --- a/lib/python/qmk/cli/lint.py +++ b/lib/python/qmk/cli/lint.py @@ -8,7 +8,7 @@ from milc import cli from qmk.decorators import automagic_keyboard, automagic_keymap from qmk.info import info_json from qmk.keyboard import keyboard_completer, keyboard_folder_or_all, is_all_keyboards, list_keyboards -from qmk.keymap import locate_keymap, list_keymaps +from qmk.keymap import locate_keymap, list_keymaps, is_valid_keymap_name from qmk.path import keyboard from qmk.git import git_get_ignored_files from qmk.c_parse import c_source_files, preprocess_c_file @@ -245,18 +245,21 @@ def _handle_duplicating_code_defaults(kb, info): def keymap_check(kb, km): """Perform the keymap level checks. """ - ok = True keymap_path = locate_keymap(kb, km) if not keymap_path: - ok = False cli.log.error("%s: Can't find %s keymap.", kb, km) - return ok + return False if km in INVALID_KM_NAMES: - ok = False cli.log.error("%s: The keymap %s should not exist!", kb, km) - return ok + return False + + ok = True + + if not is_valid_keymap_name(km): + cli.log.error(f'{kb}/{km}: Keymap name must contain only a-z, 0-9 and _!') + ok = False # Additional checks invalid_files = git_get_ignored_files(keymap_path.parent.as_posix()) diff --git a/lib/python/qmk/keymap.py b/lib/python/qmk/keymap.py index 36a821ebda..4c7b391362 100644 --- a/lib/python/qmk/keymap.py +++ b/lib/python/qmk/keymap.py @@ -1,6 +1,7 @@ """Functions that help you work with QMK keymaps. """ import sys +import re from pathlib import Path from subprocess import DEVNULL @@ -239,6 +240,13 @@ def is_keymap_dir(keymap, c=True, json=True, additional_files=None): return True +def is_valid_keymap_name(name): + """Returns True if the given keymap name contains only valid characters. + """ + regex = re.compile(r'^[a-z0-9][a-z0-9_]+$') + return bool(regex.match(name)) + + def generate_json(keymap, keyboard, layout, layers, macros=None): """Returns a `keymap.json` for the specified keyboard, layout, and layers.