summaryrefslogtreecommitdiff
path: root/lib/python/qmk/commands.py
diff options
context:
space:
mode:
Diffstat (limited to 'lib/python/qmk/commands.py')
-rw-r--r--lib/python/qmk/commands.py96
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