From ac26a56e4e7acc6b86a9be22ae4800a8d6743ebe Mon Sep 17 00:00:00 2001 From: sabraman Date: Sat, 16 May 2026 01:59:45 +0300 Subject: [PATCH] Make package archives deterministic --- tools/build_package.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/tools/build_package.py b/tools/build_package.py index d7be2ea..b6148de 100644 --- a/tools/build_package.py +++ b/tools/build_package.py @@ -7,6 +7,7 @@ import hashlib import json import re +import stat import sys import zipfile from pathlib import Path @@ -21,6 +22,7 @@ MAX_ARCHIVE_UNCOMPRESSED_BYTES = 512 * 1024 MAX_ARCHIVE_ENTRY_BYTES = 128 * 1024 MAX_ARCHIVE_RELATIVE_PATH_BYTES = 180 +ZIP_EPOCH = (1980, 1, 1, 0, 0, 0) def load_json(path: Path) -> object: @@ -111,7 +113,10 @@ def build_archive(package_dir: Path, output_dir: Path, profile: str) -> dict[str with zipfile.ZipFile(archive_path, "w", compression=zipfile.ZIP_DEFLATED) as archive: for path in files: rel = path.relative_to(package_dir).as_posix() - archive.write(path, rel) + info = zipfile.ZipInfo(rel, date_time=ZIP_EPOCH) + info.compress_type = zipfile.ZIP_DEFLATED + info.external_attr = (stat.S_IMODE(path.stat().st_mode) & 0o777) << 16 + archive.writestr(info, path.read_bytes()) return { "id": manifest["id"],