logo

qmk_firmware

custom branch of QMK firmware git clone https://anongit.hacktivis.me/git/qmk_firmware.git

index_generator.py (2974B)


  1. #!/usr/bin/env python3
  2. import os
  3. import re
  4. import shlex
  5. import subprocess
  6. from pathlib import Path
  7. from ansi2html import Ansi2HTMLConverter
  8. from jinja2 import Environment, FileSystemLoader, select_autoescape
  9. orig_cwd = os.getcwd()
  10. qmk_firmware_dir = Path(os.path.realpath(__file__)).parents[2]
  11. build_dir = qmk_firmware_dir / ".build"
  12. KEYBOARD_PATTERN = re.compile("CI Metadata: KEYBOARD=(?P<keyboard>.*)\r?\n")
  13. KEYMAP_PATTERN = re.compile("CI Metadata: KEYMAP=(?P<keymap>.*)\r?\n")
  14. env = Environment(
  15. loader=FileSystemLoader(Path(os.path.realpath(__file__)).parent / "templates"),
  16. autoescape=select_autoescape(),
  17. )
  18. def _run(command, capture_output=True, combined_output=False, text=True, **kwargs):
  19. if isinstance(command, str):
  20. command = shlex.split(command)
  21. if capture_output:
  22. kwargs["stdout"] = subprocess.PIPE
  23. kwargs["stderr"] = subprocess.PIPE
  24. if combined_output:
  25. kwargs["stderr"] = subprocess.STDOUT
  26. if "stdin" in kwargs and kwargs["stdin"] is None:
  27. del kwargs["stdin"]
  28. if text:
  29. kwargs["universal_newlines"] = True
  30. return subprocess.run(command, **kwargs)
  31. def _ansi2html(value):
  32. return Ansi2HTMLConverter().convert(value, full=False)
  33. def _ansi2html_styles():
  34. from ansi2html.style import get_styles
  35. styles = get_styles(scheme="dracula")
  36. return "\n".join([str(s) for s in styles])
  37. def _git_log(count=4):
  38. os.chdir(qmk_firmware_dir)
  39. ret = _run(f"git log -n {count} --color=always --no-merges --topo-order --stat").stdout.strip()
  40. os.chdir(orig_cwd)
  41. return ret
  42. def _git_describe():
  43. os.chdir(qmk_firmware_dir)
  44. ret = _run("git describe --tags --always --dirty").stdout.strip()
  45. os.chdir(orig_cwd)
  46. return ret
  47. def _git_revision():
  48. os.chdir(qmk_firmware_dir)
  49. ret = _run("git rev-parse HEAD").stdout.strip()
  50. os.chdir(orig_cwd)
  51. return ret
  52. env.filters["ansi2html"] = _ansi2html
  53. binaries = []
  54. binaries.extend(qmk_firmware_dir.glob("*.bin"))
  55. binaries.extend(qmk_firmware_dir.glob("*.hex"))
  56. binaries.extend(qmk_firmware_dir.glob("*.uf2"))
  57. binaries = list(sorted(binaries))
  58. failures = []
  59. for mdfile in list(sorted(build_dir.glob("failed.log.*"))):
  60. txt = Path(mdfile).read_text()
  61. m_kb = KEYBOARD_PATTERN.search(txt)
  62. if not m_kb:
  63. raise Exception("Couldn't determine the keyboard from the failure output")
  64. m_km = KEYMAP_PATTERN.search(txt)
  65. if not m_km:
  66. raise Exception("Couldn't determine the keymap from the failure output")
  67. txt = KEYBOARD_PATTERN.sub("", KEYMAP_PATTERN.sub("", txt)).strip()
  68. failures.append({
  69. "stdout": txt,
  70. "keyboard": m_kb.group("keyboard"),
  71. "keymap": m_km.group("keymap"),
  72. })
  73. template = env.get_template("index.html.j2")
  74. print(template.render(
  75. ansi2html_styles=_ansi2html_styles(),
  76. git_log=_git_log(),
  77. git_describe=_git_describe(),
  78. git_revision=_git_revision(),
  79. binaries=binaries,
  80. failures=failures,
  81. ))