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