#!/usr/bin/env python3 # -*- coding: utf-8 -*- r"""error_scan.py — 脚本错误扫描闸件(判定层通用,供本地闸各段复用) 用法: python tools/error_scan.py <日志文件> [...] 背景: GDScript 运行时脚本错误(SCRIPT ERROR / Parse Error)不改进程退出码、不计失败数, 故闸只能设在外部——本件把 run_smoke.py 的同一套判定抽出来给探针段与套件段共用。 错误标记与 tools/run_smoke.py 的 ERROR_MARKERS 同源(直接 import,禁复制第二份清单)。 退出码:0=无命中;1=命中脚本错误标记;2=用法错或日志不可读。 """ import sys from pathlib import Path sys.path.insert(0, str(Path(__file__).resolve().parent)) from run_smoke import ERROR_MARKERS # noqa: E402 单一事实源,禁在本件另写一份 def main() -> int: if hasattr(sys.stdout, "reconfigure"): sys.stdout.reconfigure(encoding="utf-8", errors="replace") args = sys.argv[1:] if not args: print("[error_scan] 用法: python tools/error_scan.py <日志文件> [...]") return 2 hits = [] for a in args: p = Path(a) if not p.is_file(): print("[error_scan] FAIL — 日志不可读: %s" % a) return 2 for ln in p.read_text(encoding="utf-8", errors="replace").splitlines(): s = ln.strip() if s and any(k in s for k in ERROR_MARKERS): hits.append((p.name, s)) if hits: print("[error_scan] FAIL — 脚本错误标记命中 %d 行(此类错误不改退出码," "且会中断所在函数的剩余断言)" % len(hits)) for name, s in hits[:5]: print(" - [%s] %s" % (name, s[:160])) return 1 return 0 if __name__ == "__main__": sys.exit(main())