diff --git a/clang/utils/analyzer/SATestAdd.py b/clang/utils/analyzer/SATestAdd.py --- a/clang/utils/analyzer/SATestAdd.py +++ b/clang/utils/analyzer/SATestAdd.py @@ -45,18 +45,18 @@ import SATestBuild from ProjectMap import ProjectMap, ProjectInfo +import argparse import os import sys -def add_new_project(name: str, build_mode: int): +def add_new_project(project: ProjectInfo): """ Add a new project for testing: build it and add to the Project Map file. :param name: is a short string used to identify a project. """ - project_info = ProjectInfo(name, build_mode) - test_info = SATestBuild.TestInfo(project_info, + test_info = SATestBuild.TestInfo(project, is_reference_build=True) tester = SATestBuild.ProjectTester(test_info) @@ -71,37 +71,55 @@ # Add the project name to the project map. project_map = ProjectMap(should_exist=False) - if is_existing_project(project_map, name): - print(f"Warning: Project with name '{name}' already exists.", + if is_existing_project(project_map, project): + print(f"Warning: Project with name '{project.name}' already exists.", file=sys.stdout) print("Reference output has been regenerated.", file=sys.stdout) else: - project_map.projects.append(project_info) + project_map.projects.append(project) project_map.save() -def is_existing_project(project_map: ProjectMap, project_name: str) -> bool: - return any(existing_project.name == project_name +def is_existing_project(project_map: ProjectMap, project: ProjectInfo) -> bool: + return any(existing_project.name == project.name for existing_project in project_map.projects) -# TODO: Use argparse # TODO: Add an option not to build. # TODO: Set the path to the Repository directory. if __name__ == "__main__": - if len(sys.argv) < 2 or sys.argv[1] in ("-h", "--help"): - print("Add a new project for testing to the analyzer" - "\nUsage: ", sys.argv[0], - "project_ID \n" - "mode: 0 for single file project, " - "1 for scan_build, " - "2 for single file c++11 project", file=sys.stderr) - sys.exit(-1) - - build_mode = 1 - if len(sys.argv) >= 3: - build_mode = int(sys.argv[2]) - - assert((build_mode == 0) | (build_mode == 1) | (build_mode == 2)) - - add_new_project(sys.argv[1], build_mode) + parser = argparse.ArgumentParser() + + parser.add_argument("name", nargs=1, help="Name of the new project") + parser.add_argument("--mode", action="store", default=1, type=int, + choices=[0, 1, 2], + help="Build mode: 0 for single file project, " + "1 for scan_build, " + "2 for single file c++11 project") + parser.add_argument("--source", action="store", default="script", + choices=["script", "git", "zip"], + help=f"Source type of the new project: " + f"'git' for getting from git " + f"(please provide --origin and --commit), " + f"'zip' for unpacking source from a zip file, " + f"'script' for downloading source by running " + f"a custom script {SATestBuild.DOWNLOAD_SCRIPT}") + parser.add_argument("--origin", action="store", default="", + help="Origin link for a git repository") + parser.add_argument("--commit", action="store", default="", + help="Git hash for a commit to checkout") + + args = parser.parse_args() + + if args.source == "git" and (args.origin == "" or args.commit == ""): + parser.error( + "Please provide both --origin and --commit if source is 'git'") + + if args.source != "git" and (args.origin != "" or args.commit != ""): + parser.error("Options --origin and --commit don't make sense when " + "source is not 'git'") + + project = ProjectInfo(args.name[0], args.mode, args.source, args.origin, + args.commit) + + add_new_project(project)