- Update DOSBox Staging Team copyright span to year 2021 (DOSBox Team copyrights left untouched). - Add DOSBox Staging Team copyright line to files we extensively modified throughout 2020 (we add our copyright lines when number of non-trivially modified lines gets close to 50%). - Change "dosbox-staging team" to "DOSBox Staging Team", in line with updated branding. - Change MAME license identifiers to SPDX license identifiers. - Cleanup some excessive whitespace around copyright statements. - Do few adjustments to include order. - Add few missing copyright identifiers (GPL-2.0-or-later, LGPL-2.1-or-later, BSD-3-Clause) as appropriate for specific file. - Move SPDX identifiers to the top in scripts for consistency with other source files. - Remove old copy of GPL2 license in italian from old translations.
75 lines
2 KiB
Python
Executable file
75 lines
2 KiB
Python
Executable file
#!/usr/bin/python3
|
|
|
|
# SPDX-License-Identifier: GPL-2.0-or-later
|
|
#
|
|
# Copyright (C) 2020-2021 Kevin R. Croft <krcroft@gmail.com>
|
|
|
|
"""
|
|
Count the number of issues found in an PVS-Studio report.
|
|
|
|
Usage: count-pvs-issues.py REPORT [MAX-ISSUES]
|
|
Where:
|
|
- REPORT is a file in CSV-format
|
|
- MAX-ISSUES is as a positive integer indicating the maximum
|
|
issues that should be permitted before returning failure
|
|
to the shell. Default is non-limit.
|
|
|
|
"""
|
|
|
|
# pylint: disable=invalid-name
|
|
# pylint: disable=missing-docstring
|
|
|
|
import collections
|
|
import csv
|
|
import os
|
|
import sys
|
|
|
|
def parse_issues(filename):
|
|
"""
|
|
Returns a dict of source filename keys having occurrence-count values
|
|
|
|
"""
|
|
cwd = os.getcwd()
|
|
issues = collections.defaultdict(int)
|
|
with open(filename) as csvfile:
|
|
reader = csv.DictReader(csvfile)
|
|
for row in reader:
|
|
sourcefile = os.path.realpath(row['FilePath'])
|
|
# Skip non-file lines
|
|
if not sourcefile.startswith('/'):
|
|
continue
|
|
sourcefile = os.path.relpath(sourcefile, cwd)
|
|
issues[sourcefile] += 1
|
|
return issues
|
|
|
|
|
|
def main(argv):
|
|
# assume success until proven otherwise
|
|
rcode = 0
|
|
|
|
# Get the issues and the total tally
|
|
issues = parse_issues(argv[1])
|
|
tally = sum(issues.values())
|
|
|
|
if tally > 0:
|
|
# find the longest source filename
|
|
longest_name = max(len(sourcefile) for sourcefile in issues.keys())
|
|
# Print the source filenames and their issue counts
|
|
print("Sorted by issue count:\n")
|
|
|
|
for sourcefile in sorted(issues, key=issues.get, reverse=True):
|
|
print(f' {sourcefile:{longest_name}} : {issues[sourcefile]}')
|
|
|
|
# Print the tally against the desired maximum
|
|
if len(sys.argv) == 3:
|
|
max_issues = int(sys.argv[2])
|
|
print(f'\nTotal: {tally} issues (out of {max_issues} allowed)')
|
|
if tally > max_issues:
|
|
rcode = 1
|
|
else:
|
|
print(f'\nTotal: {tally} issues')
|
|
|
|
return rcode
|
|
|
|
if __name__ == "__main__":
|
|
sys.exit(main(sys.argv))
|