#!/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())