Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add qmk ci-validate-aliases #22205

Merged
merged 8 commits into from
Oct 5, 2023
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 2 additions & 23 deletions .github/workflows/lint.yml
Original file line number Diff line number Diff line change
Expand Up @@ -74,31 +74,10 @@ jobs:
fi
exit $exit_code

- name: Verify at most one added keyboard
- name: Verify keyboard aliases
if: always()
shell: 'bash {0}'
run: |
git reset --hard
git clean -xfd

# Get the keyboard list and count for the target branch
git checkout -f ${{ github.base_ref }}
git pull --ff-only
QMK_KEYBOARDS_BASE=$(qmk list-keyboards)
QMK_KEYBOARDS_BASE_COUNT=$(qmk list-keyboards | wc -l)

# Get the keyboard list and count for the PR
git checkout -f ${{ github.head_ref }}
git merge --no-commit --squash ${{ github.base_ref }}
QMK_KEYBOARDS_PR=$(qmk list-keyboards)
QMK_KEYBOARDS_PR_COUNT=$(qmk list-keyboards | wc -l)

echo "::group::Keyboards changes in this PR"
diff -d -U 0 <(echo "$QMK_KEYBOARDS_BASE") <(echo "$QMK_KEYBOARDS_PR") | grep -vE '^(---|\+\+\+|@@)' | sed -e 's@^-@Removed: @g' -e 's@^+@ Added: @g'
echo "::endgroup::"

if [[ $QMK_KEYBOARDS_PR_COUNT -gt $(($QMK_KEYBOARDS_BASE_COUNT + 1)) ]]; then
echo "More than one keyboard added in this PR -- see the PR Checklist."
echo "::error::More than one keyboard added in this PR -- see the PR Checklist."
exit 1
fi
qmk ci-validate-aliases
57 changes: 30 additions & 27 deletions data/mappings/keyboard_aliases.hjson
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@
"target": "amjkeyboard/amjpad"
},
"angel64": {
"target": "angel64/alpha"
"target": "kakunpc/angel64/alpha"
},
"ashpil/modelm_usbc": {
"target": "ibm/model_m/ashpil_usbc"
Expand All @@ -47,10 +47,10 @@
"target": "viktus/at101_bh"
},
"atom47/rev2": {
"target": "maartenwut/atom47/rev2"
"target": "evyd13/atom47/rev2"
},
"atom47/rev3": {
"target": "maartenwut/atom47/rev3"
"target": "evyd13/atom47/rev3"
},
"bakeneko60": {
"target": "kkatano/bakeneko60"
Expand All @@ -65,7 +65,7 @@
"target": "bear_face/v1"
},
"bm16a": {
"target": "kprepublic/bm16a"
"target": "kprepublic/bm16a/v1"
},
"bm16s": {
"target": "kprepublic/bm16s"
Expand All @@ -77,16 +77,16 @@
"target": "kprepublic/bm43a"
},
"bm60poker": {
"target": "kprepublic/bm60poker"
"target": "kprepublic/bm60hsrgb_poker/rev1"
},
"bm60rgb": {
"target": "kprepublic/bm60rgb"
"target": "kprepublic/bm60hsrgb/rev1"
},
"bm60rgb_iso": {
"target": "kprepublic/bm60rgb_iso"
"target": "kprepublic/bm60hsrgb_iso/rev1"
},
"bm68rgb": {
"target": "kprepublic/bm68rgb"
"target": "kprepublic/bm68hsrgb/rev1"
},
"bpiphany/pegasushoof": {
"target": "bpiphany/pegasushoof/2013"
Expand Down Expand Up @@ -140,7 +140,10 @@
"target": "jagdpietr/drakon"
},
"durgod/k320": {
"target": "durgod/k3x0/k320"
"target": "durgod/k320/base"
},
"durgod/k3x0/k320": {
"target": "durgod/k320/base"
},
"durgod/hades": {
"target": "durgod/dgk6x/hades_ansi"
Expand Down Expand Up @@ -269,7 +272,7 @@
"target": "idb/idb_60"
},
"idobo": {
"target": "idobao/id75"
"target": "idobao/id75/v1"
},
"jacky_studio/piggy60": {
"target": "jacky_studio/piggy60/rev1"
Expand Down Expand Up @@ -401,7 +404,7 @@
"target": "mechlovin/adelais/rgb_led/rev1"
},
"mechlovin/adelais/standard_led": {
"target": "mechlovin/adelais/standard_led/rev2"
"target": "mechlovin/adelais/standard_led/arm/rev2"
},
"mechlovin/delphine": {
"target": "mechlovin/delphine/mono_led"
Expand Down Expand Up @@ -455,10 +458,10 @@
"target": "pabile/p20/ver1"
},
"pancake/feather": {
"target": "spaceman/pancake/feather"
"target": "spaceman/pancake/rev1/feather"
},
"pancake/promicro": {
"target": "spaceman/pancake/promicro"
"target": "spaceman/pancake/rev1/promicro"
},
"peiorisboards/ixora": {
"target": "coarse/ixora"
Expand All @@ -467,7 +470,7 @@
"target": "dm9records/plaid"
},
"plain60": {
"target": "maartenwut/plain60"
"target": "evyd13/plain60"
},
"ploopyco/trackball": {
"target": "ploopyco/trackball/rev1_005"
Expand Down Expand Up @@ -503,10 +506,10 @@
"target": "wilba_tech/rama_works_u80_a"
},
"ramonimbao/herringbone": {
"target": "ramonimbao/herringbone/v1"
"target": "rmi_kb/herringbone/v1"
},
"ramonimbao/mona": {
"target": "ramonimbao/mona/v1"
"target": "rmi_kb/mona/v1"
},
"rgbkb/pan": {
"target": "rgbkb/pan/rev1/32a"
Expand Down Expand Up @@ -542,10 +545,10 @@
"target": "tkw/stoutgat/v1"
},
"suihankey": {
"target": "suihankey/split/alpha"
"target": "kakunpc/suihankey/split/alpha"
},
"ta65": {
"target": "maartenwut/ta65"
"target": "evyd13/ta65"
},
"tartan": {
"target": "dm9records/tartan"
Expand All @@ -563,13 +566,13 @@
"target": "matthewdias/txuu"
},
"underscore33": {
"target": "underscore33/rev1"
"target": "tominabox1/underscore33/rev1"
},
"vinta": {
"target": "coarse/vinta"
},
"wasdat": {
"target": "maartenwut/wasdat"
"target": "evyd13/wasdat"
},
"westfoxtrot/cypher": {
"target": "westfoxtrot/cypher/rev1"
Expand All @@ -581,10 +584,10 @@
"target": "xiudi/xd002"
},
"xd004": {
"target": "xiudi/xd004"
"target": "xiudi/xd004/v1"
},
"xd60": {
"target": "xiudi/xd60"
"target": "xiudi/xd60/rev2"
},
"xd68": {
"target": "xiudi/xd68"
Expand Down Expand Up @@ -831,7 +834,7 @@
"target": "kagizaraya/halberd"
},
"handwired/hillside/0_1": {
"target": "handwired/hillside/48"
"target": "hillside/48/0_1"
},
"hecomi/alpha": {
"target": "takashiski/hecomi/alpha"
Expand All @@ -843,10 +846,10 @@
"target": "bpiphany/hid_liber"
},
"id67/default_rgb": {
"target": "idobao/id67/default_rgb"
"target": "idobao/id67"
},
"id67/rgb": {
"target": "idobao/id67/rgb"
"target": "idobao/id67"
},
"id80": {
"target": "idobao/id80/v2/ansi"
Expand Down Expand Up @@ -1236,7 +1239,7 @@
"target": "marksard/treadstone48/rev2"
},
"tronguylabs/m122_3270": {
"target": "ibm/model_m_122/m122_3270"
"target": "ibm/model_m_122/m122_3270/teensy"
},
"ua62": {
"target": "nacly/ua62"
Expand Down Expand Up @@ -1290,7 +1293,7 @@
"target": "ydkb/yd68"
},
"ymd75": {
"target": "ymdk/ymd75"
"target": "ymdk/ymd75/rev1"
},
"ymd96": {
"target": "ymdk/ymd96"
Expand Down
1 change: 1 addition & 0 deletions lib/python/qmk/cli/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
]

subcommands = [
'qmk.cli.ci.validate_aliases',
'qmk.cli.bux',
'qmk.cli.c2json',
'qmk.cli.cd',
Expand Down
Empty file.
51 changes: 51 additions & 0 deletions lib/python/qmk/cli/ci/validate_aliases.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
"""Validates the list of keyboard aliases.
"""
from pathlib import Path

from milc import cli

from qmk.constants import QMK_FIRMWARE
from qmk.json_schema import json_load
from qmk.keyboard import resolve_keyboard, keyboard_folder


def _safe_keyboard_folder(target):
try:
return keyboard_folder(target) # throws ValueError if it's invalid
except Exception:
return None


def _target_keyboard_exists(target):
# If there's no target, then we can't build it.
if not target:
return False

# If the target directory doesn't exist, then we can't build it.
if not (QMK_FIRMWARE / 'keyboards' / target).exists():
return False

# If the target directory existed but there was no rules.mk or rules.mk was incorrectly parsed, then we can't build it.
if not resolve_keyboard(target):
return False

# If the target directory exists but it itself has an invalid alias or invalid rules.mk, then we can't build it either.
if not _safe_keyboard_folder(target):
return False

# As far as we can tell, we can build it!
return True


@cli.subcommand('Validates the list of keyboard aliases.', hidden=True)
def ci_validate_aliases(cli):
aliases = json_load(Path('data/mappings/keyboard_aliases.hjson'))

success = True
for alias in aliases.keys():
target = aliases[alias].get('target', None)
if not _target_keyboard_exists(target):
cli.log.error(f'Keyboard alias {alias} has a target that doesn\'t exist: {target}')
success = False

return success
11 changes: 7 additions & 4 deletions lib/python/qmk/commands.py
Original file line number Diff line number Diff line change
Expand Up @@ -212,13 +212,16 @@ def parse_configurator_json(configurator_file):
cli.log.error(f'Invalid JSON keymap: {configurator_file} : {e.message}')
exit(1)

orig_keyboard = user_keymap['keyboard']
keyboard = user_keymap['keyboard']
aliases = json_load(Path('data/mappings/keyboard_aliases.hjson'))

if orig_keyboard in aliases:
if 'target' in aliases[orig_keyboard]:
user_keymap['keyboard'] = aliases[orig_keyboard]['target']
while keyboard in aliases:
zvecr marked this conversation as resolved.
Show resolved Hide resolved
last_keyboard = keyboard
keyboard = aliases[keyboard].get('target', keyboard)
if keyboard == last_keyboard:
break

user_keymap['keyboard'] = keyboard
return user_keymap


Expand Down
5 changes: 4 additions & 1 deletion lib/python/qmk/keyboard.py
Original file line number Diff line number Diff line change
Expand Up @@ -92,8 +92,11 @@ def keyboard_folder(keyboard):
"""
aliases = json_load(Path('data/mappings/keyboard_aliases.hjson'))

if keyboard in aliases:
while keyboard in aliases:
last_keyboard = keyboard
keyboard = aliases[keyboard].get('target', keyboard)
if keyboard == last_keyboard:
break

rules_mk_file = Path(base_path, keyboard, 'rules.mk')

Expand Down