Home | History | Annotate | Download | only in tools
      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