2015-05-28 22:53:14 +08:00
|
|
|
#!/usr/bin/env python
|
2014-05-15 06:49:46 +08:00
|
|
|
#
|
2014-05-16 02:52:11 +08:00
|
|
|
# litlint
|
2014-05-15 06:49:46 +08:00
|
|
|
#
|
2014-05-16 02:52:11 +08:00
|
|
|
# Ensure RUN commands in lit tests are free of common errors.
|
|
|
|
#
|
|
|
|
# If any errors are detected, litlint returns a nonzero exit code.
|
2014-05-15 06:49:46 +08:00
|
|
|
#
|
|
|
|
|
2014-05-15 07:31:20 +08:00
|
|
|
import optparse
|
2014-05-15 06:49:46 +08:00
|
|
|
import re
|
|
|
|
import sys
|
|
|
|
|
2014-05-16 02:52:11 +08:00
|
|
|
# Compile regex once for all files
|
2014-05-15 06:49:46 +08:00
|
|
|
runRegex = re.compile(r'(?<!-o)(?<!%run) %t\s')
|
2014-05-16 02:52:11 +08:00
|
|
|
|
|
|
|
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)
|
|
|
|
|
2014-05-15 06:49:46 +08:00
|
|
|
|
|
|
|
def LintFile(p):
|
2014-05-16 02:52:11 +08:00
|
|
|
""" 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)
|
2014-05-15 06:49:46 +08:00
|
|
|
|
2014-05-16 02:52:11 +08:00
|
|
|
# If errors, return nonzero
|
|
|
|
if errs > 0:
|
|
|
|
sys.exit(1)
|