From c97203dd624aafeda2359d31d020af80033708d6 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Fri, 3 Jul 2020 17:44:52 +0200 Subject: ci: Change structure in problemmatcher.py again While trying to simplify the data structure, we didn't consider a case where we want to register multiple matchers with the same severity... Let's simplify things a bit, by having a list of matchers in the data. Also attempt to pass that list to GitHub, because they support doing so, in theory... --- scripts/dev/ci/problemmatchers.py | 200 +++++++++++++++++++------------------- 1 file changed, 100 insertions(+), 100 deletions(-) diff --git a/scripts/dev/ci/problemmatchers.py b/scripts/dev/ci/problemmatchers.py index 48173c4ce..13f960c31 100644 --- a/scripts/dev/ci/problemmatchers.py +++ b/scripts/dev/ci/problemmatchers.py @@ -34,111 +34,118 @@ import json MATCHERS = { # scripts/dev/ci/run.sh:41:39: error: Double quote array expansions to # avoid re-splitting elements. [SC2068] - "shellcheck": { - "pattern": [ - { - "regexp": r"^(.+):(\d+):(\d+):\s(note|warning|error):\s(.*)\s\[(SC\d+)\]$", - "file": 1, - "line": 2, - "column": 3, - "severity": 4, - "message": 5, - "code": 6, - }, - ], - }, + "shellcheck": [ + { + "pattern": [ + { + "regexp": r"^(.+):(\d+):(\d+):\s(note|warning|error):\s(.*)\s\[(SC\d+)\]$", + "file": 1, + "line": 2, + "column": 3, + "severity": 4, + "message": 5, + "code": 6, + }, + ], + }, + ], # filename.py:313: unused function 'i_am_never_used' (60% confidence) - "vulture": { - "severity": "warning", - "pattern": [ - { - "regexp": r"^([^:]+):(\d+): ([^(]+ \(\d+% confidence\))$", - "file": 1, - "line": 2, - "message": 3, - } - ] - }, + "vulture": [ + { + "severity": "warning", + "pattern": [ + { + "regexp": r"^([^:]+):(\d+): ([^(]+ \(\d+% confidence\))$", + "file": 1, + "line": 2, + "message": 3, + } + ] + }, + ], # filename.py:1:1: D100 Missing docstring in public module - "flake8": { - # "undefined name" is FXXX (i.e. not an error), but e.g. multiple - # spaces before an operator is EXXX (i.e. an error) - that makes little - # sense, so let's just treat everything as a warning instead. - "pattern-warning": [ - { - "regexp": r"^([^:]+):(\d+):(\d+): ([A-Z]\d{3}) (.*)$", - "file": 1, - "line": 2, - "column": 3, - "code": 4, - "message": 5, - }, - ], - }, + "flake8": [ + { + # "undefined name" is FXXX (i.e. not an error), but e.g. multiple + # spaces before an operator is EXXX (i.e. an error) - that makes little + # sense, so let's just treat everything as a warning instead. + "severity": "warning", + "pattern": [ + { + "regexp": r"^([^:]+):(\d+):(\d+): ([A-Z]\d{3}) (.*)$", + "file": 1, + "line": 2, + "column": 3, + "code": 4, + "message": 5, + }, + ], + }, + ], # filename.py:80: error: Name 'foo' is not defined [name-defined] - "mypy": { - "pattern": [ - { - "regexp": r"^([^:]+):(\d+): ([^:]+): (.*) \[(.*)\]$", - "file": 1, - "line": 2, - "severity": 3, - "message": 4, - "code": 5, - }, - ], - }, + "mypy": [ + { + "pattern": [ + { + "regexp": r"^([^:]+):(\d+): ([^:]+): (.*) \[(.*)\]$", + "file": 1, + "line": 2, + "severity": 3, + "message": 4, + "code": 5, + }, + ], + }, + ], # For some reason, ANSI color escape codes end up as part of the message # GitHub gets with colored pylint output - so we have those escape codes # (e.g. "\033[35m...\033[0m") as part of the regex patterns... - "pylint": { - # filename.py:80:10: E0602: Undefined variable 'foo' (undefined-variable) - "pattern-error": [ - { - "regexp": r"^([^:]+):(\d+):(\d+): (E\d+): \033\[[\d;]+m([^\033]+).*$", - "file": 1, - "line": 2, - "column": 3, - "code": 4, - "message": 5, - }, - ], - - # filename.py:78:14: W0613: Unused argument 'unused' (unused-argument) - "pattern-warning": [ - { - "regexp": r"^([^:]+):(\d+):(\d+): ([A-DF-Z]\d+): \033\[[\d;]+m([^\033]+).*$", - "file": 1, - "line": 2, - "column": 3, - "code": 4, - "message": 5, - }, - ], - }, + "pylint": [ + { + # filename.py:80:10: E0602: Undefined variable 'foo' (undefined-variable) + "severity": "error", + "pattern": [ + { + "regexp": r"^([^:]+):(\d+):(\d+): (E\d+): \033\[[\d;]+m([^\033]+).*$", + "file": 1, + "line": 2, + "column": 3, + "code": 4, + "message": 5, + }, + ], + }, + { + # filename.py:78:14: W0613: Unused argument 'unused' (unused-argument) + "severity": "warning", + "pattern": [ + { + "regexp": r"^([^:]+):(\d+):(\d+): ([A-DF-Z]\d+): \033\[[\d;]+m([^\033]+).*$", + "file": 1, + "line": 2, + "column": 3, + "code": 4, + "message": 5, + }, + ], + }, + ], } -def add_matcher(output_dir, testenv, pattern, severity=None): - owner = (testenv if severity is None - else '{}-{}'.format(testenv, severity)) +def add_matcher(output_dir, testenv, data): - output = { - 'owner': owner, - 'pattern': pattern, - } - if severity is not None: - output['severity'] = severity + for idx, sub_data in enumerate(data): + sub_data['owner'] = '{}-{}'.format(testenv, idx) + out_data = {'problemMatcher': data} - data = {'problemMatcher': [output]} - - output_file = output_dir / '{}.json'.format(owner) + output_file = output_dir / '{}.json'.format(testenv) with output_file.open('w', encoding='utf-8') as f: - json.dump(data, f) + json.dump(out_data, f) print("::add-matcher::{}".format(output_file)) @@ -146,23 +153,16 @@ def add_matcher(output_dir, testenv, pattern, severity=None): def main(): testenv = sys.argv[1] if testenv not in MATCHERS: - return 0 + return # We're not deleting the temporary file because this is only running on CI # anyways, and we're not sure if GitHub has already read the file contents # at the point this script exits. output_dir = pathlib.Path(tempfile.mkdtemp(suffix='-ghmatchers')) - matcher_data = MATCHERS[testenv] - - for key, severity in [('pattern', None), - ('pattern-warning', 'warning'), - ('pattern-error', 'error')]: - if key in matcher_data: - add_matcher(output_dir=output_dir, - testenv=testenv, - pattern=matcher_data[key], - severity=severity) + add_matcher(output_dir=output_dir, + testenv=testenv, + data=MATCHERS[testenv]) if __name__ == '__main__': -- cgit v1.2.3-54-g00ecf