private static void StartAnalysis() { IEnumerable<string> appsToAnalyze; if (bool.Parse(ConfigurationManager.AppSettings["OnlyAnalyzeSubsetApps"])) { appsToAnalyze = File.ReadAllLines(SubsetApps).Select(appName => CodeCorpusPath + appName); } else { appsToAnalyze = Directory.GetDirectories(CodeCorpusPath) .Where(a => a.Split('\\').Last() == "src"); } using (var context = new CodeAnalysisResults()) { foreach (var appPath in appsToAnalyze) { string appName = appPath.Split('\\').Last(); var app = context.AppResults.Include(a => a.Projects) .SingleOrDefault(a => a.Name == appName); if (app == null) { app = new App() { Name = appName, Path = appPath, Projects = new List<Project>(), CompletedAnalyses = AnalysisType.None }; context.AppResults.Add(app); } var unCompleted = AnalysisTypes.Where(a => (app.CompletedAnalyses & a) != a).ToList(); if (unCompleted.Any()) { Logs.Console.Info("Analyzing {0}", appPath); AnalyzeApp(context, app, unCompleted); } else { Logs.Console.Info("Already Analyzed {0}", appPath); } context.SaveChanges(); } } }
private static void AnalyzeApp(CodeAnalysisResults context, App app, List<AnalysisType> analyses) { var projectPaths = from f in Directory.GetFiles(app.Path, "*.csproj", SearchOption.AllDirectories) let directoryName = Path.GetDirectoryName(f) where !directoryName.Contains(@"\tags") && !directoryName.Contains(@"\branches") select f; foreach (var projectPath in projectPaths) { string[] separator = new string[] { ".csproj" }; string name = projectPath.Split('\\').Last().Split(separator, StringSplitOptions.None).First(); Project project = app.Projects.SingleOrDefault(a => a.Path == projectPath); if (project == null) { project = new Project() { Name = projectPath.Split('\\').Last().Split(separator, StringSplitOptions.None).First(), Path = projectPath, AnalysisResults = new List<AnalysisResult>() }; app.Projects.Add(project); } else { context.Entry(project).Collection(a => a.AnalysisResults).Load(); } AnalyzeProject(project, analyses); } foreach (var analysisType in analyses) { app.CompletedAnalyses |= analysisType; } }