manifest_resource_summary.py 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. import os
  2. import glob
  3. import json
  4. import base64
  5. import requests
  6. import xml.etree.ElementTree as ET
  7. from collections import defaultdict
  8. CONFIG_DIR = ".github/kernel-config"
  9. MANIFEST_URL_TEMPLATE = "https://android.googlesource.com/kernel/manifest/+/refs/heads/common-{branch}/default.xml?format=TEXT"
  10. # Gather all kernel versions from config files
  11. kernel_versions = set()
  12. config_map = {} # kernel_version -> config file
  13. for config_path in glob.glob(os.path.join(CONFIG_DIR, "*.json")):
  14. with open(config_path) as f:
  15. data = json.load(f)
  16. for entry in data.get("include", []):
  17. ver = entry.get("kernel_version")
  18. if ver:
  19. kernel_versions.add(ver)
  20. config_map[ver] = os.path.basename(config_path)
  21. # Map kernel_version to manifest branch name
  22. def kernel_version_to_branch(ver):
  23. # e.g. 6.1.25-android14-2023-06 -> android14-6.1-2023-06
  24. m = None
  25. import re
  26. m = re.match(r"([\d.]+)-android(\d+)-(\d{4}-\d{2}|lts|exp)", ver)
  27. if m:
  28. kver, android, date = m.groups()
  29. return f"android{android}-{kver}-{date}"
  30. return None
  31. manifest_projects = defaultdict(set) # resource -> set of kernel_versions
  32. for ver in sorted(kernel_versions):
  33. branch = kernel_version_to_branch(ver)
  34. if not branch:
  35. print(f"Could not parse branch for kernel version: {ver}")
  36. continue
  37. url = MANIFEST_URL_TEMPLATE.format(branch=branch)
  38. print(f"Fetching manifest for {ver} ({branch})")
  39. resp = requests.get(url)
  40. if resp.status_code != 200:
  41. print(f"Failed to fetch {url}")
  42. continue
  43. xml_content = base64.b64decode(resp.content).decode("utf-8")
  44. root = ET.fromstring(xml_content)
  45. for project in root.findall("project"):
  46. name = project.get("name")
  47. path = project.get("path", name)
  48. manifest_projects[(name, path)].add(ver)
  49. with open("manifest_resource_summary.md", "w") as f:
  50. f.write("| Resource Name | Path | Appears In Kernel Versions |\n")
  51. f.write("|--------------|------|----------------------------|\n")
  52. for (name, path), vers in sorted(manifest_projects.items()):
  53. f.write(f"| `{name}` | `{path}` | {', '.join(sorted(vers))} |\n")
  54. print("Summary written to manifest_resource_summary.md")