#!/usr/bin/env python

"""
Static Analyzer qualification infrastructure: adding a new project to 
the Repository Directory.

 Add a new project for testing: build it and add to the Project Map file.
   Assumes it's being run from the Repository Directory.
   The project directory should be added inside the Repository Directory and 
   have the same name as the project ID
   
 The project should use the following files for set up:
      - pre_run_static_analyzer.sh - prepare the build environment.
                                     Ex: make clean can be a part of it.
      - run_static_analyzer.cmd - a list of commands to run through scan-build.
                                     Each command should be on a separate line.
                                     Choose from: configure, make, xcodebuild 
"""
import SATestBuild

import os
import csv
import sys

def isExistingProject(PMapFile, projectID) :
    PMapReader = csv.reader(PMapFile)
    for I in PMapReader:
        if projectID == I[0]:
            return True
    return False    

# Add a new project for testing: build it and add to the Project Map file.
# Params:
#   Dir is the directory where the sources are.
#   ID is a short string used to identify a project.
def addNewProject(ID, IsScanBuild) :
    CurDir = os.path.abspath(os.curdir)
    Dir = SATestBuild.getProjectDir(ID)
    if not os.path.exists(Dir):
        print "Error: Project directory is missing: %s" % Dir
        sys.exit(-1)
        
    # Build the project.
    SATestBuild.testProject(ID, True, IsScanBuild, Dir)

    # Add the project ID to the project map.
    ProjectMapPath = os.path.join(CurDir, SATestBuild.ProjectMapFile)
    if os.path.exists(ProjectMapPath):
        PMapFile = open(ProjectMapPath, "r+b")
    else:
        print "Warning: Creating the Project Map file!!"
        PMapFile = open(ProjectMapPath, "w+b")
    try:
        if (isExistingProject(PMapFile, ID)) :        
            print >> sys.stdout, 'Warning: Project with ID \'', ID, \
                                 '\' already exists.'
            print >> sys.stdout, "Reference output has been regenerated."
        else:                     
            PMapWriter = csv.writer(PMapFile)
            PMapWriter.writerow( (ID, int(IsScanBuild)) );
            print "The project map is updated: ", ProjectMapPath
    finally:
        PMapFile.close()
            

# TODO: Add an option not to build. 
# TODO: Set the path to the Repository directory.
if __name__ == '__main__':
    if len(sys.argv) < 2:
        print >> sys.stderr, 'Usage: ', sys.argv[0],\
                             'project_ID <mode>' \
                             'mode - 0 for single file project; 1 for scan_build'
        sys.exit(-1)
    
    IsScanBuild = 1    
    if (len(sys.argv) >= 3):
        IsScanBuild = int(sys.argv[2])  
    assert((IsScanBuild == 0) | (IsScanBuild == 1))
        
    addNewProject(sys.argv[1], IsScanBuild)
