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
# ------------------------------------------------------------------------------
# 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
#
@ -721,24 +745,28 @@ def check_style(top_level, commit):
print(commit.title)
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.
patterns = set()
patterns.update(StyleChecker.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)])]
if len(files) == 0:
print("Commit doesn't touch source files, skipping")
return 0
issues = 0
for f in files:
issues += check_file(top_level, commit, f)
if issues == 0:
print("No style issue detected")
print("No issue detected")
else:
print('---')
print("%u potential style %s detected, please review" % \
print("%u potential %s detected, please review" %
(issues, 'issue' if issues == 1 else 'issues'))
return issues