public VerificationResult VerifyProjects(string pathToConfigFile, string[] projectFilePaths, Action <List <string>, List <ValidationResult> > dumpResultsAction) { const string SuiteName = "SolutionCop"; var errors = new List <string>(); var validationResults = new List <ValidationResult>(); var rules = _rulesDirectoryCatalog.LoadRules(); var ruleConfigsMap = _configurationFileParser.ParseConfigFile(pathToConfigFile, rules, errors); _logger.LogInfo("Starting analysis..."); _buildServerReporter.TestSuiteStarted(SuiteName); foreach (var rule in rules) { var xmlRuleConfigs = ruleConfigsMap[rule.Id]; var testName = string.Concat(SuiteName, ".", rule.Id); if (xmlRuleConfigs == null) { var error = $"Configuration section is not found for rule {rule.Id}"; errors.Add(error); _buildServerReporter.TestStarted(testName); _buildServerReporter.TestFailed(testName, error, error); _buildServerReporter.TestFinished(testName); continue; } _logger.LogInfo("Analyzing projects using rule {0}", rule.Id); var validationResult = rule.ValidateAllProjects(xmlRuleConfigs, projectFilePaths); if (validationResult.IsEnabled) { _buildServerReporter.TestStarted(testName); if (validationResult.Errors.Any()) { _buildServerReporter.TestFailed(testName, $"Validation failed for rule {rule.Id}", string.Join("\n", validationResult.Errors)); } _buildServerReporter.TestFinished(testName); } else { _buildServerReporter.TestIgnored(testName); } errors.AddRange(validationResult.Errors); validationResults.Add(validationResult); } _buildServerReporter.TestSuiteFinished(SuiteName); _logger.LogInfo("Analysis finished!"); dumpResultsAction(errors, validationResults); return(errors.Any() ? VerificationResult.ErrorsFound : VerificationResult.NoErrors); }
public IProjectRule[] LoadRules() { _logger.LogInfo("Scanning for rules..."); var catalog = new AggregateCatalog(); catalog.Catalogs.Add(new DirectoryCatalog(Path.GetDirectoryName(typeof(RulesDirectoryCatalog).Assembly.Location))); var container = new CompositionContainer(catalog); var rules = container.GetExports <IProjectRule>().Select(x => x.Value).ToArray(); foreach (var rule in rules) { _logger.LogInfo("Rule {0} found.", rule.Id); } _logger.LogInfo("Scanning for rules finished! Rules found: {0}", rules.Count()); return(rules.ToArray()); }
public Dictionary <string, XElement> ParseConfigFile(string pathToConfigFile, IEnumerable <IProjectRule> rules, List <string> errors) { if (File.Exists(pathToConfigFile)) { _logger.LogInfo("Existing config file found: {0}", pathToConfigFile); return(ParseConfigString(pathToConfigFile, File.ReadAllText(pathToConfigFile), rules, errors, true)); } else { _logger.LogWarning("Config file does not exist. Creating a new one {0}", pathToConfigFile); return(ParseConfigString(pathToConfigFile, "<Rules></Rules>", rules, errors, true)); } }
public static SolutionInfo LoadFromFile(ISolutionCopConsole console, string pathToSolutionFile) { if (!new FileInfo(pathToSolutionFile).Exists) { console.LogError("Cannot find solution file {0}", pathToSolutionFile); return(new SolutionInfo()); } console.LogInfo("Parsing solution {0}", pathToSolutionFile); var solutionFileLines = File.ReadAllLines(pathToSolutionFile).ToArray(); var projectReferenceRegEx = new Regex("Project\\(\"([\\{\\}0-9A-Z\\-]+)\"\\) = \"(.*)\", \"(.*.csproj)\", \"([\\{\\}0-9A-Z\\-]+)\"\\s*"); var projectRelativePaths = solutionFileLines.Select(line => projectReferenceRegEx.Match(line)).Where(x => x.Success).Select(x => x.Groups[3].ToString()); var projectPaths = projectRelativePaths.Select(x => Path.Combine(Path.GetDirectoryName(pathToSolutionFile), x)); return(new SolutionInfo(projectPaths.ToArray())); }