github.com/westcoastroms/westcoastroms-build@v0.0.0-20190928114312-2350e5a73030/build/make/tools/checkowners.py (about)

     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 urllib
     9  import urllib2
    10  
    11  parser = argparse.ArgumentParser(description='Check OWNERS file syntax')
    12  parser.add_argument('-v', '--verbose', dest='verbose',
    13                      action='store_true', default=False,
    14                      help='Verbose output to debug')
    15  parser.add_argument('-c', '--check_address', dest='check_address',
    16                      action='store_true', default=False,
    17                      help='Check email addresses')
    18  parser.add_argument(dest='owners', metavar='OWNERS', nargs='+',
    19                      help='Path to OWNERS file')
    20  args = parser.parse_args()
    21  
    22  gerrit_server = 'https://android-review.googlesource.com'
    23  checked_addresses = {}
    24  
    25  
    26  def echo(msg):
    27    if args.verbose:
    28      print msg
    29  
    30  
    31  def find_address(address):
    32    if address not in checked_addresses:
    33      request = (gerrit_server + '/accounts/?n=1&o=ALL_EMAILS&q=email:'
    34                 + urllib.quote(address))
    35      echo('Checking email address: ' + address)
    36      result = urllib2.urlopen(request).read()
    37      checked_addresses[address] = (
    38          result.find('"email":') >= 0 and result.find('"_account_id":') >= 0)
    39    return checked_addresses[address]
    40  
    41  
    42  def 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  
    77  if __name__ == '__main__':
    78    main()