blob: 8f450e7a43287a353e901d4cb03392fd8e1eb7ba [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
8import urllib2
9
10parser = argparse.ArgumentParser(description='Check OWNERS file syntax')
11parser.add_argument('-v', '--verbose', dest='verbose',
12 action='store_true', default=False,
13 help='Verbose output to debug')
14parser.add_argument('-c', '--check_address', dest='check_address',
15 action='store_true', default=False,
16 help='Check email addresses')
17parser.add_argument(dest='owners', metavar='OWNERS', nargs='+',
18 help='Path to OWNERS file')
19args = parser.parse_args()
20
21gerrit_server = 'https://android-review.googlesource.com'
22checked_addresses = {}
23
24
25def echo(msg):
26 if args.verbose:
27 print msg
28
29
30def 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
40def 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
75if __name__ == '__main__':
76 main()