| #!/usr/bin/env python2.7 |
| # 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( # scripts |
| SCRIPT_DIR)) # owner |
| |
| owner_exp = re.compile('^\s*([a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+)') |
| perfile_exp = re.compile( |
| '^\s*per-file ([^\s=]*)\s*=\s*([a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.' |
| '[a-zA-Z0-9-.]+)') |
| |
| |
| # $ ./who_owns.py file1 |
| # owner1@example.com,owner2@example.com |
| # |
| # $ ./who_owns.py file2 |
| # owner3@example.com |
| # |
| # $ ./who_owns.py file1 file2 |
| # owner1@example.com,owner2@example.com,owner3@example.com |
| def main(): |
| parser = argparse.ArgumentParser( |
| description='Finds all OWNERS of `paths`') |
| parser.add_argument('paths', nargs='+') |
| args = parser.parse_args() |
| abspaths = [os.path.abspath(path) for path in args.paths] |
| |
| # Find all OWNERS files |
| owners_paths = set() |
| 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): |
| owners_paths.add(owners_path) |
| break |
| dir = os.path.dirname(dir) |
| |
| # Parse all OWNERS files |
| owners = set() |
| for path in owners_paths: |
| with open(path) as f: |
| for line in f.readlines(): |
| match = owner_exp.match(line) |
| if match: |
| owners.add(match.group(1)) |
| continue |
| match = perfile_exp.match(line) |
| if match: |
| filename = os.path.abspath( |
| os.path.join(os.path.dirname(path), match.group(1))) |
| if filename in abspaths: |
| owners.add(match.group(2)) |
| |
| print ','.join(sorted(owners)) |
| |
| return 0 |
| |
| |
| if __name__ == '__main__': |
| sys.exit(main()) |