Author: zotnhucucbot Date: 2025-01-15T07:59:03+08:00 New Revision: bc74625f50e216edd16f436c4fc81ff585b6c4c7
URL: https://github.com/llvm/llvm-project/commit/bc74625f50e216edd16f436c4fc81ff585b6c4c7 DIFF: https://github.com/llvm/llvm-project/commit/bc74625f50e216edd16f436c4fc81ff585b6c4c7.diff LOG: [clang-tidy] Add an option to exclude files not present in the compile database (#120348) A change list may include files that are not part of the compile database, which can cause clang-tidy to fail (e.g., due to missing included headers). To prevent false negatives, we should allow to skip processing these files. Added: Modified: clang-tools-extra/clang-tidy/tool/clang-tidy-diff.py clang-tools-extra/docs/ReleaseNotes.rst Removed: ################################################################################ diff --git a/clang-tools-extra/clang-tidy/tool/clang-tidy- diff .py b/clang-tools-extra/clang-tidy/tool/clang-tidy- diff .py index 62cb4297c50f75..33de2077dfb1af 100755 --- a/clang-tools-extra/clang-tidy/tool/clang-tidy- diff .py +++ b/clang-tools-extra/clang-tidy/tool/clang-tidy- diff .py @@ -35,6 +35,7 @@ import tempfile import threading import traceback +from pathlib import Path try: import yaml @@ -124,6 +125,23 @@ def merge_replacement_files(tmpdir, mergefile): open(mergefile, "w").close() +def get_compiling_files(args): + """Read a compile_commands.json database and return a set of file paths""" + current_dir = Path.cwd() + compile_commands_json = ( + (current_dir / args.build_path) if args.build_path else current_dir + ) + compile_commands_json = compile_commands_json / "compile_commands.json" + files = set() + with open(compile_commands_json) as db_file: + db_json = json.load(db_file) + for entry in db_json: + if "file" not in entry: + continue + files.add(Path(entry["file"])) + return files + + def main(): parser = argparse.ArgumentParser( description="Run clang-tidy against changed files, and " @@ -234,6 +252,13 @@ def main(): action="store_true", help="Allow empty enabled checks.", ) + parser.add_argument( + "-only-check-in-db", + dest="skip_non_compiling", + default=False, + action="store_true", + help="Only check files in the compilation database", + ) clang_tidy_args = [] argv = sys.argv[1:] @@ -243,11 +268,13 @@ def main(): args = parser.parse_args(argv) + compiling_files = get_compiling_files(args) if args.skip_non_compiling else None + # Extract changed lines for each file. filename = None lines_by_file = {} for line in sys.stdin: - match = re.search('^\\+\\+\\+\\ "?(.*?/){%s}([^ \t\n"]*)' % args.p, line) + match = re.search(r'^\+\+\+\ "?(.*?/){%s}([^ \t\n"]*)' % args.p, line) if match: filename = match.group(2) if filename is None: @@ -260,6 +287,13 @@ def main(): if not re.match("^%s$" % args.iregex, filename, re.IGNORECASE): continue + # Skip any files not in the compiling list + if ( + compiling_files is not None + and (Path.cwd() / filename) not in compiling_files + ): + continue + match = re.search(r"^@@.*\+(\d+)(,(\d+))?", line) if match: start_line = int(match.group(1)) diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst index 6350022ed9a8d3..8ba47dfc84f26f 100644 --- a/clang-tools-extra/docs/ReleaseNotes.rst +++ b/clang-tools-extra/docs/ReleaseNotes.rst @@ -108,6 +108,10 @@ Improvements to clang-query Improvements to clang-tidy -------------------------- +- Improved :program:`clang-tidy- diff .py` script. Add the `-only-check-in-db` + option to exclude files not present in the compilation database, avoiding + false-negative results. + - Improved :program:`run-clang-tidy.py` script. Fixed minor shutdown noise happening on certain platforms when interrupting the script. _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits