public override IEnumerable <IIssue> ReadIssues(
     MsBuildIssuesProvider issueProvider,
     IRepositorySettings repositorySettings,
     MsBuildIssuesSettings issueProviderSettings)
 {
     throw new NotImplementedException();
 }
        public MsBuildIssuesProvider Create()
        {
            var provider = new MsBuildIssuesProvider(this.Log, this.MsBuildIssuesSettings);

            provider.Initialize(this.RepositorySettings);
            return(provider);
        }
Exemple #3
0
        public MsBuildIssuesProvider Create()
        {
            var provider = new MsBuildIssuesProvider(this.Log, this.Settings);

            provider.Initialize(this.PrcaSettings);
            return(provider);
        }
        /// <inheritdoc/>
        public override IEnumerable <IIssue> ReadIssues(
            MsBuildIssuesProvider issueProvider,
            IssueCommentFormat format,
            RepositorySettings repositorySettings,
            MsBuildIssuesSettings issueProviderSettings)
        {
#pragma warning disable SA1123 // Do not place regions within elements
            #region DupFinder Exclusion
#pragma warning restore SA1123 // Do not place regions within elements

            issueProvider.NotNull(nameof(issueProvider));
            repositorySettings.NotNull(nameof(repositorySettings));
            issueProviderSettings.NotNull(nameof(issueProviderSettings));

            #endregion

            var result = new List <IIssue>();

            var binLogReader = new BinLogReader();
            foreach (var record in binLogReader.ReadRecords(issueProviderSettings.LogFileContent))
            {
                var buildEventArgs = record.Args;

                if (buildEventArgs is BuildWarningEventArgs buildWarning)
                {
                    var projectFileRelativePath = this.GetProject(buildWarning, repositorySettings);

                    // Read affected file from the warning.
                    if (!this.TryGetFile(buildWarning, repositorySettings, out string fileName))
                    {
                        continue;
                    }

                    var line = GetLine(buildWarning);
                    var rule = buildWarning.Code;

                    // Determine rule URL.
                    Uri ruleUrl = null;
                    if (!string.IsNullOrWhiteSpace(rule))
                    {
                        ruleUrl = MsBuildRuleUrlResolver.Instance.ResolveRuleUrl(rule);
                    }

                    // Build issue.
                    result.Add(
                        IssueBuilder
                        .NewIssue(buildWarning.Message, issueProvider)
                        .WithPriority(IssuePriority.Warning)
                        .InProject(projectFileRelativePath, System.IO.Path.GetFileNameWithoutExtension(projectFileRelativePath))
                        .InFile(fileName, line)
                        .OfRule(rule, ruleUrl)
                        .Create());
                }
            }

            return(result);
        }
        /// <summary>
        /// Returns an issue for values from an MsBuild log.
        /// </summary>
        /// <param name="priority">Priority of the issue.</param>
        /// <param name="message">Raw value from the MsBuild log containing the message.</param>
        /// <param name="projectFile">Raw value from the MsBuild log containing the project file.</param>
        /// <param name="file">Raw value from the MsBuild log containing the file.</param>
        /// <param name="lineNumber">Raw value from the MsBuild log containing the line number.</param>
        /// <param name="endLineNumber">Raw value from the MsBuild log containing the end of the line range.</param>
        /// <param name="columnNumber">Raw value from the MsBuild log containing the column.</param>
        /// <param name="endColumnNumber">Raw value from the MsBuild log containing the end of the column range.</param>
        /// <param name="code">Raw value from the MsBuild log containing the rule.</param>
        /// <param name="issueProvider">Issue provider instance.</param>
        /// <param name="repositorySettings">Repository settings to use.</param>
        /// <returns>Issue instance or null, if the values could not be parsed.</returns>
        private IIssue GetIssue(
            IssuePriority priority,
            string message,
            string projectFile,
            string file,
            int lineNumber,
            int endLineNumber,
            int columnNumber,
            int endColumnNumber,
            string code,
            MsBuildIssuesProvider issueProvider,
            IRepositorySettings repositorySettings)
        {
            // Ignore warnings or errors without a message.
            if (string.IsNullOrWhiteSpace(message))
            {
                this.Log.Verbose("Skip element since it doesn't contain a message");
                return(null);
            }

            var projectFileRelativePath = this.GetProject(projectFile, repositorySettings);

            // Read affected file from the warning or error.
            var(result, fileName) = this.TryGetFile(file, projectFile, repositorySettings);
            if (!result)
            {
                this.Log.Information("Skip element since file path could not be parsed");
                return(null);
            }

            var line      = GetLine(lineNumber);
            var endLine   = GetLine(endLineNumber);
            var column    = GetColumn(columnNumber);
            var endColumn = GetColumn(endColumnNumber);
            var rule      = code;

            // Determine rule URL.
            Uri ruleUrl = null;

            if (!string.IsNullOrWhiteSpace(rule))
            {
                ruleUrl = MsBuildRuleUrlResolver.Instance.ResolveRuleUrl(rule);
            }

            // Build issue.
            return
                (IssueBuilder
                 .NewIssue(message, issueProvider)
                 .WithPriority(priority)
                 .InProject(projectFileRelativePath, System.IO.Path.GetFileNameWithoutExtension(projectFileRelativePath))
                 .InFile(fileName, line, endLine, column, endColumn)
                 .OfRule(rule, ruleUrl)
                 .Create());
        }
Exemple #6
0
 /// <summary>
 /// Returns an issue for a build warning.
 /// </summary>
 /// <param name="buildWarning">Warning for which the issue should be returned.</param>
 /// <param name="issueProvider">Issue provider instance.</param>
 /// <param name="repositorySettings">Repository settings to use.</param>
 /// <returns>Issue instance or null, if the <paramref name="buildWarning"/> could not be parsed.</returns>
 private IIssue GetIssue(
     BuildWarningEventArgs buildWarning,
     MsBuildIssuesProvider issueProvider,
     IRepositorySettings repositorySettings)
 {
     return
         (this.GetIssue(
              IssuePriority.Warning,
              buildWarning.Message,
              buildWarning.ProjectFile,
              buildWarning.File,
              buildWarning.LineNumber,
              buildWarning.EndLineNumber,
              buildWarning.ColumnNumber,
              buildWarning.EndColumnNumber,
              buildWarning.Code,
              issueProvider,
              repositorySettings));
 }
Exemple #7
0
        /// <inheritdoc/>
        public override IEnumerable <IIssue> ReadIssues(
            MsBuildIssuesProvider issueProvider,
            IRepositorySettings repositorySettings,
            MsBuildIssuesSettings issueProviderSettings)
        {
#pragma warning disable SA1123 // Do not place regions within elements
            #region DupFinder Exclusion
#pragma warning restore SA1123 // Do not place regions within elements

            issueProvider.NotNull(nameof(issueProvider));
            repositorySettings.NotNull(nameof(repositorySettings));
            issueProviderSettings.NotNull(nameof(issueProviderSettings));

            #endregion

            var result = new List <IIssue>();

            var binLogReader = new BinLogReader();
            foreach (var record in binLogReader.ReadRecords(issueProviderSettings.LogFileContent))
            {
                var buildEventArgs = record.Args;

                IIssue issue = null;
                if (buildEventArgs is BuildErrorEventArgs buildError)
                {
                    issue = this.GetIssue(buildError, issueProvider, repositorySettings);
                }
                else if (buildEventArgs is BuildWarningEventArgs buildWarning)
                {
                    issue = this.GetIssue(buildWarning, issueProvider, repositorySettings);
                }

                if (issue == null)
                {
                    continue;
                }

                result.Add(issue);
            }

            return(result);
        }
        /// <summary>
        /// Returns an issue for a build error.
        /// </summary>
        /// <param name="buildError">Error for which the issue should be returned.</param>
        /// <param name="issueProvider">Issue provider instance.</param>
        /// <param name="repositorySettings">Repository settings to use.</param>
        /// <returns>Issue instance or null, if the <paramref name="buildError"/> could not be parsed.</returns>
        private IIssue GetIssue(
            BuildErrorEventArgs buildError,
            MsBuildIssuesProvider issueProvider,
            IRepositorySettings repositorySettings)
        {
            this.Log.Verbose("Process error '{0}'...", buildError.Message);

            return
                (this.GetIssue(
                     IssuePriority.Error,
                     buildError.Message,
                     buildError.ProjectFile,
                     buildError.File,
                     buildError.LineNumber,
                     buildError.EndLineNumber,
                     buildError.ColumnNumber,
                     buildError.EndColumnNumber,
                     buildError.Code,
                     issueProvider,
                     repositorySettings));
        }
        /// <inheritdoc/>
        public override IEnumerable <IIssue> ReadIssues(
            MsBuildIssuesProvider issueProvider,
            IRepositorySettings repositorySettings,
            MsBuildIssuesSettings issueProviderSettings)
        {
#pragma warning disable SA1123 // Do not place regions within elements
            #region DupFinder Exclusion
#pragma warning restore SA1123 // Do not place regions within elements

            issueProvider.NotNull(nameof(issueProvider));
            repositorySettings.NotNull(nameof(repositorySettings));
            issueProviderSettings.NotNull(nameof(issueProviderSettings));

            #endregion

            var result = new List <IIssue>();

            // Read log file.
            var raw         = issueProviderSettings.LogFileContent.ToStringUsingEncoding(true);
            var filtered    = string.Concat(raw.Where(c => !char.IsControl(c)));
            var logDocument = XDocument.Parse(filtered);

            // Loop through all warning and error tags.
            var elements = new List <XElement>(logDocument.Descendants("warning"));
            elements.AddRange(logDocument.Descendants("error"));

            foreach (var element in elements)
            {
                // Ignore warnings or errors without a message.
                if (string.IsNullOrWhiteSpace(element.Value))
                {
                    continue;
                }

                // Read affected project from the warning or error.
                if (!this.TryGetProject(element, repositorySettings, out string projectFileRelativePath))
                {
                    continue;
                }

                // Read affected file from the warning or error.
                if (!this.TryGetFile(element, repositorySettings, out string fileName))
                {
                    continue;
                }

                // Read affected line from the warning or error.
                if (!TryGetLine(element, out var line))
                {
                    continue;
                }

                // Read affected column from the warning or error.
                if (!TryGetColumn(element, out var column))
                {
                    continue;
                }

                // Read rule code from the warning or error.
                if (!TryGetRule(element, out string rule))
                {
                    continue;
                }

                // Determine rule URL.
                Uri ruleUrl = null;
                if (!string.IsNullOrWhiteSpace(rule))
                {
                    ruleUrl = MsBuildRuleUrlResolver.Instance.ResolveRuleUrl(rule);
                }

                var priority = element.Name.LocalName == "error" ? IssuePriority.Error : IssuePriority.Warning;

                // Build issue.
                result.Add(
                    IssueBuilder
                    .NewIssue(element.Value, issueProvider)
                    .WithPriority(priority)
                    .InProject(projectFileRelativePath, System.IO.Path.GetFileNameWithoutExtension(projectFileRelativePath))
                    .InFile(fileName, line, column)
                    .OfRule(rule, ruleUrl)
                    .Create());
            }

            return(result);
        }
Exemple #10
0
        /// <inheritdoc/>
        public override IEnumerable <IIssue> ReadIssues(
            MsBuildIssuesProvider issueProvider,
            IssueCommentFormat format,
            RepositorySettings repositorySettings,
            MsBuildIssuesSettings issueProviderSettings)
        {
#pragma warning disable SA1123 // Do not place regions within elements
            #region DupFinder Exclusion
#pragma warning restore SA1123 // Do not place regions within elements

            issueProvider.NotNull(nameof(issueProvider));
            repositorySettings.NotNull(nameof(repositorySettings));
            issueProviderSettings.NotNull(nameof(issueProviderSettings));

            #endregion

            var result = new List <IIssue>();

            // Read log file.
            var logDocument = XDocument.Parse(issueProviderSettings.LogFileContent.ToStringUsingEncoding(true));

            // Loop through all warning tags.
            foreach (var warning in logDocument.Descendants("warning"))
            {
                // Read affected project from the warning.
                if (!this.TryGetProject(warning, repositorySettings, out string projectFileRelativePath))
                {
                    continue;
                }

                // Read affected file from the warning.
                if (!this.TryGetFile(warning, repositorySettings, out string fileName))
                {
                    continue;
                }

                // Read affected line from the warning.
                if (!TryGetLine(warning, out var line))
                {
                    continue;
                }

                // Read rule code from the warning.
                if (!TryGetRule(warning, out string rule))
                {
                    continue;
                }

                // Determine rule URL.
                Uri ruleUrl = null;
                if (!string.IsNullOrWhiteSpace(rule))
                {
                    ruleUrl = MsBuildRuleUrlResolver.Instance.ResolveRuleUrl(rule);
                }

                // Build issue.
                result.Add(
                    IssueBuilder
                    .NewIssue(warning.Value, issueProvider)
                    .WithPriority(IssuePriority.Warning)
                    .InProject(projectFileRelativePath, System.IO.Path.GetFileNameWithoutExtension(projectFileRelativePath))
                    .InFile(fileName, line)
                    .OfRule(rule, ruleUrl)
                    .Create());
            }

            return(result);
        }