#!/usr/bin/env python """ Update reference results for static analyzer. """ import SATestBuild from subprocess import check_call import os import sys Verbose = 1 def runCmd(Command, **kwargs): if Verbose: print "Executing %s" % Command check_call(Command, shell=True, **kwargs) def updateReferenceResults(ProjName, ProjBuildMode): ProjDir = SATestBuild.getProjectDir(ProjName) RefResultsPath = os.path.join( ProjDir, SATestBuild.getSBOutputDirName(IsReferenceBuild=True)) CreatedResultsPath = os.path.join( ProjDir, SATestBuild.getSBOutputDirName(IsReferenceBuild=False)) if not os.path.exists(CreatedResultsPath): print >> sys.stderr, "New results not found, was SATestBuild.py "\ "previously run?" sys.exit(1) BuildLogPath = SATestBuild.getBuildLogPath(RefResultsPath) Dirname = os.path.dirname(os.path.abspath(BuildLogPath)) runCmd("mkdir -p '%s'" % Dirname) with open(BuildLogPath, "wb+") as PBuildLogFile: # Remove reference results: in git, and then again for a good measure # with rm, as git might not remove things fully if there are empty # directories involved. runCmd('git rm -r -q "%s"' % (RefResultsPath,), stdout=PBuildLogFile) runCmd('rm -rf "%s"' % (RefResultsPath,), stdout=PBuildLogFile) # Replace reference results with a freshly computed once. runCmd('cp -r "%s" "%s"' % (CreatedResultsPath, RefResultsPath,), stdout=PBuildLogFile) # Run cleanup script. SATestBuild.runCleanupScript(ProjDir, PBuildLogFile) SATestBuild.normalizeReferenceResults( ProjDir, RefResultsPath, ProjBuildMode) # Clean up the generated difference results. SATestBuild.cleanupReferenceResults(RefResultsPath) runCmd('git add "%s"' % (RefResultsPath,), stdout=PBuildLogFile) def main(argv): if len(argv) == 2 and argv[1] in ('-h', '--help'): print >> sys.stderr, "Update static analyzer reference results based "\ "\non the previous run of SATestBuild.py.\n"\ "\nN.B.: Assumes that SATestBuild.py was just run" sys.exit(1) with SATestBuild.projectFileHandler() as f: for (ProjName, ProjBuildMode) in SATestBuild.iterateOverProjects(f): updateReferenceResults(ProjName, int(ProjBuildMode)) if __name__ == '__main__': main(sys.argv)