static int Main()

in StaticModuleVerifier/Program.cs [207:427]


        static int Main(string[] args)
        {
            Utility.SetSmvVar("workingDir", Directory.GetCurrentDirectory());
            Utility.SetSmvVar("logFilePath", null);
            Utility.SetSmvVar("assemblyDir", Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location));
            Utility.SetSmvVar("configFilePath", Path.Combine(Utility.GetSmvVar("workingDir"), configXmlFileName));
            Utility.SetSmvVar("smvLogFileNamePrefix", buildLogFileNamePrefix);
            try
            {
                Console.BufferHeight = Int16.MaxValue - 1;
            }
            catch (Exception)
            {

            }
            // Process commandline arguments.
            // Note that ProcessArgs will return false if execution should not continue. 
            // This happens in cases such as /help, /getAvailableModules, /searchmodules
            if (!ProcessArgs(args))
            {
                return -1;
            }
            if (useDb)
            {
                try
                {
                    using (var database = new SmvDbEntities())
                    {
                        SmvDb.Task task = database.Tasks.Where((x) => x.TaskID == Utility.taskId).FirstOrDefault();
                        if (task != null)
                        {
                            string argsString = string.Join(" ", args);
                            task.Arguments = argsString;

                            database.SaveChanges();
                        }
                    }
                }
                catch (Exception e)
                {
                    Log.LogFatalError("Exception while updating database " + e);
                }
            }
            // Get the SMV version name.
            string smvVersionTxtPath = Path.Combine(Utility.GetSmvVar("assemblyDir"), "SmvVersionName.txt");
            if (!File.Exists(smvVersionTxtPath))
            {
                Log.LogFatalError("SmvVersionName.txt must exist in the SMV bin directory.");
            }
            string[] lines = File.ReadAllLines(smvVersionTxtPath);
            if (lines.Length < 1)
            {
                Log.LogFatalError("SmvVersionName.txt is empty.");
            }
            Utility.version = lines[0];

            // Consume specified configuration file
            smvConfig = Utility.GetSMVConfig();
            if (smvConfig == null)
            {
                Log.LogFatalError("Could not load Config file");
            }

            // Set the variables defined in the Variables node in the config file
            LoadGlobalVariables(smvConfig.Variables);

            // Project file value from command line overrides the Config value
            if (!String.IsNullOrEmpty(Utility.GetSmvVar("projectFileArg")))
            {
                Utility.SetSmvVar("projectFile", Utility.GetSmvVar("projectFileArg"));
            }

            bool buildResult = false;
            bool analysisResult = false;
            double buildTime = 0, analysisTime = 0;
            int localThreadCount = Environment.ProcessorCount;

            if (Utility.GetSmvVar("localThreads") != null)
            {
                localThreadCount = int.Parse(Utility.GetSmvVar("localThreads"));
            }
            Log.LogInfo(String.Format("Running local scheduler with {0} threads", localThreadCount));

            // Load the cloud config from an XML file.

            SMVCloudConfig cloudConfig = null;

            // Set up the schedulers.
            Utility.scheduler = new MasterSMVActionScheduler();
            LocalSMVActionScheduler localScheduler = new LocalSMVActionScheduler(localThreadCount);
            CloudSMVActionScheduler cloudScheduler = null;
            if (cloud)
            {
                cloudConfig = Utility.GetSMVCloudConfig();
                cloudScheduler = new CloudSMVActionScheduler(cloudConfig);
            }
            Utility.scheduler.AddScheduler("local", localScheduler);
            Utility.scheduler.AddScheduler("cloud", cloudScheduler);
            // Do build if specified in the configuration file
            if (smvConfig.Build != null)
            {
                Stopwatch sw = Stopwatch.StartNew();

                // Populate the actions dictionary that will be used by the schedulers.
                Utility.PopulateActionsDictionary(smvConfig.Build);

                if (string.IsNullOrEmpty(Utility.GetSmvVar("projectFile")))
                {
                    Utility.scheduler.Dispose();
                    Log.LogFatalError("Project file not set");
                }

                List<SMVActionResult> buildActionsResult = Utility.ExecuteActions(Utility.GetRootActions(smvConfig.Build));
                buildResult = Utility.IsExecuteActionsSuccessful(buildActionsResult);
                if (Utility.plugin != null && buildResult == false)
                {
                    Utility.plugin.Finally(true);
                }

                if (Utility.plugin != null)
                {
                    Utility.plugin.PostBuild(smvConfig.Build);
                }
                sw.Stop();
                buildTime = sw.Elapsed.TotalSeconds;
            }

            // If build succeeded or it was not specified, do analysis (if specified and called)
            if (smvConfig.Build == null || buildResult)
            {
                if (smvConfig.Analysis != null)
                {
                    if (doAnalysis)
                    {
                        Stopwatch sw = Stopwatch.StartNew();
                        Utility.PopulateActionsDictionary(smvConfig.Analysis);

                        if (Utility.plugin != null)
                        {
                            Log.LogInfo("Using plugin " + Utility.plugin + " for analysis.");
                            analysisResult = Utility.plugin.DoPluginAnalysis(smvConfig.Analysis);

                            Utility.plugin.PostAnalysis(smvConfig.Analysis);
                        }
                        else
                        {
                            List<SMVActionResult> analysisActionsResult = Utility.ExecuteActions(Utility.GetRootActions(smvConfig.Analysis));
                            analysisResult = Utility.IsExecuteActionsSuccessful(analysisActionsResult);
                        }

                        if (!analysisResult)
                        {
                            Utility.scheduler.Dispose();
                            Utility.plugin.Finally(true);
                            Log.LogFatalError("Analysis failed.");
                        }

                        sw.Stop();
                        analysisTime = sw.Elapsed.TotalSeconds;
                    }
                }
                Utility.plugin.Finally(false);
            }
            else
            {
                Utility.plugin.Finally(true);
                Utility.scheduler.Dispose();
                Log.LogFatalError("Build failed, skipping Analysis.");
            }

            Utility.PrintResult(Utility.result, (int)buildTime, (int)analysisTime, true);

            Log.LogInfo(String.Format("Total time taken {0} seconds", (int)(buildTime + analysisTime)));

            if (Utility.plugin != null)
            {
                int bugCount = Utility.plugin.GenerateBugsCount();
                Log.LogInfo("Found " + bugCount + " bugs!");
                if (useDb)
                {
                    try
                    {
                        using (var database = new SmvDbEntities())
                        {
                            SmvDb.Task task = database.Tasks.Where((x) => x.TaskID == Utility.taskId).FirstOrDefault();
                            if (task != null)
                            {
                                string bugCountString = bugCount.ToString();
                                task.Bugs = bugCountString;
                                database.SaveChanges();
                            }
                        }
                    }
                    catch (Exception e)
                    {
                        Utility.scheduler.Dispose();
                        Log.LogFatalError("Exception while updating database " + e);
                        return -1;
                    }
                }
            }
            localScheduler.Dispose();
            if (cloud) cloudScheduler.Dispose();

            if (makeDefectsPortable)
            {
                foreach (string bugDirectory in Directory.EnumerateDirectories(Path.Combine(Utility.smvVars["smvOutputDir"], "Bugs")))
                {
                    try
                    {
                        Utility.makeDefectPortable(bugDirectory);
                    }
                    catch (Exception e)
                    {
                        Log.LogFatalError("Exception occurred when making defect portable." + e.ToString());
                    }
                }
                Log.LogInfo("Defects, if any, made portable successfully");
            }
            return Convert.ToInt32(Utility.scheduler.errorsEncountered);
        }