mirror of
https://github.com/github/codeql.git
synced 2026-04-22 07:15:15 +02:00
Add helper for markdown lists of projects
This commit is contained in:
@@ -3,6 +3,7 @@ using Semmle.Util.Logging;
|
||||
using Semmle.Autobuild.Shared;
|
||||
using Semmle.Util;
|
||||
using System.Linq;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Semmle.Autobuild.CSharp
|
||||
{
|
||||
@@ -141,7 +142,7 @@ namespace Semmle.Autobuild.CSharp
|
||||
var message = MakeDiagnostic("dotnet-incompatible-projects", "Some projects are incompatible with .NET Core");
|
||||
message.MarkdownMessage =
|
||||
"CodeQL found some projects which cannot be built with .NET Core:\n" +
|
||||
string.Join('\n', autoBuildRule.DotNetRule.NotDotNetProjects.Select(p => $"- `{p.FullPath}`"));
|
||||
autoBuildRule.DotNetRule.NotDotNetProjects.ToMarkdownList(5);
|
||||
message.Severity = DiagnosticMessage.TspSeverity.Warning;
|
||||
|
||||
AddDiagnostic(message);
|
||||
@@ -153,7 +154,7 @@ namespace Semmle.Autobuild.CSharp
|
||||
var message = MakeDiagnostic("dotnet-build-failure", "Some projects or solutions failed to build using .NET Core");
|
||||
message.MarkdownMessage =
|
||||
"CodeQL was unable to build the following projects using .NET Core:\n" +
|
||||
string.Join('\n', autoBuildRule.DotNetRule.FailedProjectsOrSolutions.Select(p => $"- `{p.FullPath}`")) +
|
||||
autoBuildRule.DotNetRule.FailedProjectsOrSolutions.ToMarkdownList(10) +
|
||||
$"\nSet up a [manual build command]({buildCommandDocsUrl}).";
|
||||
message.Severity = DiagnosticMessage.TspSeverity.Error;
|
||||
|
||||
@@ -166,7 +167,7 @@ namespace Semmle.Autobuild.CSharp
|
||||
var message = MakeDiagnostic("msbuild-build-failure", "Some projects or solutions failed to build using MSBuild");
|
||||
message.MarkdownMessage =
|
||||
"CodeQL was unable to build the following projects using MSBuild:\n" +
|
||||
string.Join('\n', autoBuildRule.MsBuildRule.FailedProjectsOrSolutions.Select(p => $"- `{p.FullPath}`")) +
|
||||
autoBuildRule.MsBuildRule.FailedProjectsOrSolutions.ToMarkdownList(10) +
|
||||
$"\nSet up a [manual build command]({buildCommandDocsUrl}).";
|
||||
message.Severity = DiagnosticMessage.TspSeverity.Error;
|
||||
|
||||
|
||||
57
csharp/autobuilder/Semmle.Autobuild.Shared/MarkdownUtil.cs
Normal file
57
csharp/autobuilder/Semmle.Autobuild.Shared/MarkdownUtil.cs
Normal file
@@ -0,0 +1,57 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
|
||||
namespace Semmle.Autobuild.Shared
|
||||
{
|
||||
public static class MarkdownUtil
|
||||
{
|
||||
/// <summary>
|
||||
/// Formats items as markdown inline code.
|
||||
/// </summary>
|
||||
/// <returns>A function which formats items as markdown inline code.</returns>
|
||||
public static readonly Func<string, string> CodeFormatter = item => $"`{item}`";
|
||||
|
||||
/// <summary>
|
||||
/// Renders <see cref="projects" /> as a markdown list of the project paths.
|
||||
/// </summary>
|
||||
/// <param name="projects">
|
||||
/// The list of projects whose paths should be rendered as a markdown list.
|
||||
/// </param>
|
||||
/// <param name="limit">The maximum number of items to include in the list.</param>
|
||||
/// <returns>Returns the markdown list as a string.</returns>
|
||||
public static string ToMarkdownList(this IEnumerable<IProjectOrSolution> projects, int? limit = null)
|
||||
{
|
||||
return projects.ToMarkdownList(p => $"`{p.FullPath}`", limit);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Renders <see cref="items" /> as a markdown list.
|
||||
/// </summary>
|
||||
/// <typeparam name="T">The item type.</typeparam>
|
||||
/// <param name="items">The list that should be formatted as a markdown list.</param>
|
||||
/// <param name="formatter">A function which converts individual items into a string representation.</param>
|
||||
/// <param name="limit">The maximum number of items to include in the list.</param>
|
||||
/// <returns>Returns the markdown list as a string.</returns>
|
||||
public static string ToMarkdownList<T>(this IEnumerable<T> items, Func<T, string> formatter, int? limit = null)
|
||||
{
|
||||
var sb = new StringBuilder();
|
||||
|
||||
// if there is a limit, take at most that many items from the start of the list
|
||||
var list = limit is not null ? items.Take(limit.Value) : items;
|
||||
sb.Append(string.Join('\n', list.Select(item => $"- {formatter(item)}")));
|
||||
|
||||
// if there were more items than allowed in the list, add an extra item indicating
|
||||
// how many more items there were
|
||||
var length = items.Count();
|
||||
|
||||
if (limit is not null && length > limit)
|
||||
{
|
||||
sb.Append($"\n- and {length - limit} more. View the CodeQL logs for a full list.");
|
||||
}
|
||||
|
||||
return sb.ToString();
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user