list.py (2958B)
1 # Copyright 2023-2024 Nick Brassel (@tzarc) 2 # SPDX-License-Identifier: GPL-2.0-or-later 3 from pathlib import Path 4 from dotty_dict import Dotty 5 from milc import cli 6 7 from qmk.constants import QMK_USERSPACE, HAS_QMK_USERSPACE 8 from qmk.userspace import UserspaceDefs 9 from qmk.build_targets import BuildTarget 10 from qmk.keyboard import is_all_keyboards, keyboard_folder 11 from qmk.keymap import is_keymap_target 12 from qmk.search import search_keymap_targets 13 from qmk.util import maybe_exit_config 14 15 16 def _extra_arg_setter(target, extra_args): 17 target.extra_args = extra_args 18 19 20 @cli.argument('-e', '--expand', arg_only=True, action='store_true', help="Expands any use of `all` for either keyboard or keymap.") 21 @cli.subcommand('Lists the build targets specified in userspace `qmk.json`.') 22 def userspace_list(cli): 23 if not HAS_QMK_USERSPACE: 24 cli.log.error('Could not determine QMK userspace location. Please run `qmk doctor` or `qmk userspace-doctor` to diagnose.') 25 return False 26 27 maybe_exit_config(should_exit=False, should_reraise=True) 28 29 userspace = UserspaceDefs(QMK_USERSPACE / 'qmk.json') 30 31 if cli.args.expand: 32 build_targets = [] 33 keyboard_keymap_targets = [] 34 for e in userspace.build_targets: 35 if isinstance(e, Path): 36 build_targets.append(e) 37 elif isinstance(e, dict) or isinstance(e, Dotty): 38 f = e['env'] if 'env' in e else None 39 keyboard_keymap_targets.append((e['keyboard'], e['keymap'], f)) 40 if len(keyboard_keymap_targets) > 0: 41 build_targets.extend(search_keymap_targets(keyboard_keymap_targets)) 42 else: 43 build_targets = userspace.build_targets 44 45 for e in build_targets: 46 if isinstance(e, Path): 47 # JSON keymap from userspace 48 cli.log.info(f'JSON keymap: {{fg_cyan}}{e}{{fg_reset}}') 49 continue 50 elif isinstance(e, dict) or isinstance(e, Dotty): 51 # keyboard/keymap dict from userspace 52 keyboard = e['keyboard'] 53 keymap = e['keymap'] 54 extra_args = e.get('env') 55 elif isinstance(e, BuildTarget): 56 # BuildTarget from search_keymap_targets() 57 keyboard = e.keyboard 58 keymap = e.keymap 59 extra_args = e.extra_args 60 61 extra_args_str = '' 62 if extra_args is not None and len(extra_args) > 0: 63 extra_args_str = ', '.join([f'{{fg_cyan}}{k}={v}{{fg_reset}}' for k, v in extra_args.items()]) 64 extra_args_str = f' ({{fg_cyan}}{extra_args_str}{{fg_reset}})' 65 66 if is_all_keyboards(keyboard) or is_keymap_target(keyboard_folder(keyboard), keymap): 67 cli.log.info(f'Keyboard: {{fg_cyan}}{keyboard}{{fg_reset}}, keymap: {{fg_cyan}}{keymap}{{fg_reset}}{extra_args_str}') 68 else: 69 cli.log.warning(f'Keyboard: {{fg_cyan}}{keyboard}{{fg_reset}}, keymap: {{fg_cyan}}{keymap}{{fg_reset}}{extra_args_str} -- not found!')