2
0
mirror of https://github.com/openvswitch/ovs synced 2025-08-31 06:15:47 +00:00

checkpatch: Add new check-authors-file option to checkpatch.py.

This patch adds a new option, --check-authors-file, to the checkpatch
tool to help OVS maintainers check for missing authors in the
AUTHORS.rst file.

Co-authored-by: Aaron Conole <aconole@redhat.com>
Signed-off-by: Aaron Conole <aconole@redhat.com>
Signed-off-by: Eelco Chaudron <echaudro@redhat.com>
This commit is contained in:
Eelco Chaudron
2024-10-02 14:01:43 +02:00
committed by Aaron Conole
parent 58c66c1900
commit a6ccd11155
2 changed files with 105 additions and 3 deletions

View File

@@ -634,3 +634,24 @@ try_checkpatch \
"--skip-committer-signoff"
AT_CLEANUP
AT_SETUP([checkpatch - AUTHORS.rst existence])
try_checkpatch \
"Author: A <a@a.com>
Commit: A <a@a.com>
Subject: netdev: Subject.
Signed-off-by: A <a@a.com>" \
""
try_checkpatch \
"Author: A <a@a.com>
Commit: A <a@a.com>
Subject: netdev: Subject.
Signed-off-by: A <a@a.com>" \
"WARNING: Author 'A <a@a.com>' is not in the AUTHORS.rst file!" \
"-a"
AT_CLEANUP

View File

@@ -28,12 +28,14 @@ __errors = 0
__warnings = 0
empty_return_check_state = 0
print_file_name = None
check_authors_file = False
checking_file = False
total_line = 0
colors = False
spellcheck = False
quiet = False
spell_check_dict = None
missing_authors = []
def open_spell_check_dict():
@@ -666,6 +668,10 @@ checks = [
'check': lambda x: has_efgrep(x),
'print':
lambda: print_error("grep -E/-F should be used instead of egrep/fgrep")},
{'regex': 'AUTHORS.rst$', 'match_name': None,
'check': lambda x: update_missing_authors(x),
'print': None},
]
@@ -860,9 +866,56 @@ def run_subject_checks(subject, spellcheck=False):
return warnings
def get_top_directory():
with os.popen('git rev-parse --show-toplevel') as pipe:
path = pipe.read()
if path:
return path.strip()
return "."
def update_missing_authors(diffed_line):
global missing_authors
for author in missing_authors:
m = re.search(r'<(.*?)>', author)
if not m:
continue
pattern = r'\b' + re.escape(m.group(1)) + r'\b'
if re.search(pattern, diffed_line) is None:
continue
else:
missing_authors.remove(author)
return False
def do_authors_exist(authors):
authors = list(set(authors))
missing_authors = []
try:
with open(get_top_directory() + "/AUTHORS.rst", "r") as file:
file_content = file.read()
for author in authors:
m = re.search(r'<(.*?)>', author)
if not m:
continue
pattern = r'\b' + re.escape(m.group(1)) + r'\b'
if re.search(pattern, file_content) is None:
missing_authors.append(author)
except FileNotFoundError:
print_error("Could not open AUTHORS.rst in '%s/'!" %
get_top_directory())
return missing_authors
def ovs_checkpatch_parse(text, filename, author=None, committer=None):
global print_file_name, total_line, checking_file, \
empty_return_check_state
empty_return_check_state, missing_authors
PARSE_STATE_HEADING = 0
PARSE_STATE_DIFF_HEADER = 1
@@ -977,6 +1030,11 @@ def ovs_checkpatch_parse(text, filename, author=None, committer=None):
"who are not authors or co-authors or "
"committers: %s"
% ", ".join(extra_sigs))
if check_authors_file:
missing_authors = do_authors_exist(missing_authors +
co_authors + [author])
elif is_committer.match(line):
committer = is_committer.match(line).group(2)
elif is_author.match(line):
@@ -1067,6 +1125,8 @@ Input options:
Check options:
-h|--help This help message
-a|--check-authors-file Check AUTHORS file for existence of the authors.
Should be used by commiters only!
-b|--skip-block-whitespace Skips the if/while/for whitespace tests
-l|--skip-leading-whitespace Skips the leading whitespace test
-q|--quiet Only print error and warning information
@@ -1089,6 +1149,19 @@ def ovs_checkpatch_print_result():
print("Lines checked: %d, no obvious problems found\n" % (total_line))
def ovs_checkpatch_print_missing_authors():
if missing_authors:
if len(missing_authors) == 1:
print_warning("Author '%s' is not in the AUTHORS.rst file!"
% missing_authors[0])
else:
print_warning("Authors '%s' are not in the AUTHORS.rst file!"
% ', '.join(missing_authors))
return True
return False
def ovs_checkpatch_file(filename):
try:
mail = email.message_from_file(open(filename, 'r', encoding='utf8'))
@@ -1116,6 +1189,8 @@ def ovs_checkpatch_file(filename):
result = True
ovs_checkpatch_print_result()
if ovs_checkpatch_print_missing_authors():
result = True
return result
@@ -1138,9 +1213,10 @@ if __name__ == '__main__':
sys.argv[1:])
n_patches = int(numeric_options[-1][1:]) if numeric_options else 0
optlist, args = getopt.getopt(args, 'bhlstfSq',
optlist, args = getopt.getopt(args, 'abhlstfSq',
["check-file",
"help",
"check-authors-file",
"skip-block-whitespace",
"skip-leading-whitespace",
"skip-signoff-lines",
@@ -1157,6 +1233,8 @@ if __name__ == '__main__':
if o in ("-h", "--help"):
usage()
sys.exit(0)
elif o in ("-a", "--check-authors-file"):
check_authors_file = True
elif o in ("-b", "--skip-block-whitespace"):
skip_block_whitespace_check = True
elif o in ("-l", "--skip-leading-whitespace"):
@@ -1207,9 +1285,10 @@ Subject: %s
if not quiet:
print('== Checking %s ("%s") ==' % (revision[0:12], name))
result = ovs_checkpatch_parse(patch, revision)
ovs_checkpatch_print_result()
if result:
status = EXIT_FAILURE
if ovs_checkpatch_print_missing_authors():
status = EXIT_FAILURE
sys.exit(status)
if not args:
@@ -1218,6 +1297,8 @@ Subject: %s
sys.exit(EXIT_FAILURE)
result = ovs_checkpatch_parse(sys.stdin.read(), '-')
ovs_checkpatch_print_result()
if ovs_checkpatch_print_missing_authors():
result = EXIT_FAILURE
sys.exit(result)
status = 0