#!/usr/bin/env python3 """Sync versioninfo.json + build-macos.bat from internal/update/update.go constants.""" from __future__ import annotations import json import re from pathlib import Path ROOT = Path(__file__).resolve().parents[1] UPDATE_GO = ROOT / "internal" / "update" / "update.go" VERSIONINFO = ROOT / "versioninfo.json" BUILD_BAT = ROOT / "build-macos.bat" def read_consts() -> tuple[str, int]: text = UPDATE_GO.read_text(encoding="utf-8") m = re.search(r'CurrentVersion\s*=\s*"([^"]+)"', text) b = re.search(r"const BuildNumber\s*=\s*(\d+)", text) if not m or not b: raise SystemExit("cannot parse CurrentVersion/BuildNumber from update.go") return m.group(1), int(b.group(1)) def main() -> None: ver, build = read_consts() parts = [int(x) for x in ver.split(".")] while len(parts) < 3: parts.append(0) major, minor, patch = parts[0], parts[1], parts[2] full = f"{ver}.{build}" data = json.loads(VERSIONINFO.read_text(encoding="utf-8")) data["FixedFileInfo"]["FileVersion"] = { "Major": major, "Minor": minor, "Patch": patch, "Build": build, } data["FixedFileInfo"]["ProductVersion"] = dict(data["FixedFileInfo"]["FileVersion"]) data["StringFileInfo"]["FileVersion"] = full data["StringFileInfo"]["ProductVersion"] = full VERSIONINFO.write_text(json.dumps(data, ensure_ascii=False, indent=2) + "\n", encoding="utf-8") print("updated", VERSIONINFO, "->", full) bat = BUILD_BAT.read_text(encoding="utf-8") bat2 = re.sub( r'-version\s+\d+\.\d+\.\d+\s+-build\s+\d+\.\d+\.\d+\.\d+', f"-version {ver} -build {full}", bat, ) if bat2 != bat: BUILD_BAT.write_text(bat2, encoding="utf-8") print("updated", BUILD_BAT, "->", ver, full) else: print("build-macos.bat already in sync") if __name__ == "__main__": main()