#!/usr/bin/env fuchsia-vendored-python
# Copyright 2019 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.

import argparse
import os
import re
import sys

SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
FUCHSIA_ROOT = os.path.dirname(  # $root
    os.path.dirname(SCRIPT_DIR)  # scripts
)  # owner


# $ what_do_i_own.py me@mydomain file_i_own file_i_dont
# file_i_own
def main():
    parser = argparse.ArgumentParser(
        description="Filters `paths` for those owned by `owner`"
    )
    parser.add_argument("owner")
    parser.add_argument("paths", nargs="+")
    args = parser.parse_args()
    owner = args.owner
    abspaths = [os.path.abspath(path) for path in args.paths]

    perfile_exp = re.compile("^\s*per-file ([^\s=]*)\s*=\s*" + owner)

    # Find all OWNERS files
    path_to_owners = {}
    for path in abspaths:
        dir = path if os.path.isdir(path) else os.path.dirname(path)
        dir = os.path.abspath(dir)
        while (
            os.path.exists(dir)
            and os.path.commonprefix([dir, FUCHSIA_ROOT]) == FUCHSIA_ROOT
        ):
            owners_path = os.path.join(dir, "OWNERS")
            if os.path.exists(owners_path):
                path_to_owners[path] = owners_path
                break
            dir = os.path.dirname(dir)

    # Parse all OWNERS files
    owned = set()
    for path, owners in path_to_owners.items():
        with open(owners) as f:
            for line in f.readlines():
                if line.strip().startswith(owner):
                    owned.add(path)
                    continue
                match = perfile_exp.match(line)
                if match:
                    filename = os.path.abspath(
                        os.path.join(os.path.dirname(owners), match.group(1))
                    )
                    if filename in abspaths:
                        owned.add(path)

    # Print owned files
    for owned_path in sorted(owned):
        print(os.path.relpath(owned_path))

    return 0


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