diff --git a/tools/cmd_check.py b/tools/cmd_check.py old mode 100644 new mode 100755 index ccfb2964bb..3a402138bd --- a/tools/cmd_check.py +++ b/tools/cmd_check.py @@ -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('')