diff --git a/src/GitVersion.Core.Tests/IntegrationTests/RepositoryFixtureExtensions.cs b/src/GitVersion.Core.Tests/IntegrationTests/RepositoryFixtureExtensions.cs index bf89eda3b8..79706e422a 100644 --- a/src/GitVersion.Core.Tests/IntegrationTests/RepositoryFixtureExtensions.cs +++ b/src/GitVersion.Core.Tests/IntegrationTests/RepositoryFixtureExtensions.cs @@ -13,8 +13,9 @@ public static void MakeACommit(this RepositoryFixtureBase fixture, string commit var participant = GetParticipant(fixture.Repository.Head.FriendlyName); if (participant != null) - diagramBuilder?.AppendLineFormat("{0} -> {0}: Commit '{1}'", participant, commitMsg); - return; + { + AddTheCommitMessage(fixture, commitMsg, diagramBuilder, participant); + } string? GetParticipant(string participantName) => (string?)typeof(SequenceDiagram).GetMethod("GetParticipant", BindingFlags.Instance | BindingFlags.NonPublic) @@ -23,4 +24,17 @@ public static void MakeACommit(this RepositoryFixtureBase fixture, string commit participantName ]); } + + private static void AddTheCommitMessage(RepositoryFixtureBase fixture, string commitMsg, StringBuilder? diagramBuilder, string participant) + { + if (commitMsg.Length < 40) + { + diagramBuilder?.AppendLineFormat("{0} -> {0}: Commit '{1}'", participant, commitMsg); + } + else + { + var formattedCommitMsg = string.Join(System.Environment.NewLine, $"Commit '{commitMsg}'".SplitIntoLines(60)); + fixture.SequenceDiagram.NoteOver(formattedCommitMsg, participant); + } + } } diff --git a/src/GitVersion.Core.Tests/IntegrationTests/StringExtensions.cs b/src/GitVersion.Core.Tests/IntegrationTests/StringExtensions.cs new file mode 100644 index 0000000000..50577f3327 --- /dev/null +++ b/src/GitVersion.Core.Tests/IntegrationTests/StringExtensions.cs @@ -0,0 +1,50 @@ +namespace GitVersion.Core.Tests.IntegrationTests; + +public static class StringExtensions +{ + public static IEnumerable SplitIntoLines(this string str, int maxLineLength) + { + if (string.IsNullOrEmpty(str)) yield break; + + foreach (var line in SplitByNewlines(str)) + { + foreach (var wrapped in WrapWithWordBoundaries(line, maxLineLength)) + { + yield return wrapped; + } + } + } + + private static IEnumerable SplitByNewlines(string str) + => str.Split(["\r\n", "\n"], StringSplitOptions.None); + + private static IEnumerable WrapWithWordBoundaries(string line, int maxLength) + { + if (string.IsNullOrWhiteSpace(line)) + { + yield return string.Empty; + yield break; + } + + var index = 0; + while (index < line.Length) + { + var wrapAt = GetWrapIndex(line, index, maxLength); + yield return line.Substring(index, wrapAt - index).TrimEnd(); + index = wrapAt; + } + } + + private static int GetWrapIndex(string line, int start, int maxLength) + { + var remaining = line.Length - start; + if (remaining <= maxLength) + { + return line.Length; + } + + var end = start + maxLength; + var lastBreak = line.LastIndexOfAny([' ', '-'], end - 1, maxLength); + return lastBreak > start ? lastBreak + 1 : end; + } +}