#!/usr/bin/env python # # litlint # # Ensure RUN commands in lit tests are free of common errors. # # If any errors are detected, litlint returns a nonzero exit code. # import optparse import re import sys # Compile regex once for all files runRegex = re.compile(r'(?<!-o)(?<!%run) %t\s') def LintLine(s): """ Validate a line Args: s: str, the line to validate Returns: Returns an error message and a 1-based column number if an error was detected, otherwise (None, None). """ # Check that RUN command can be executed with an emulator m = runRegex.search(s) if m: start, end = m.span() return ('missing %run before %t', start + 2) # No errors return (None, None) def LintFile(p): """ Check that each RUN command can be executed with an emulator Args: p: str, valid path to a file Returns: The number of errors detected. """ errs = 0 with open(p, 'r') as f: for i, s in enumerate(f.readlines(), start=1): msg, col = LintLine(s) if msg != None: errs += 1 errorMsg = 'litlint: {}:{}:{}: error: {}.\n{}{}\n' arrow = (col-1) * ' ' + '^' sys.stderr.write(errorMsg.format(p, i, col, msg, s, arrow)) return errs if __name__ == "__main__": # Parse args parser = optparse.OptionParser() parser.add_option('--filter') # ignored (options, filenames) = parser.parse_args() # Lint each file errs = 0 for p in filenames: errs += LintFile(p) # If errors, return nonzero if errs > 0: sys.exit(1)