#!/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:]))
