#!/usr/bin/env python3 """Build the dependency-free CASAN VS Code extension as a deterministic VSIX.""" from __future__ import annotations import argparse import json import os import zipfile ROOT = os.path.dirname(os.path.abspath(__file__)) HARNESS = os.environ.get( "CASAN_HARNESS_ROOT", os.path.abspath(os.path.join(ROOT, "..", "casan-harness"))) SOURCE = os.path.join(HARNESS, "adapters", "vscode", "extension") CONTENT_TYPES = """ """ def manifest(package): identity = "%s.%s" % (package["publisher"], package["name"]) return """ {display} {description} casan,governance,github copilot,chat Other """.format( identity=identity, version=package["version"], publisher=package["publisher"], display=package["displayName"], description=package["description"], engine=package["engines"]["vscode"], ) def build(output): with open(os.path.join(SOURCE, "package.json"), "r", encoding="utf-8") as handle: package = json.load(handle) os.makedirs(os.path.dirname(os.path.abspath(output)), exist_ok=True) entries = ["package.json", "extension.js", "README.md"] with zipfile.ZipFile(output, "w", compression=zipfile.ZIP_DEFLATED) as archive: def write_entry(name, data): info = zipfile.ZipInfo(name, date_time=(2020, 1, 1, 0, 0, 0)) info.compress_type = zipfile.ZIP_DEFLATED info.external_attr = 0o644 << 16 archive.writestr(info, data) write_entry("[Content_Types].xml", CONTENT_TYPES) write_entry("extension.vsixmanifest", manifest(package)) for name in entries: source = os.path.join(SOURCE, name) with open(source, "rb") as handle: write_entry("extension/" + name, handle.read()) return output def main(): parser = argparse.ArgumentParser(description=__doc__) parser.add_argument("--output", default=os.path.join(ROOT, "dist", "casan-governed-chat.vsix")) args = parser.parse_args() print(build(args.output)) return 0 if __name__ == "__main__": raise SystemExit(main())