blob: 8ab482db5cc837fdd6e0798a44167cdc1532c338 [file] [log] [blame]
#!/usr/bin/env python3
# Copyright 2022 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Compares generated D-Bus header files.
This confirms that new dbus-binding generator outputs the same file
(except for the header guard parts) as original dbus-binding generator.
"""
import argparse
import difflib
import pathlib
import re
import sys
def get_parser():
"""Returns an argument parser."""
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument(
"--out",
required=True,
type=pathlib.Path,
help="file to output diff result",
)
parser.add_argument(
"--cpp",
required=True,
type=pathlib.Path,
help="header file generated by generate-chromeos-dbus-bindings",
)
parser.add_argument(
"--go",
required=True,
type=pathlib.Path,
help="header file generated by go-generate-chromeos-dbus-bindings",
)
return parser
def main(argv):
parser = get_parser()
opts = parser.parse_args(argv)
# New dbus-binding generator outputs to a different directory than
# original dbus-binding generator. So we need to erase the extra string
# caused by this difference.
dbus_tmp_headerguard_re = re.compile(
r"^(#(?:ifndef|define|endif //) [_A-Z0-9]*)_DBUS_TMP"
)
headers_by_cpp = [
dbus_tmp_headerguard_re.sub(r"\1", x)
for x in opts.cpp.read_text(encoding="utf-8").splitlines()
]
headers_by_go = opts.go.read_text(encoding="utf-8").splitlines()
diff_result = list(
difflib.unified_diff(
headers_by_cpp,
headers_by_go,
fromfile=f"a/{opts.cpp.name}",
tofile=f"b/{opts.go.name}",
lineterm="",
)
)
# Even if there is no diff result, write to a file. Because an action rule
# in gn file requires at least one output file.
opts.out.write_text("\n".join(diff_result), encoding="utf-8")
if diff_result:
# Just for convenience, also output to stderr on error so that the
# build log includes the diff result.
print("\n".join(diff_result), file=sys.stderr)
return 1 if diff_result else 0
if __name__ == "__main__":
sys.exit(main(sys.argv[1:]))