blob: e0e82a2d16977fc52d077f565b425029bacb7e67 [file] [log] [blame]
#!/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())