utils: checkstyle.py: Add commit checkers

Add a new category of checkers that operate on a whole commit.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
This commit is contained in:
Laurent Pinchart 2020-12-24 12:34:55 +02:00
parent ba3278a749
commit bf7981f2bc

View file

@ -296,6 +296,30 @@ class ClassRegistry(type):
return newclass return newclass
# ------------------------------------------------------------------------------
# Commit Checkers
#
class CommitChecker(metaclass=ClassRegistry):
subclasses = []
def __init__(self):
pass
#
# Class methods
#
@classmethod
def checkers(cls):
for checker in cls.subclasses:
yield checker
class CommitIssue(object):
def __init__(self, msg):
self.msg = msg
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
# Style Checkers # Style Checkers
# #
@ -721,25 +745,29 @@ def check_style(top_level, commit):
print(commit.title) print(commit.title)
print(separator) print(separator)
issues = 0
# Apply the commit checkers first.
for checker in CommitChecker.checkers():
for issue in checker.check(commit, top_level):
print('%s%s%s' % (Colours.fg(Colours.Yellow), issue.msg, Colours.reset()))
issues += 1
# Filter out files we have no checker for. # Filter out files we have no checker for.
patterns = set() patterns = set()
patterns.update(StyleChecker.all_patterns()) patterns.update(StyleChecker.all_patterns())
patterns.update(Formatter.all_patterns()) patterns.update(Formatter.all_patterns())
files = [f for f in commit.files() if len([p for p in patterns if fnmatch.fnmatch(os.path.basename(f), p)])] files = [f for f in commit.files() if len([p for p in patterns if fnmatch.fnmatch(os.path.basename(f), p)])]
if len(files) == 0:
print("Commit doesn't touch source files, skipping")
return 0
issues = 0
for f in files: for f in files:
issues += check_file(top_level, commit, f) issues += check_file(top_level, commit, f)
if issues == 0: if issues == 0:
print("No style issue detected") print("No issue detected")
else: else:
print('---') print('---')
print("%u potential style %s detected, please review" % \ print("%u potential %s detected, please review" %
(issues, 'issue' if issues == 1 else 'issues')) (issues, 'issue' if issues == 1 else 'issues'))
return issues return issues