diff options
Diffstat (limited to 'lib/python/qmk/commands.py')
-rw-r--r-- | lib/python/qmk/commands.py | 96 |
1 files changed, 87 insertions, 9 deletions
diff --git a/lib/python/qmk/commands.py b/lib/python/qmk/commands.py index 6067d49ae7..cdb8ee037a 100644 --- a/lib/python/qmk/commands.py +++ b/lib/python/qmk/commands.py @@ -1,13 +1,19 @@ -"""Functions that build make commands +"""Helper functions for commands. """ import json +from pathlib import Path + +from milc import cli + import qmk.keymap +from qmk.path import is_keyboard, is_keymap_dir, under_qmk_firmware def create_make_command(keyboard, keymap, target=None): """Create a make compile command Args: + keyboard The path of the keyboard, for example 'plank' @@ -18,24 +24,22 @@ def create_make_command(keyboard, keymap, target=None): Usually a bootloader. Returns: + A command that can be run to make the specified keyboard and keymap """ - if target is None: - return ['make', ':'.join((keyboard, keymap))] - return ['make', ':'.join((keyboard, keymap, target))] + make_args = [keyboard, keymap] + if target: + make_args.append(target) -def parse_configurator_json(configurator_file): - """Open and parse a configurator json export - """ - user_keymap = json.load(configurator_file) - return user_keymap + return ['make', ':'.join(make_args)] def compile_configurator_json(user_keymap, bootloader=None): """Convert a configurator export JSON file into a C file Args: + configurator_filename The configurator JSON export file @@ -43,6 +47,7 @@ def compile_configurator_json(user_keymap, bootloader=None): A bootloader to flash Returns: + A command to run to compile and flash the C file. """ # Write the keymap C file @@ -52,3 +57,76 @@ def compile_configurator_json(user_keymap, bootloader=None): if bootloader is None: return create_make_command(user_keymap['keyboard'], user_keymap['keymap']) return create_make_command(user_keymap['keyboard'], user_keymap['keymap'], bootloader) + + +def find_keyboard_keymap(): + """Returns `(keyboard_name, keymap_name)` based on the user's current environment. + + This determines the keyboard and keymap name using the following precedence order: + + * Command line flags (--keyboard and --keymap) + * Current working directory + * `keyboards/<keyboard_name>` + * `keyboards/<keyboard_name>/keymaps/<keymap_name>` + * `layouts/**/<keymap_name>` + * `users/<keymap_name>` + * Configuration + * cli.config.<subcommand>.keyboard + * cli.config.<subcommand>.keymap + """ + # Check to make sure their copy of MILC supports config_source + if not hasattr(cli, 'config_source'): + cli.log.error("Your QMK CLI is out of date. Please upgrade using pip3 or your package manager.") + exit(1) + + # State variables + relative_cwd = under_qmk_firmware() + keyboard_name = "" + keymap_name = "" + + # If the keyboard or keymap are passed as arguments use that in preference to anything else + if cli.config_source[cli._entrypoint.__name__]['keyboard'] == 'argument': + keyboard_name = cli.config[cli._entrypoint.__name__]['keyboard'] + if cli.config_source[cli._entrypoint.__name__]['keymap'] == 'argument': + keymap_name = cli.config[cli._entrypoint.__name__]['keymap'] + + if not keyboard_name or not keymap_name: + # If we don't have a keyboard_name and keymap_name from arguments try to derive one or both + if relative_cwd and relative_cwd.parts and relative_cwd.parts[0] == 'keyboards': + # Try to determine the keyboard and/or keymap name + current_path = Path('/'.join(relative_cwd.parts[1:])) + + if current_path.parts[-2] == 'keymaps': + if not keymap_name: + keymap_name = current_path.parts[-1] + if not keyboard_name: + keyboard_name = '/'.join(current_path.parts[:-2]) + elif not keyboard_name and is_keyboard(current_path): + keyboard_name = str(current_path) + + elif relative_cwd and relative_cwd.parts and relative_cwd.parts[0] == 'layouts': + # Try to determine the keymap name from the community layout + if is_keymap_dir(relative_cwd) and not keymap_name: + keymap_name = relative_cwd.name + + elif relative_cwd and relative_cwd.parts and relative_cwd.parts[0] == 'users': + # Try to determine the keymap name based on which userspace they're in + if not keymap_name and len(relative_cwd.parts) > 1: + keymap_name = relative_cwd.parts[1] + + # If we still don't have a keyboard and keymap check the config + if not keyboard_name and cli.config[cli._entrypoint.__name__]['keyboard']: + keyboard_name = cli.config[cli._entrypoint.__name__]['keyboard'] + + if not keymap_name and cli.config[cli._entrypoint.__name__]['keymap']: + keymap_name = cli.config[cli._entrypoint.__name__]['keymap'] + + return (keyboard_name, keymap_name) + + +def parse_configurator_json(configurator_file): + """Open and parse a configurator json export + """ + user_keymap = json.load(configurator_file) + + return user_keymap |