dosbox-staging/scripts/count-pvs-bugs.py
Patryk Obara 0a36c37328 Adjust copyright statements for 2021
- 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.
2021-01-01 00:12:05 +01:00

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))