Sfoglia il codice sorgente

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
Zach White 3 anni fa
parent
commit
fd340f8957
1 ha cambiato i file con 24 aggiunte e 19 eliminazioni
  1. 24 19
      lib/python/qmk/info.py

+ 24 - 19
lib/python/qmk/info.py

@@ -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'}
 
     # Populate layout data
-    layouts, aliases = _find_all_layouts(info_data, keyboard)
+    layouts, aliases = _search_keyboard_h(keyboard)
 
     if aliases:
         info_data['layout_aliases'] = aliases
@@ -77,6 +77,9 @@ def info_json(keyboard):
         exit(1)
 
     # 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'):
         _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
 
 
-def _search_keyboard_h(path):
+def _search_keyboard_h(keyboard):
+    keyboard = Path(keyboard)
     current_path = Path('keyboards/')
     aliases = {}
     layouts = {}
 
-    for directory in path.parts:
+    for directory in keyboard.parts:
         current_path = current_path / directory
         keyboard_h = '%s.h' % (directory,)
         keyboard_h_path = current_path / keyboard_h
@@ -437,27 +441,28 @@ def _search_keyboard_h(path):
     return layouts, aliases
 
 
-def _find_all_layouts(info_data, keyboard):
-    """Looks for layout macros associated with this keyboard.
-    """
-    layouts, aliases = _search_keyboard_h(Path(keyboard))
+def _find_missing_layouts(info_data, keyboard):
+    """Looks for layout macros when they aren't found other places.
 
-    if not layouts:
-        # 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.
-        info_data['parse_warnings'].append('%s: Falling back to searching for KEYMAP/LAYOUT macros.' % (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.
+    """
+    _log_warning(info_data, '%s: Falling back to searching for KEYMAP/LAYOUT macros.' % (keyboard))
 
-        for file in glob('keyboards/%s/*.h' % keyboard):
-            if file.endswith('.h'):
-                these_layouts, these_aliases = find_layouts(file)
+    for file in glob('keyboards/%s/*.h' % keyboard):
+        these_layouts, these_aliases = find_layouts(file)
 
-                if these_layouts:
-                    layouts.update(these_layouts)
+        if these_layouts:
+            for layout_name, layout_json in these_layouts.items():
+                if not layout_name.startswith('LAYOUT_kc'):
+                    layout_json['c_macro'] = True
+                    info_data['layouts'][layout_name] = layout_json
 
-                for alias, alias_text in these_aliases.items():
-                    if alias_text in layouts:
-                        aliases[alias] = alias_text
+        for alias, alias_text in these_aliases.items():
+            if alias_text in these_layouts:
+                if 'layout_aliases' not in info_data:
+                    info_data['layout_aliases'] = {}
 
-    return layouts, aliases
+                info_data['layout_aliases'][alias] = alias_text
 
 
 def _log_error(info_data, message):