Use multiple globs/emails in per-file syntax

Bug: 112259427
Test: tools/checkowners.py -c -v OWNERS */OWNERS */*/OWNERS
Change-Id: I0e2c2c64a23df360fbe7691c4336ca04099fba13
This commit is contained in:
Chih-Hung Hsieh 2018-08-15 16:07:27 -07:00
parent c9f31dff01
commit f77c7f75e5
4 changed files with 29 additions and 32 deletions

7
OWNERS
View File

@ -2,10 +2,7 @@ ccross@android.com
dwillemsen@google.com dwillemsen@google.com
nanzhang@google.com nanzhang@google.com
per-file * = ccross@android.com per-file * = ccross@android.com,dwillemsen@google.com,nanzhang@google.com
per-file * = dwillemsen@google.com
per-file * = nanzhang@google.com
# for version updates # for version updates
per-file version_defaults.mk = aseaton@google.com per-file version_defaults.mk = aseaton@google.com,elisapascual@google.com
per-file version_defaults.mk = elisapascual@google.com

View File

@ -1,8 +1 @@
per-file * = ccross@android.com per-file dex_preopt*.mk = ngeoffray@google.com,calin@google.com,mathewi@google.com,dbrazdil@google.com
per-file * = dwillemsen@google.com
per-file * = nanzhang@google.com
per-file dex_preopt*.mk = ngeoffray@google.com
per-file dex_preopt*.mk = calin@google.com
per-file dex_preopt*.mk = mathewi@google.com
per-file dex_preopt*.mk = dbrazdil@google.com

View File

@ -1,2 +1 @@
per-file warn.py = chh@google.com per-file warn.py,checkowners.py = chh@google.com
per-file checkowners.py = chh@google.com

View File

@ -35,22 +35,31 @@ def find_address(address):
echo('Checking email address: ' + address) echo('Checking email address: ' + address)
result = urllib2.urlopen(request).read() result = urllib2.urlopen(request).read()
checked_addresses[address] = result.find('"_account_id":') >= 0 checked_addresses[address] = result.find('"_account_id":') >= 0
if checked_addresses[address]:
echo('Found email address: ' + address)
return checked_addresses[address] return checked_addresses[address]
def check_address(fname, num, address):
if find_address(address):
return 0
print '%s:%d: ERROR: unknown email address: %s' % (fname, num, address)
return 1
def main(): def main():
# One regular expression to check all valid lines. # One regular expression to check all valid lines.
noparent = 'set +noparent' noparent = 'set +noparent'
email = '([^@ ]+@[^ @]+|\\*)' email = '([^@ ]+@[^ @]+|\\*)'
directive = '(%s|%s)' % (email, noparent) emails = '(%s( *, *%s)*)' % (email, email)
directive = '(%s|%s)' % (emails, noparent)
glob = '[a-zA-Z0-9_\\.\\-\\*\\?]+' glob = '[a-zA-Z0-9_\\.\\-\\*\\?]+'
perfile = 'per-file +' + glob + ' *= *' + directive globs = '(%s( *, *%s)*)' % (glob, glob)
perfile = 'per-file +' + globs + ' *= *' + directive
pats = '(|%s|%s|%s)$' % (noparent, email, perfile) pats = '(|%s|%s|%s)$' % (noparent, email, perfile)
patterns = re.compile(pats) patterns = re.compile(pats)
address_pattern = re.compile('([^@ ]+@[^ @]+)')
# One pattern to capture email address. perfile_pattern = re.compile('per-file +.*=(.*)')
email_address = '.*(@| |=|^)([^@ =]+@[^ @]+)'
address_pattern = re.compile(email_address)
error = 0 error = 0
for fname in args.owners: for fname in args.owners:
@ -60,17 +69,16 @@ def main():
num += 1 num += 1
stripped_line = re.sub('#.*$', '', line).strip() stripped_line = re.sub('#.*$', '', line).strip()
if not patterns.match(stripped_line): if not patterns.match(stripped_line):
error = 1 error += 1
print('%s:%d: ERROR: unknown line [%s]' print '%s:%d: ERROR: unknown line [%s]' % (fname, num, line.strip())
% (fname, num, line.strip())) elif args.check_address:
elif args.check_address and address_pattern.match(stripped_line): if perfile_pattern.match(stripped_line):
address = address_pattern.match(stripped_line).group(2) for addr in perfile_pattern.match(stripped_line).group(1).split(','):
if find_address(address): a = addr.strip()
echo('Found email address: ' + address) if a and a != '*':
else: error += check_address(fname, num, addr.strip())
error = 1 elif address_pattern.match(stripped_line):
print('%s:%d: ERROR: unknown email address: %s' error += check_address(fname, num, stripped_line)
% (fname, num, address))
sys.exit(error) sys.exit(error)
if __name__ == '__main__': if __name__ == '__main__':