xref: /llvm-project/clang/utils/analyzer/SATestUpdateDiffs.py (revision dd3c26a045c081620375a878159f536758baba6e)
1aff33385SGeorge Karpenkov#!/usr/bin/env python
2aff33385SGeorge Karpenkov
3aff33385SGeorge Karpenkov"""
4aff33385SGeorge KarpenkovUpdate reference results for static analyzer.
5aff33385SGeorge Karpenkov"""
6439a95bdSGeorge Karpenkovimport SATestBuild
7fb4b5652SValeriy Savchenkofrom ProjectMap import ProjectInfo, ProjectMap
8439a95bdSGeorge Karpenkov
9aff33385SGeorge Karpenkovimport os
105a9aff12SValeriy Savchenkoimport shutil
11aff33385SGeorge Karpenkovimport sys
12aff33385SGeorge Karpenkov
135a9aff12SValeriy Savchenkofrom subprocess import check_call
145a9aff12SValeriy Savchenko
151f5fe113SGeorge KarpenkovVerbose = 0
16a8076609SGeorge Karpenkov
17a8076609SGeorge Karpenkov
1810851f9dSValeriy Savchenkodef update_reference_results(project: ProjectInfo, git: bool = False):
19fb4b5652SValeriy Savchenko    test_info = SATestBuild.TestInfo(project)
20fb4b5652SValeriy Savchenko    tester = SATestBuild.ProjectTester(test_info)
215a9aff12SValeriy Savchenko    project_dir = tester.get_project_dir()
22aff33385SGeorge Karpenkov
235a9aff12SValeriy Savchenko    tester.is_reference_build = True
245b4f1435SValeriy Savchenko    ref_results_path = tester.get_output_dir()
25a8076609SGeorge Karpenkov
265a9aff12SValeriy Savchenko    tester.is_reference_build = False
275b4f1435SValeriy Savchenko    created_results_path = tester.get_output_dir()
28aff33385SGeorge Karpenkov
295a9aff12SValeriy Savchenko    if not os.path.exists(created_results_path):
30*dd3c26a0STobias Hieta        print(
31*dd3c26a0STobias Hieta            f"Skipping project '{project.name}', " f"it doesn't have newer results.",
32*dd3c26a0STobias Hieta            file=sys.stderr,
33*dd3c26a0STobias Hieta        )
3410851f9dSValeriy Savchenko        return
35aff33385SGeorge Karpenkov
365a9aff12SValeriy Savchenko    build_log_path = SATestBuild.get_build_log_path(ref_results_path)
375a9aff12SValeriy Savchenko    build_log_dir = os.path.dirname(os.path.abspath(build_log_path))
385a9aff12SValeriy Savchenko
395a9aff12SValeriy Savchenko    os.makedirs(build_log_dir)
405a9aff12SValeriy Savchenko
415a9aff12SValeriy Savchenko    with open(build_log_path, "w+") as build_log_file:
42*dd3c26a0STobias Hieta
435a9aff12SValeriy Savchenko        def run_cmd(command: str):
445a9aff12SValeriy Savchenko            if Verbose:
455a9aff12SValeriy Savchenko                print(f"Executing {command}")
465a9aff12SValeriy Savchenko            check_call(command, shell=True, stdout=build_log_file)
475a9aff12SValeriy Savchenko
489944babbSGeorge Karpenkov        # Remove reference results: in git, and then again for a good measure
499944babbSGeorge Karpenkov        # with rm, as git might not remove things fully if there are empty
509944babbSGeorge Karpenkov        # directories involved.
5110851f9dSValeriy Savchenko        if git:
525a9aff12SValeriy Savchenko            run_cmd(f"git rm -r -q '{ref_results_path}'")
535a9aff12SValeriy Savchenko        shutil.rmtree(ref_results_path)
54aff33385SGeorge Karpenkov
55aff33385SGeorge Karpenkov        # Replace reference results with a freshly computed once.
565a9aff12SValeriy Savchenko        shutil.copytree(created_results_path, ref_results_path, symlinks=True)
57aff33385SGeorge Karpenkov
58aff33385SGeorge Karpenkov        # Run cleanup script.
595a9aff12SValeriy Savchenko        SATestBuild.run_cleanup_script(project_dir, build_log_file)
60aff33385SGeorge Karpenkov
614902ca6dSValeriy Savchenko        SATestBuild.normalize_reference_results(
62*dd3c26a0STobias Hieta            project_dir, ref_results_path, project.mode
63*dd3c26a0STobias Hieta        )
64aff33385SGeorge Karpenkov
65aff33385SGeorge Karpenkov        # Clean up the generated difference results.
665a9aff12SValeriy Savchenko        SATestBuild.cleanup_reference_results(ref_results_path)
67aff33385SGeorge Karpenkov
6810851f9dSValeriy Savchenko        if git:
695a9aff12SValeriy Savchenko            run_cmd(f"git add '{ref_results_path}'")
70aff33385SGeorge Karpenkov
71a8076609SGeorge Karpenkov
7210851f9dSValeriy Savchenkoif __name__ == "__main__":
7310851f9dSValeriy Savchenko    print("SATestUpdateDiffs.py should not be used on its own.")
7410851f9dSValeriy Savchenko    print("Please use 'SATest.py update' instead")
7565839bd4SGeorge Karpenkov    sys.exit(1)
76