diff --git a/.github/workflows/regen.yml b/.github/workflows/regen.yml new file mode 100644 index 00000000000..ae25bc095ee --- /dev/null +++ b/.github/workflows/regen.yml @@ -0,0 +1,33 @@ +name: PR Regenerate Files + +permissions: + contents: read + +on: + pull_request: + paths: + - 'data/constants/**' + - 'lib/python/**' + +jobs: + regen: + runs-on: ubuntu-latest + + container: qmkfm/qmk_cli + + steps: + - uses: actions/checkout@v3 + + - name: Run qmk generators + run: | + util/regen.sh + git diff + + - name: Fail when regeneration required + run: | + git diff + for file in $(git diff --name-only); do + echo "File '${file}' Requires Regeneration" + echo "::error file=${file}::Requires Regeneration" + done + test -z "$(git diff --name-only)" diff --git a/.github/workflows/regen_push.yml b/.github/workflows/regen_push.yml new file mode 100644 index 00000000000..fb3314f3198 --- /dev/null +++ b/.github/workflows/regen_push.yml @@ -0,0 +1,43 @@ +name: Regenerate Files + +permissions: + contents: write + +on: + push: + branches: + - master + - develop + +jobs: + regen: + runs-on: ubuntu-latest + + container: qmkfm/qmk_cli + + steps: + - uses: actions/checkout@v3 + + - name: Run qmk generators + run: | + util/regen.sh + git diff + + - uses: rlespinasse/github-slug-action@v3.x + + - name: Become QMK Bot + run: | + git config user.name 'QMK Bot' + git config user.email 'hello@qmk.fm' + + - name: Create Pull Request + uses: peter-evans/create-pull-request@v4 + if: ${{ github.repository == 'qmk/qmk_firmware'}} + with: + token: ${{ secrets.QMK_BOT_TOKEN }} + delete-branch: true + branch: bugfix/format_${{ env.GITHUB_REF_SLUG }} + author: QMK Bot + committer: QMK Bot + commit-message: Regenerate Files + title: '[CI] Regenerate Files' diff --git a/lib/python/qmk/flashers.py b/lib/python/qmk/flashers.py index a9cf726b448..e902e5072fe 100644 --- a/lib/python/qmk/flashers.py +++ b/lib/python/qmk/flashers.py @@ -1,3 +1,4 @@ +import platform import shutil import time import os @@ -56,6 +57,20 @@ def _check_dfu_programmer_version(): return False +def _find_usb_device(vid_hex, pid_hex): + # WSL doesnt have access to USB - use powershell instead...? + if 'microsoft' in platform.uname().release.lower(): + ret = cli.run(['powershell.exe', '-command', 'Get-PnpDevice -PresentOnly | Select-Object -Property InstanceId']) + if f'USB\\VID_{vid_hex:04X}&PID_{pid_hex:04X}' in ret.stdout: + return (vid_hex, pid_hex) + else: + with DelayedKeyboardInterrupt(): + # PyUSB does not like to be interrupted by Ctrl-C + # therefore we catch the interrupt with a custom handler + # and only process it once pyusb finished + return usb.core.find(idVendor=vid_hex, idProduct=pid_hex) + + def _find_bootloader(): # To avoid running forever in the background, only look for bootloaders for 10min start_time = time.time() @@ -64,11 +79,7 @@ def _find_bootloader(): for vid, pid in BOOTLOADER_VIDS_PIDS[bl]: vid_hex = int(f'0x{vid}', 0) pid_hex = int(f'0x{pid}', 0) - with DelayedKeyboardInterrupt(): - # PyUSB does not like to be interrupted by Ctrl-C - # therefore we catch the interrupt with a custom handler - # and only process it once pyusb finished - dev = usb.core.find(idVendor=vid_hex, idProduct=pid_hex) + dev = _find_usb_device(vid_hex, pid_hex) if dev: if bl == 'atmel-dfu': details = _PID_TO_MCU[pid] @@ -178,25 +189,25 @@ def flasher(mcu, file): # Add a small sleep to avoid race conditions time.sleep(1) if bl == 'atmel-dfu': - _flash_atmel_dfu(details, file.name) + _flash_atmel_dfu(details, file) elif bl == 'caterina': - if _flash_caterina(details, file.name): + if _flash_caterina(details, file): return (True, "The Caterina bootloader was found but is not writable. Check 'qmk doctor' output for advice.") elif bl == 'hid-bootloader': if mcu: - if _flash_hid_bootloader(mcu, details, file.name): + if _flash_hid_bootloader(mcu, details, file): return (True, "Please make sure 'teensy_loader_cli' or 'hid_bootloader_cli' is available on your system.") else: return (True, "Specifying the MCU with '-m' is necessary for HalfKay/HID bootloaders!") elif bl == 'stm32-dfu' or bl == 'apm32-dfu' or bl == 'gd32v-dfu' or bl == 'kiibohd': - _flash_dfu_util(details, file.name) + _flash_dfu_util(details, file) elif bl == 'usbasploader' or bl == 'usbtinyisp': if mcu: - _flash_isp(mcu, bl, file.name) + _flash_isp(mcu, bl, file) else: return (True, "Specifying the MCU with '-m' is necessary for ISP flashing!") elif bl == 'md-boot': - _flash_mdloader(file.name) + _flash_mdloader(file) else: return (True, "Known bootloader found but flashing not currently supported!") diff --git a/util/lang_conv.py b/util/lang_conv.py deleted file mode 100644 index a0da6c392d2..00000000000 --- a/util/lang_conv.py +++ /dev/null @@ -1,65 +0,0 @@ -from pathlib import Path - -langs = set() -files = Path('quantum/keymap_extras/').glob('keymap_*.h') -for file in files: - langs.add(file.stem.replace('keymap_', '')) - -for lang in langs: - try: - file = Path(f'quantum/keymap_extras/keymap_{lang}.h') - print(f'Reading:{file}') - collect = None - out = [] - out += ['{'] - out += [' "aliases": {'] - lines = file.read_text(encoding='utf-8').split('\n') - for line in lines: - - if line.startswith("// Row"): - # print(line) - continue - elif line.startswith("/*******************************************************************************"): - raise Exception(f'Skipping:{file}') - elif '/*' in line: - collect = [line] - elif '*/' in line: - collect += [line] - if 'copyright' in collect[0].lower(): - collect = None - continue - out += collect - collect = None - elif collect: - collect += [line] - - elif '#define' in line: - define = line.split() - while len(define) < 5: - define.append("") - - if define[4] == "(backslash)": - define[4] = '\\\\' - - define[4] = " ".join(define[4:]).strip() - define[4] = define[4].replace('"', '\\"') - - if define[4]: - out += [f' "{define[2]}": {{'] - out += [f' "key": "{define[1]}",'] - out += [f' "label": "{define[4]}",'] - out += [f' }}'] - else: - out += [f' "{define[2]}": {{'] - out += [f' "key": "{define[1]}"'] - out += [f' }}'] - - out += [' }'] - out += ['}'] - - dump = Path(f'data/constants/keycodes/extras/keycodes_{lang}_0.0.1.hjson') - print(f'Writing:{dump}') - dump.write_text("\n".join(out), encoding='utf-8') - - except Exception as e: - print(e) diff --git a/util/lang_gen.sh b/util/lang_gen.sh deleted file mode 100755 index 0b062b1a09f..00000000000 --- a/util/lang_gen.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/bash - -for lang in $(find data/constants/keycodes/extras/ -type f -printf "%f\n" | sed "s/keycodes_//g" | sed "s/_[0-9].*//"); do - data=$(qmk generate-keycode-extras --version latest --lang $lang) - if [ "$?" == "0" ]; then - echo "$data" > quantum/keymap_extras/keymap_$lang.h - fi -done diff --git a/util/regen.sh b/util/regen.sh new file mode 100755 index 00000000000..e4c52ec9a17 --- /dev/null +++ b/util/regen.sh @@ -0,0 +1,9 @@ +#!/bin/bash +set -e + +qmk generate-rgb-breathe-table -o quantum/rgblight/rgblight_breathe_table.h +qmk generate-keycodes --version latest -o quantum/keycodes.h + +for lang in $(find data/constants/keycodes/extras/ -type f -printf "%f\n" | sed "s/keycodes_\(.*\)_[0-9].*/\1/"); do + qmk generate-keycode-extras --version latest --lang $lang -o quantum/keymap_extras/keymap_$lang.h +done