Files
llm/scripts/build_1c_extension_manifests.py

94 lines
3.4 KiB
Python

#!/usr/bin/env python3
"""Build root CAS manifests for all parsed 1C extensions."""
from __future__ import annotations
import argparse
import json
from pathlib import Path
from extract_1c_extension_cas_manifest import extract_manifest
def safe_name(value: str) -> str:
result = "".join(char if char.isalnum() or char in "-_." else "_" for char in value)
return result[:120] or "extension"
def main() -> int:
parser = argparse.ArgumentParser(description="Build CAS manifests for all extensions.")
parser.add_argument("--zipped-info", type=Path, required=True)
parser.add_argument("--cas-dir", type=Path, required=True)
parser.add_argument("--output-dir", type=Path, required=True)
parser.add_argument("--summary", type=Path, required=True)
args = parser.parse_args()
zipped = json.loads(args.zipped_info.read_text(encoding="utf-8"))
args.output_dir.mkdir(parents=True, exist_ok=True)
items = []
for item in zipped.get("items") or []:
root_key = item.get("root_cas_key")
if not root_key:
continue
root_path = args.cas_dir / root_key
if not root_path.is_file():
items.append({**item, "manifest_status": "root_cas_missing"})
continue
try:
manifest = extract_manifest(root_path, args.cas_dir)
except Exception as exc:
items.append(
{
"extension_zipped_info_file": item.get("file_name"),
"root_cas_key": root_key,
"manifest_status": "parse_error",
"error": str(exc),
}
)
continue
stem = safe_name(item.get("file_name", "").replace("__ExtensionZippedInfo.bin", ""))
output_path = args.output_dir / f"{stem}-{root_key[:8]}.json"
report = {
"schema": "onec_extension_cas_manifest.v1",
"extension_zipped_info": item,
**manifest,
}
output_path.write_text(json.dumps(report, ensure_ascii=False, indent=2) + "\n", encoding="utf-8")
items.append(
{
"extension_zipped_info_file": item.get("file_name"),
"root_cas_key": root_key,
"manifest_path": str(output_path),
"extension_configuration_guid": manifest.get("extension_configuration_guid"),
"declared_count": manifest.get("declared_count"),
"entry_count": manifest.get("entry_count"),
"missing_cas_entries": sum(1 for entry in manifest.get("entries") or [] if not entry.get("cas_exists")),
"manifest_status": "ok",
}
)
summary = {
"schema": "onec_extension_manifests_summary.v1",
"zipped_info": str(args.zipped_info),
"cas_dir": str(args.cas_dir),
"output_dir": str(args.output_dir),
"extension_count": len(items),
"items": items,
}
args.summary.parent.mkdir(parents=True, exist_ok=True)
args.summary.write_text(json.dumps(summary, ensure_ascii=False, indent=2) + "\n", encoding="utf-8")
print(
json.dumps(
{
"summary": str(args.summary),
"extensions": len(items),
"ok": sum(1 for item in items if item.get("manifest_status") == "ok"),
},
ensure_ascii=False,
)
)
return 0
if __name__ == "__main__":
raise SystemExit(main())