mirror of https://github.com/mongodb/mongo
81 lines
2.6 KiB
Python
81 lines
2.6 KiB
Python
import json
|
||
import os
|
||
import sys
|
||
|
||
from buildscripts.simple_report import make_report, put_report, try_combine_reports
|
||
from buildscripts.util.read_config import read_config_file
|
||
|
||
# 1. detect if we should run symbol-check reporting
|
||
expansions = read_config_file("../expansions.yml")
|
||
symbol_check = expansions.get("run_for_symbol_check", None)
|
||
|
||
if not symbol_check:
|
||
sys.exit(0)
|
||
|
||
failures = []
|
||
|
||
# 2. walk bazel-bin for *_checked files emitted by the aspect
|
||
for root, _, files in os.walk("bazel-bin"):
|
||
for name in files:
|
||
if not name.endswith("_checked"):
|
||
continue
|
||
|
||
checked_path = os.path.join(root, name)
|
||
# default values in case we fall back to text mode
|
||
target = None
|
||
sym_file = None
|
||
missing = None
|
||
status = None
|
||
|
||
with open(checked_path) as f:
|
||
data = json.load(f)
|
||
|
||
status = data.get("status")
|
||
target = data.get("target")
|
||
sym_file = data.get("sym_file")
|
||
missing = data.get("missing", [])
|
||
|
||
if status == "failed":
|
||
# build content for the report
|
||
lines = []
|
||
lines.append(f"Symbol check failed for: {target}")
|
||
lines.append("Missing symbols:")
|
||
for m in missing:
|
||
lines.append(f" - {m}")
|
||
lines.append(
|
||
f"Please check to see if {target} is missing any deps that would include the symbols above"
|
||
)
|
||
|
||
# reproduction hint – adjust this to your CI config name
|
||
# if you have a real config, e.g. --config=symbol-check, use that
|
||
repro_target = target or sym_file or checked_path
|
||
lines.append("")
|
||
lines.append("To reproduce:")
|
||
lines.append(f" bazel build --config=symbol-checker {repro_target}")
|
||
|
||
content = "\n".join(lines)
|
||
|
||
# for symbol check we don't have a real src path like clang-tidy,
|
||
# so use a synthetic "file" name that encodes the bazel target
|
||
synthetic_file = f"symbol_check:{target or checked_path}"
|
||
|
||
failures.append((synthetic_file, content))
|
||
|
||
# 3. write a helper invocation file
|
||
# adjust this to your actual symbol-check build config if you have one
|
||
with open("bazel-invocation.txt", "w") as f:
|
||
f.write("bazel build --config=symbol-checker //src/...")
|
||
|
||
# 4. emit reports
|
||
if failures:
|
||
for filename, content in failures:
|
||
report = make_report(filename, content, 1)
|
||
try_combine_reports(report)
|
||
put_report(report)
|
||
sys.exit(1)
|
||
else:
|
||
report = make_report("symbol-check", "all symbol checks passed", 0)
|
||
try_combine_reports(report)
|
||
put_report(report)
|
||
sys.exit(0)
|