From a7879c2b67cff6340e46a68fdfa4f590c9352958 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tibor=20Cserv=C3=A1k?= Date: Tue, 5 Sep 2023 10:19:19 +0200 Subject: [PATCH] Parse file speed up The feature can be useful to speed up the parse process when you want to parse one or more specified files. The VSCode Plugin also runs the 'parse --file' command, so the correction can solve the slow file verification problem. It uses metadata.json for plist mapping if the result_source_files section is not empty and contains the pairing of source files and plist files. Before the new feature, the process read all existing plist files to find the specified source file's reports. --- analyzer/codechecker_analyzer/cmd/parse.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/analyzer/codechecker_analyzer/cmd/parse.py b/analyzer/codechecker_analyzer/cmd/parse.py index a4071b6c7c..3574e95f41 100644 --- a/analyzer/codechecker_analyzer/cmd/parse.py +++ b/analyzer/codechecker_analyzer/cmd/parse.py @@ -15,6 +15,7 @@ import os import sys from typing import Dict, Optional, Set +import fnmatch from codechecker_report_converter.util import dump_json_output from codechecker_report_converter.report import report_file, \ @@ -392,6 +393,22 @@ def get_output_file_path(default_file_name: str) -> Optional[str]: for dir_path, file_paths in report_file.analyzer_result_files(args.input): metadata = get_metadata(dir_path) + + if metadata and 'files' in args: + # Mapping plists when files are specified to speed up parsing + # The specifed_file_paths variable would be an empty list + # if metadata.json did not contain the specified file or + # metadata did not contain mapping between source files and plists. + specifed_file_paths = [ + key for key, val in + metadata['tools'][0]['result_source_files'].items() + if any(fnmatch.fnmatch(val, f) for f in args.files) + ] if 'tools' in metadata \ + and len(metadata['tools']) > 0 \ + and 'result_source_files' in metadata['tools'][0] \ + else [] + file_paths = specifed_file_paths or file_paths + for file_path in file_paths: reports = report_file.get_reports( file_path, context.checker_labels, file_cache)