Example #1
0
        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);
        }
Example #2
0
        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));
     }
 }
Example #4
0
        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()));
        }