# Copyright 2021 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""A script for updating BUILD.gn file for third-party golibs.

This script traverses source directories for all targets and prints updated
BUILD.gn to stdout.

TODO(https://github.com/golang/go/issues/42504): Switch to use `go list` when it
supports listing without build constraints.
"""

import argparse
import glob
import os
import sys


def is_source(f):
    """Returns true iff the input file name is considered a source file."""
    return not f.endswith('_test.go') and (
        f.endswith('.go') or f.endswith('.s'))


def all_sources(golibs_dir, lib_name):
    """Returns all source paths to all source files of a library.

    Paths are relative to library root: vendor/{lib_name}
    """
    lib_root = os.path.join(golibs_dir, 'vendor', lib_name)
    return (
        os.path.relpath(f, lib_root)
        for f in glob.glob(os.path.join(lib_root, '**', '*'), recursive=True)
        if is_source(f)
    )


def main():
    parser = argparse.ArgumentParser()
    parser.add_argument(
        '--build-file',
        help='The BUILD.gn file to update',
        type=argparse.FileType('r'),
        required=True,
    )
    parser.add_argument(
        '--golibs-dir',
        help='Root directory for third-party golibs',
        required=True,
    )
    args = parser.parse_args()

    lib_name = ''
    skip = False
    for line in args.build_file:
        stripped_line = line.strip()

        if stripped_line.startswith('go_library("'):
            lib_name = line.split('"')[1]
            print(line.rstrip())
            continue

        if skip:
            if stripped_line.endswith(']'):
                skip = False
            continue

        # Skip old sources because we'll rewrite the list with updated ones.
        if stripped_line.startswith('sources = ['):
            # There's only one source.
            if stripped_line.endswith(']'):
                continue
            skip = True
            continue

        # Add sources right before the target ends.
        if stripped_line == '}':
            sources = all_sources(args.golibs_dir, lib_name)
            print('  sources = [')
            print('\n'.join(f'    "{src}",' for src in sorted(sources)))
            print('  ]')

        # Leave all other lines untouched.
        print(line.rstrip())


if __name__ == '__main__':
    sys.exit(main())
