VulpesOS/tools/project.py
OverSu b38dea0597 Publish Vulpes Preview 15 sources for desktop, Android and Tundra
Share Gaia assets and adapters, keep private profiles and development documents local, and update both public READMEs.
2026-09-30 23:13:03 +02:00

67 lines
2.6 KiB
Python

"""Paths and metadata shared by the desktop and Android build tools."""
import json
from pathlib import Path
import subprocess
ROOT = Path(__file__).resolve().parents[1]
def validate_assets():
"""Require the checked-in Gaia payload instead of a private profile copy."""
apps = ROOT / "assets/webapps"
required = [
ROOT / "assets/settings-defaults.json",
apps / "system.gaiamobile.org/index.html",
apps / "homescreen.gaiamobile.org/index.html",
apps / "default_theme.gaiamobile.org/manifest.webapp",
]
missing = [str(path.relative_to(ROOT)) for path in required if not path.is_file()]
if missing:
raise RuntimeError("Incomplete checkout; missing Gaia files: " + ", ".join(missing))
manifests = sorted(apps.glob("*/manifest.webapp"))
if not manifests:
raise RuntimeError("No installed Gaia manifests in assets/webapps")
for manifest in manifests:
json.loads(manifest.read_text())
json.loads((ROOT / "assets/settings-defaults.json").read_text())
return len(manifests)
def build_info():
"""Read this checkout's revision; archives without .git report it as unknown."""
unknown = {"revision": "unknown", "timestamp": 0, "dirty": None}
if not (ROOT / ".git").exists():
return unknown
try:
revision, timestamp = (
subprocess.check_output(
["git", "show", "-s", "--format=%H%n%ct", "HEAD"],
cwd=ROOT,
text=True,
stderr=subprocess.DEVNULL,
)
.strip()
.splitlines()
)
changes = subprocess.check_output(
["git", "status", "--porcelain", "--untracked-files=normal"],
cwd=ROOT,
text=True,
)
except (OSError, subprocess.CalledProcessError, ValueError):
return unknown
return {"revision": revision, "timestamp": int(timestamp), "dirty": bool(changes)}
def release_info():
"""One product revision, with independently verified platform engine packages."""
release = json.loads((ROOT / "release.json").read_text())
release.setdefault("version", f'{release["gaia"]}-{release["channel"]}.{release["revision"]}')
release["desktopEngine"] = json.loads((ROOT / "engine-lock.json").read_text())["version"]
engine, build_id = release["geckoview"].rsplit(".", 1)
release["androidEngine"] = engine
release["androidEngineBuildID"] = build_id
if not release["androidVersionCode"] > 4:
raise ValueError("Android versionCode must preserve upgrades from Preview 4")
return release