123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115 |
- """
- Tor code best-practices tracker
- Go through the various .c files and collect metrics about them. If the metrics
- violate some of our best practices and they are not found in the optional
- exceptions file ("./exceptions.txt"), then log a problem about them.
- The exceptions file is meant to be initialized with the current state of the
- source code as follows: ./practracker.py > ./exceptions.txt
- We currently do metrics about file size, function size and number of includes.
- TODO:
- - How is this tool supposed to be used? How should the exception file work?
- How should the UI work? Does it need special exit codes?
- - Fix the function_length function so that practracker_tests.py passes.
- """
- import os, sys
- import metrics
- import util
- import problem
- EXCLUDE_SOURCE_DIRS = ["/src/test/", "/src/trunnel/", "/src/ext/", "/.git/"]
- TOR_TOPDIR = "../../../"
- EXCEPTIONS_FILE = "./exceptions.txt"
- MAX_FILE_SIZE = 3000
- MAX_FUNCTION_SIZE = 100
- MAX_INCLUDE_COUNT = 50
- ProblemVault = None
- def consider_file_size(fname, f):
- file_size = metrics.file_len(f)
- if file_size > MAX_FILE_SIZE:
- v = problem.FileSizeProblem(fname, file_size)
- ProblemVault.register_problem(v)
- def consider_includes(fname, f):
- include_count = metrics.get_include_count(f)
- if include_count > MAX_INCLUDE_COUNT:
- v = problem.IncludeCountProblem(fname, include_count)
- ProblemVault.register_problem(v)
- def consider_function_size(fname, f):
- for name, lines in metrics.function_lines(f):
-
- if lines <= MAX_FUNCTION_SIZE:
- continue
-
- canonical_function_name = "%s:%s()" % (fname,name)
- v = problem.FunctionSizeProblem(canonical_function_name, lines)
- ProblemVault.register_problem(v)
- def consider_all_metrics(files_list):
- """Consider metrics for all files"""
- for fname in files_list:
- with open(fname, 'r') as f:
- consider_metrics_for_file(fname, f)
- def consider_metrics_for_file(fname, f):
- """
- Get metrics for file with filename 'fname' and file descriptor 'f'.
- """
-
- consider_file_size(fname, f)
-
- f.seek(0)
- consider_includes(fname, f)
-
- f.seek(0)
- consider_function_size(fname, f)
- def main():
- global ProblemVault
-
- files_list = util.get_tor_c_files(TOR_TOPDIR, EXCLUDE_SOURCE_DIRS)
-
-
- try:
- with open(EXCEPTIONS_FILE, 'r') as exception_f:
- ProblemVault = problem.ProblemVault(exception_f)
- except IOError:
- print "No exception file provided"
- ProblemVault = problem.ProblemVault(None)
-
- consider_all_metrics(files_list)
- if __name__ == '__main__':
- main()
|