blob: 1190d30f2caee3630ecf7b7f0d5d3b0a2cdbc117 [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 Hsiehbee0dec2017-04-05 14:16:49 -070033 request = (gerrit_server + '/accounts/?n=1&o=ALL_EMAILS&q=email:'
34 + 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 Hsieh2b1efe62017-09-07 11:55:31 -070037 checked_addresses[address] = (
38 result.find('"email":') >= 0 and result.find('"_account_id":') >= 0)
Chih-Hung Hsiehadaed142017-02-22 16:14:48 -080039 return checked_addresses[address]
40
41
42def main():
43 # One regular expression to check all valid lines.
44 noparent = 'set +noparent'
45 email = '([^@ ]+@[^ @]+|\\*)'
46 directive = '(%s|%s)' % (email, noparent)
47 glob = '[a-zA-Z0-9_\\.\\-\\*\\?]+'
48 perfile = 'per-file +' + glob + ' *= *' + directive
49 pats = '(|%s|%s|%s)$' % (noparent, email, perfile)
50 patterns = re.compile(pats)
51
52 # One pattern to capture email address.
53 email_address = '.*(@| |=|^)([^@ =]+@[^ @]+)'
54 address_pattern = re.compile(email_address)
55
56 error = 0
57 for fname in args.owners:
58 echo('Checking file: ' + fname)
59 num = 0
60 for line in open(fname, 'r'):
61 num += 1
62 stripped_line = re.sub('#.*$', '', line).strip()
63 if not patterns.match(stripped_line):
64 error = 1
65 print('%s:%d: ERROR: unknown line [%s]'
66 % (fname, num, line.strip()))
67 elif args.check_address and address_pattern.match(stripped_line):
68 address = address_pattern.match(stripped_line).group(2)
69 if find_address(address):
70 echo('Found email address: ' + address)
71 else:
72 error = 1
73 print('%s:%d: ERROR: unknown email address: %s'
74 % (fname, num, address))
75 sys.exit(error)
76
77if __name__ == '__main__':
78 main()