checkstyle: Introduce a Commit class

This introduces a Commit class used in the final revlist list. All the
git commands are moved into that class. This class will be used to
introduce new types of commit (StagedChanges and Amendment) needed to implement
pre-commit hook support.

Signed-off-by: Nicolas Dufresne <nicolas.dufresne@collabora.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
This commit is contained in:
Nicolas Dufresne 2020-01-18 15:00:12 -05:00 committed by Laurent Pinchart
parent 0b86152a57
commit fef2f02324

View file

@ -458,12 +458,33 @@ class StripTrailingSpaceFormatter(Formatter):
# Style checking # Style checking
# #
class Commit:
def __init__(self, commit):
self.commit = commit
def get_info(self):
# Get the commit title and list of files.
ret = subprocess.run(['git', 'show', '--pretty=oneline', '--name-only',
self.commit],
stdout=subprocess.PIPE).stdout.decode('utf-8')
files = ret.splitlines()
# Returning title and files list as a tuple
return files[0], files[1:]
def get_diff(self, top_level, filename):
return subprocess.run(['git', 'diff', '%s~..%s' % (self.commit, self.commit),
'--', '%s/%s' % (top_level, filename)],
stdout=subprocess.PIPE).stdout.decode('utf-8')
def get_file(self, filename):
return subprocess.run(['git', 'show', '%s:%s' % (self.commit, filename)],
stdout=subprocess.PIPE).stdout.decode('utf-8')
def check_file(top_level, commit, filename): def check_file(top_level, commit, filename):
# Extract the line numbers touched by the commit. # Extract the line numbers touched by the commit.
diff = subprocess.run(['git', 'diff', '%s~..%s' % (commit, commit), '--', diff = commit.get_diff(top_level, filename)
'%s/%s' % (top_level, filename)], diff = diff.splitlines(True)
stdout=subprocess.PIPE).stdout
diff = diff.decode('utf-8').splitlines(True)
commit_diff = parse_diff(diff) commit_diff = parse_diff(diff)
lines = [] lines = []
@ -476,9 +497,7 @@ def check_file(top_level, commit, filename):
# Format the file after the commit with all formatters and compute the diff # Format the file after the commit with all formatters and compute the diff
# between the unformatted and formatted contents. # between the unformatted and formatted contents.
after = subprocess.run(['git', 'show', '%s:%s' % (commit, filename)], after = commit.get_file(filename)
stdout=subprocess.PIPE).stdout
after = after.decode('utf-8')
formatted = after formatted = after
for formatter in Formatter.formatters(filename): for formatter in Formatter.formatters(filename):
@ -522,12 +541,7 @@ def check_file(top_level, commit, filename):
def check_style(top_level, commit): def check_style(top_level, commit):
# Get the commit title and list of files. title, files = commit.get_info()
ret = subprocess.run(['git', 'show', '--pretty=oneline','--name-only', commit],
stdout=subprocess.PIPE)
files = ret.stdout.decode('utf-8').splitlines()
title = files[0]
files = files[1:]
separator = '-' * len(title) separator = '-' * len(title)
print(separator) print(separator)
@ -557,7 +571,7 @@ def check_style(top_level, commit):
return issues return issues
def extract_revlist(revs): def extract_commits(revs):
"""Extract a list of commits on which to operate from a revision or revision """Extract a list of commits on which to operate from a revision or revision
range. range.
""" """
@ -576,7 +590,7 @@ def extract_revlist(revs):
revlist = ret.stdout.decode('utf-8').splitlines() revlist = ret.stdout.decode('utf-8').splitlines()
revlist.reverse() revlist.reverse()
return revlist return [Commit(x) for x in revlist]
def git_top_level(): def git_top_level():
@ -632,10 +646,10 @@ def main(argv):
if top_level is None: if top_level is None:
return 1 return 1
revlist = extract_revlist(args.revision_range) commits = extract_commits(args.revision_range)
issues = 0 issues = 0
for commit in revlist: for commit in commits:
issues += check_style(top_level, commit) issues += check_style(top_level, commit)
print('') print('')