mirror of
https://github.com/openvswitch/ovs
synced 2025-09-02 07:15:17 +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:
committed by
Aaron Conole
parent
58c66c1900
commit
a6ccd11155
@@ -634,3 +634,24 @@ try_checkpatch \
|
|||||||
"--skip-committer-signoff"
|
"--skip-committer-signoff"
|
||||||
|
|
||||||
AT_CLEANUP
|
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
|
||||||
|
@@ -28,12 +28,14 @@ __errors = 0
|
|||||||
__warnings = 0
|
__warnings = 0
|
||||||
empty_return_check_state = 0
|
empty_return_check_state = 0
|
||||||
print_file_name = None
|
print_file_name = None
|
||||||
|
check_authors_file = False
|
||||||
checking_file = False
|
checking_file = False
|
||||||
total_line = 0
|
total_line = 0
|
||||||
colors = False
|
colors = False
|
||||||
spellcheck = False
|
spellcheck = False
|
||||||
quiet = False
|
quiet = False
|
||||||
spell_check_dict = None
|
spell_check_dict = None
|
||||||
|
missing_authors = []
|
||||||
|
|
||||||
|
|
||||||
def open_spell_check_dict():
|
def open_spell_check_dict():
|
||||||
@@ -666,6 +668,10 @@ checks = [
|
|||||||
'check': lambda x: has_efgrep(x),
|
'check': lambda x: has_efgrep(x),
|
||||||
'print':
|
'print':
|
||||||
lambda: print_error("grep -E/-F should be used instead of egrep/fgrep")},
|
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
|
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):
|
def ovs_checkpatch_parse(text, filename, author=None, committer=None):
|
||||||
global print_file_name, total_line, checking_file, \
|
global print_file_name, total_line, checking_file, \
|
||||||
empty_return_check_state
|
empty_return_check_state, missing_authors
|
||||||
|
|
||||||
PARSE_STATE_HEADING = 0
|
PARSE_STATE_HEADING = 0
|
||||||
PARSE_STATE_DIFF_HEADER = 1
|
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 "
|
"who are not authors or co-authors or "
|
||||||
"committers: %s"
|
"committers: %s"
|
||||||
% ", ".join(extra_sigs))
|
% ", ".join(extra_sigs))
|
||||||
|
|
||||||
|
if check_authors_file:
|
||||||
|
missing_authors = do_authors_exist(missing_authors +
|
||||||
|
co_authors + [author])
|
||||||
|
|
||||||
elif is_committer.match(line):
|
elif is_committer.match(line):
|
||||||
committer = is_committer.match(line).group(2)
|
committer = is_committer.match(line).group(2)
|
||||||
elif is_author.match(line):
|
elif is_author.match(line):
|
||||||
@@ -1067,6 +1125,8 @@ Input options:
|
|||||||
|
|
||||||
Check options:
|
Check options:
|
||||||
-h|--help This help message
|
-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
|
-b|--skip-block-whitespace Skips the if/while/for whitespace tests
|
||||||
-l|--skip-leading-whitespace Skips the leading whitespace test
|
-l|--skip-leading-whitespace Skips the leading whitespace test
|
||||||
-q|--quiet Only print error and warning information
|
-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))
|
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):
|
def ovs_checkpatch_file(filename):
|
||||||
try:
|
try:
|
||||||
mail = email.message_from_file(open(filename, 'r', encoding='utf8'))
|
mail = email.message_from_file(open(filename, 'r', encoding='utf8'))
|
||||||
@@ -1116,6 +1189,8 @@ def ovs_checkpatch_file(filename):
|
|||||||
result = True
|
result = True
|
||||||
|
|
||||||
ovs_checkpatch_print_result()
|
ovs_checkpatch_print_result()
|
||||||
|
if ovs_checkpatch_print_missing_authors():
|
||||||
|
result = True
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
|
||||||
@@ -1138,9 +1213,10 @@ if __name__ == '__main__':
|
|||||||
sys.argv[1:])
|
sys.argv[1:])
|
||||||
n_patches = int(numeric_options[-1][1:]) if numeric_options else 0
|
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",
|
["check-file",
|
||||||
"help",
|
"help",
|
||||||
|
"check-authors-file",
|
||||||
"skip-block-whitespace",
|
"skip-block-whitespace",
|
||||||
"skip-leading-whitespace",
|
"skip-leading-whitespace",
|
||||||
"skip-signoff-lines",
|
"skip-signoff-lines",
|
||||||
@@ -1157,6 +1233,8 @@ if __name__ == '__main__':
|
|||||||
if o in ("-h", "--help"):
|
if o in ("-h", "--help"):
|
||||||
usage()
|
usage()
|
||||||
sys.exit(0)
|
sys.exit(0)
|
||||||
|
elif o in ("-a", "--check-authors-file"):
|
||||||
|
check_authors_file = True
|
||||||
elif o in ("-b", "--skip-block-whitespace"):
|
elif o in ("-b", "--skip-block-whitespace"):
|
||||||
skip_block_whitespace_check = True
|
skip_block_whitespace_check = True
|
||||||
elif o in ("-l", "--skip-leading-whitespace"):
|
elif o in ("-l", "--skip-leading-whitespace"):
|
||||||
@@ -1207,9 +1285,10 @@ Subject: %s
|
|||||||
if not quiet:
|
if not quiet:
|
||||||
print('== Checking %s ("%s") ==' % (revision[0:12], name))
|
print('== Checking %s ("%s") ==' % (revision[0:12], name))
|
||||||
result = ovs_checkpatch_parse(patch, revision)
|
result = ovs_checkpatch_parse(patch, revision)
|
||||||
ovs_checkpatch_print_result()
|
|
||||||
if result:
|
if result:
|
||||||
status = EXIT_FAILURE
|
status = EXIT_FAILURE
|
||||||
|
if ovs_checkpatch_print_missing_authors():
|
||||||
|
status = EXIT_FAILURE
|
||||||
sys.exit(status)
|
sys.exit(status)
|
||||||
|
|
||||||
if not args:
|
if not args:
|
||||||
@@ -1218,6 +1297,8 @@ Subject: %s
|
|||||||
sys.exit(EXIT_FAILURE)
|
sys.exit(EXIT_FAILURE)
|
||||||
result = ovs_checkpatch_parse(sys.stdin.read(), '-')
|
result = ovs_checkpatch_parse(sys.stdin.read(), '-')
|
||||||
ovs_checkpatch_print_result()
|
ovs_checkpatch_print_result()
|
||||||
|
if ovs_checkpatch_print_missing_authors():
|
||||||
|
result = EXIT_FAILURE
|
||||||
sys.exit(result)
|
sys.exit(result)
|
||||||
|
|
||||||
status = 0
|
status = 0
|
||||||
|
Reference in New Issue
Block a user