blob: 91169a868b731f23ddca48c506c3d88c61c510a5 [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:]))