import json import pathlib import subprocess from openpilot.system.version import get_release_notes, get_version CASYNC_ARGS = ["--with=symlinks", "--with=permissions"] VERSION_METADATA_FILE = "version.json" # file that contains details of the current release CASYNC_FILES = [VERSION_METADATA_FILE, ".caexclude"] def run(cmd): return subprocess.check_output(cmd) def get_exclude_set(path) -> set[str]: exclude_set = set(CASYNC_FILES) for file in path.rglob("*"): if file.is_file() or file.is_symlink(): while file.resolve() != path.resolve(): exclude_set.add(str(file.relative_to(path))) file = file.parent return exclude_set def create_caexclude_file(path: pathlib.Path): with open(path / ".caexclude", "w") as f: # exclude everything except the paths already in the release f.write("*\n") f.write(".*\n") for file in sorted(get_exclude_set(path)): f.write(f"!{file}\n") def create_version_metadata(channel, version, release_notes): return { "name": channel, "openpilot": { "version": version, "release_notes": release_notes } } def create_version_metadata_file(path: pathlib.Path, channel: str): version = get_version(str(path)) release_notes = get_release_notes(str(path)) with open(path / VERSION_METADATA_FILE, "w") as f: f.write(json.dumps(create_version_metadata(channel, version, release_notes))) def create_casync_release(target_dir: pathlib.Path, output_dir: pathlib.Path, channel: str): caidx_file = output_dir / f"{channel}.caidx" run(["casync", "make", *CASYNC_ARGS, caidx_file, target_dir]) digest = run(["casync", "digest", *CASYNC_ARGS, target_dir]).decode("utf-8").strip() return digest, caidx_file