libei/.gitlab-ci/check-event-values.py
Peter Hutterer a9edea65ca ci: add a check that our event values cannot diverge
See commit 168de89a "eis: sync event codes with libei", this script
should've prevented that issue.
2023-06-07 14:36:00 +10:00

65 lines
1.9 KiB
Python
Executable file

#!/usr/bin/env python3
#
# Check that the EI_EVENT_FOO and EIS_EVENT_FOO enum values match (for those events that
# exist in both libraries).
from typing import Iterator
from pathlib import Path
import re
import subprocess
import tempfile
template = """
#include <libei.h>
#include <libeis.h>
@@@
int main(void) {
return 0;
}
"""
assert_template = '_Static_assert(EIS_EVENT_{event} == EI_EVENT_{event}, "Mismatching event types for {event}");'
def extract(header: Path, prefix: str) -> Iterator[str]:
with open(header) as fd:
for line in fd:
match = re.match(rf"^\t{prefix}(\w+)", line)
if match:
yield match[1]
if __name__ == "__main__":
ei_events = extract(Path("src/libei.h"), prefix="EI_EVENT_")
eis_events = extract(Path("src/libeis.h"), prefix="EIS_EVENT_")
common = set(ei_events) & set(eis_events)
print("Shared events that need identical values:")
for e in common:
print(f" EI_EVENT_{e}")
asserts = (assert_template.format(event=e) for e in common)
with tempfile.NamedTemporaryFile(suffix=".c", delete=False) as fd:
fd.write(template.replace("@@@", "\n".join(asserts)).encode("utf-8"))
fd.flush()
pkgconfig = subprocess.run(
["pkg-config", "--cflags", "--libs", "libei-1.0", "libeis-1.0"],
check=True,
capture_output=True,
)
pkgconfig_args = pkgconfig.stdout.decode("utf-8").strip().split(" ")
try:
subprocess.run(
["gcc", "-o", "event-type-check", *pkgconfig_args, fd.name],
check=True,
capture_output=True,
)
print("Success. Event types are identical")
except subprocess.CalledProcessError as e:
print("Mismatching event types")
print(e.stdout.decode("utf-8"))
print(e.stderr.decode("utf-8"))
raise SystemExit(1)