tools: cmd_check.py checks headers too

Sometimes commands are externed and installed in another
file, so check for a command's name in the header file
corresponding to the file it's defined in before marking
it uninstalled.

Signed-off-by: Quentin Young <qlyoung@cumulusnetworks.com>
This commit is contained in:
Quentin Young 2016-10-25 00:29:25 +00:00
parent 71f11720ef
commit 55bdefacac

46
tools/cmd_check.py Normal file → Executable file
View File

@ -8,36 +8,52 @@ import re
import os
from pprint import pprint
# searching regex
search = [
# patterns used to extract commands
command_patterns = [
r'DEF.*\(.*\n\s*(.*_cmd)',
r'ALIAS.*\(.*\n\s*(.*_cmd)',
]
# patterns that count as installing the command
install_patterns = [
r'install_element.*\(.*{0}',
r'INSTALL.*\(.*{0}'
]
def process(filename):
cmds = []
notinstalled = []
uninstalled = []
sourcetext = ''
headertext = ''
# read source file and header file
with open(filename) as cf:
try:
tf = cf.read()
sourcetext = cf.read()
if os.path.isfile(filename.replace('.c', '.h')):
with open(filename) as hf:
headertext = hf.read()
except:
print('Error reading {0}, skipping'.format(filename))
return
# build list of defined commands
for expression in search:
for match in re.findall(expression, tf, re.M):
cmds.append(match)
# build list of not installed commands
notinstalled = filter(
lambda x: len(re.findall('install_element.*\(.*{0}'.format(x), tf, re.M)) == 0,
cmds)
notinstalled = list(notinstalled)
if len(notinstalled) > 0:
# build list of defined commands that aren't mentioned in header
for pattern in command_patterns:
for match in re.findall(pattern, sourcetext, re.M):
if re.search(match, headertext) is None:
cmds.append(match)
# build list of not installed commands
for cmd in cmds:
pats = [ ip.format(cmd) for ip in install_patterns ]
if not any([ re.search(pat, sourcetext) is not None for pat in pats ]):
uninstalled.append(cmd)
if len(uninstalled) > 0:
print('\033[92m', end='')
print('{0}'.format(filename))
print('\033[0m', end='')
for cmd in notinstalled:
for cmd in uninstalled:
print(' {0}'.format(cmd))
print('')