Defer the expensive search for layout macros until info.json has been processed (#14007)
* defer the expensive search for layout macros until info.json has been processed * fixup names
This commit is contained in:
parent
f56c202fb3
commit
fd340f8957
1 changed files with 24 additions and 19 deletions
|
@ -49,7 +49,7 @@ def info_json(keyboard):
|
||||||
info_data['keymaps'][keymap.name] = {'url': f'https://raw.githubusercontent.com/qmk/qmk_firmware/master/{keymap}/keymap.json'}
|
info_data['keymaps'][keymap.name] = {'url': f'https://raw.githubusercontent.com/qmk/qmk_firmware/master/{keymap}/keymap.json'}
|
||||||
|
|
||||||
# Populate layout data
|
# Populate layout data
|
||||||
layouts, aliases = _find_all_layouts(info_data, keyboard)
|
layouts, aliases = _search_keyboard_h(keyboard)
|
||||||
|
|
||||||
if aliases:
|
if aliases:
|
||||||
info_data['layout_aliases'] = aliases
|
info_data['layout_aliases'] = aliases
|
||||||
|
@ -77,6 +77,9 @@ def info_json(keyboard):
|
||||||
exit(1)
|
exit(1)
|
||||||
|
|
||||||
# Make sure we have at least one layout
|
# Make sure we have at least one layout
|
||||||
|
if not info_data.get('layouts'):
|
||||||
|
_find_missing_layouts(info_data, keyboard)
|
||||||
|
|
||||||
if not info_data.get('layouts'):
|
if not info_data.get('layouts'):
|
||||||
_log_error(info_data, 'No LAYOUTs defined! Need at least one layout defined in the keyboard.h or info.json.')
|
_log_error(info_data, 'No LAYOUTs defined! Need at least one layout defined in the keyboard.h or info.json.')
|
||||||
|
|
||||||
|
@ -417,12 +420,13 @@ def _merge_layouts(info_data, new_info_data):
|
||||||
return info_data
|
return info_data
|
||||||
|
|
||||||
|
|
||||||
def _search_keyboard_h(path):
|
def _search_keyboard_h(keyboard):
|
||||||
|
keyboard = Path(keyboard)
|
||||||
current_path = Path('keyboards/')
|
current_path = Path('keyboards/')
|
||||||
aliases = {}
|
aliases = {}
|
||||||
layouts = {}
|
layouts = {}
|
||||||
|
|
||||||
for directory in path.parts:
|
for directory in keyboard.parts:
|
||||||
current_path = current_path / directory
|
current_path = current_path / directory
|
||||||
keyboard_h = '%s.h' % (directory,)
|
keyboard_h = '%s.h' % (directory,)
|
||||||
keyboard_h_path = current_path / keyboard_h
|
keyboard_h_path = current_path / keyboard_h
|
||||||
|
@ -437,27 +441,28 @@ def _search_keyboard_h(path):
|
||||||
return layouts, aliases
|
return layouts, aliases
|
||||||
|
|
||||||
|
|
||||||
def _find_all_layouts(info_data, keyboard):
|
def _find_missing_layouts(info_data, keyboard):
|
||||||
"""Looks for layout macros associated with this keyboard.
|
"""Looks for layout macros when they aren't found other places.
|
||||||
|
|
||||||
|
If we don't find any layouts from info.json or keyboard.h we widen our search. This is error prone which is why we want to encourage people to follow the standard above.
|
||||||
"""
|
"""
|
||||||
layouts, aliases = _search_keyboard_h(Path(keyboard))
|
_log_warning(info_data, '%s: Falling back to searching for KEYMAP/LAYOUT macros.' % (keyboard))
|
||||||
|
|
||||||
if not layouts:
|
for file in glob('keyboards/%s/*.h' % keyboard):
|
||||||
# If we don't find any layouts from info.json or keyboard.h we widen our search. This is error prone which is why we want to encourage people to follow the standard above.
|
these_layouts, these_aliases = find_layouts(file)
|
||||||
info_data['parse_warnings'].append('%s: Falling back to searching for KEYMAP/LAYOUT macros.' % (keyboard))
|
|
||||||
|
|
||||||
for file in glob('keyboards/%s/*.h' % keyboard):
|
if these_layouts:
|
||||||
if file.endswith('.h'):
|
for layout_name, layout_json in these_layouts.items():
|
||||||
these_layouts, these_aliases = find_layouts(file)
|
if not layout_name.startswith('LAYOUT_kc'):
|
||||||
|
layout_json['c_macro'] = True
|
||||||
|
info_data['layouts'][layout_name] = layout_json
|
||||||
|
|
||||||
if these_layouts:
|
for alias, alias_text in these_aliases.items():
|
||||||
layouts.update(these_layouts)
|
if alias_text in these_layouts:
|
||||||
|
if 'layout_aliases' not in info_data:
|
||||||
|
info_data['layout_aliases'] = {}
|
||||||
|
|
||||||
for alias, alias_text in these_aliases.items():
|
info_data['layout_aliases'][alias] = alias_text
|
||||||
if alias_text in layouts:
|
|
||||||
aliases[alias] = alias_text
|
|
||||||
|
|
||||||
return layouts, aliases
|
|
||||||
|
|
||||||
|
|
||||||
def _log_error(info_data, message):
|
def _log_error(info_data, message):
|
||||||
|
|
Loading…
Reference in a new issue