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