1 #!/usr/bin/python 2 3 """Parse and check syntax errors of a given OWNERS file.""" 4 5 import argparse 6 import re 7 import sys 8 import urllib2 9 10 parser = argparse.ArgumentParser(description='Check OWNERS file syntax') 11 parser.add_argument('-v', '--verbose', dest='verbose', 12 action='store_true', default=False, 13 help='Verbose output to debug') 14 parser.add_argument('-c', '--check_address', dest='check_address', 15 action='store_true', default=False, 16 help='Check email addresses') 17 parser.add_argument(dest='owners', metavar='OWNERS', nargs='+', 18 help='Path to OWNERS file') 19 args = parser.parse_args() 20 21 gerrit_server = 'https://android-review.googlesource.com' 22 checked_addresses = {} 23 24 25 def echo(msg): 26 if args.verbose: 27 print msg 28 29 30 def find_address(address): 31 if address not in checked_addresses: 32 request = gerrit_server + '/accounts/?suggest&q=' + address 33 echo('Checking email address: ' + address) 34 result = urllib2.urlopen(request).read() 35 expected = '"email": "' + address + '"' 36 checked_addresses[address] = (result.find(expected) >= 0) 37 return checked_addresses[address] 38 39 40 def main(): 41 # One regular expression to check all valid lines. 42 noparent = 'set +noparent' 43 email = '([^@ ]+@[^ @]+|\\*)' 44 directive = '(%s|%s)' % (email, noparent) 45 glob = '[a-zA-Z0-9_\\.\\-\\*\\?]+' 46 perfile = 'per-file +' + glob + ' *= *' + directive 47 pats = '(|%s|%s|%s)$' % (noparent, email, perfile) 48 patterns = re.compile(pats) 49 50 # One pattern to capture email address. 51 email_address = '.*(@| |=|^)([^@ =]+@[^ @]+)' 52 address_pattern = re.compile(email_address) 53 54 error = 0 55 for fname in args.owners: 56 echo('Checking file: ' + fname) 57 num = 0 58 for line in open(fname, 'r'): 59 num += 1 60 stripped_line = re.sub('#.*$', '', line).strip() 61 if not patterns.match(stripped_line): 62 error = 1 63 print('%s:%d: ERROR: unknown line [%s]' 64 % (fname, num, line.strip())) 65 elif args.check_address and address_pattern.match(stripped_line): 66 address = address_pattern.match(stripped_line).group(2) 67 if find_address(address): 68 echo('Found email address: ' + address) 69 else: 70 error = 1 71 print('%s:%d: ERROR: unknown email address: %s' 72 % (fname, num, address)) 73 sys.exit(error) 74 75 if __name__ == '__main__': 76 main() 77