public void Write( Version version, DateTimeOffset versionTime, IChangelogLinkBuilder linkBuilder, IEnumerable <ConventionalCommit> commits, ChangelogOptions changelogOptions) { string markdown = GenerateMarkdown(version, versionTime, linkBuilder, commits, changelogOptions); if (File.Exists(FilePath)) { var contents = File.ReadAllText(FilePath); var firstReleaseHeadlineIdx = contents.IndexOf("<a name=\"", StringComparison.Ordinal); if (firstReleaseHeadlineIdx >= 0) { markdown = contents.Insert(firstReleaseHeadlineIdx, markdown); } else { markdown = contents + "\n\n" + markdown; } File.WriteAllText(FilePath, markdown); } else { File.WriteAllText(FilePath, changelogOptions.Header + "\n" + markdown); } }
public static string GenerateMarkdown( Version version, DateTimeOffset versionTime, IChangelogLinkBuilder linkBuilder, IEnumerable <ConventionalCommit> commits, ChangelogOptions changelogOptions) { var versionTagLink = string.IsNullOrWhiteSpace(linkBuilder.BuildVersionTagLink(version)) ? version.ToString() : $"[{version}]({linkBuilder.BuildVersionTagLink(version)})"; var markdown = $"<a name=\"{version}\"></a>"; markdown += "\n"; markdown += $"## {versionTagLink} ({versionTime.Year}-{versionTime.Month}-{versionTime.Day})"; markdown += "\n"; markdown += "\n"; var visibleChangelogSections = changelogOptions.Sections.Where(x => !x.Hidden); foreach (var changelogSection in visibleChangelogSections) { var matchingCommits = commits.Where(commit => commit.Type == changelogSection.Type); var buildBlock = BuildBlock(changelogSection.Section, linkBuilder, matchingCommits); if (!string.IsNullOrWhiteSpace(buildBlock)) { markdown += buildBlock; markdown += "\n"; } } var breaking = BuildBlock("Breaking Changes", linkBuilder, commits.Where(commit => commit.IsBreakingChange)); if (!string.IsNullOrWhiteSpace(breaking)) { markdown += breaking; markdown += "\n"; } if (changelogOptions.IncludeAllCommits) { var other = BuildBlock( "Other", linkBuilder, commits.Where(commit => !visibleChangelogSections.Any(x => x.Type == commit.Type) && !commit.IsBreakingChange)); if (!string.IsNullOrWhiteSpace(other)) { markdown += other; markdown += "\n"; } } return(markdown); }
public static string BuildBlock(string header, IChangelogLinkBuilder linkBuilder, IEnumerable <ConventionalCommit> commits) { if (!commits.Any()) { return(null); } var block = $"### {header}"; block += "\n"; block += "\n"; return(commits .OrderBy(c => c.Scope) .ThenBy(c => c.Subject) .Aggregate(block, (current, commit) => current + BuildCommit(commit, linkBuilder) + "\n")); }
public static string BuildCommit(ConventionalCommit commit, IChangelogLinkBuilder linkBuilder) { var sb = new StringBuilder("* "); if (!string.IsNullOrWhiteSpace(commit.Scope)) { sb.Append($"**{commit.Scope}:** "); } sb.Append(commit.Subject); var commitLink = linkBuilder.BuildCommitLink(commit); if (!string.IsNullOrWhiteSpace(commitLink)) { sb.Append($" ([{commit.Sha.Substring(0, 7)}]({commitLink}))"); } return(sb.ToString()); }
public void Write(Version version, DateTimeOffset versionTime, IChangelogLinkBuilder linkBuilder, IEnumerable <ConventionalCommit> commits, bool includeAllCommitsInChangelog = false) { var versionTagLink = string.IsNullOrWhiteSpace(linkBuilder.BuildVersionTagLink(version)) ? version.ToString() : $"[{version}]({linkBuilder.BuildVersionTagLink(version)})"; var markdown = $"<a name=\"{version}\"></a>"; markdown += "\n"; markdown += $"## {versionTagLink} ({versionTime.Year}-{versionTime.Month}-{versionTime.Day})"; markdown += "\n"; markdown += "\n"; var bugFixes = BuildBlock("Bug Fixes", linkBuilder, commits.Where(commit => commit.IsFix)); if (!string.IsNullOrWhiteSpace(bugFixes)) { markdown += bugFixes; markdown += "\n"; } var features = BuildBlock("Features", linkBuilder, commits.Where(commit => commit.IsFeature)); if (!string.IsNullOrWhiteSpace(features)) { markdown += features; markdown += "\n"; } var breaking = BuildBlock("Breaking Changes", linkBuilder, commits.Where(commit => commit.IsBreakingChange)); if (!string.IsNullOrWhiteSpace(breaking)) { markdown += breaking; markdown += "\n"; } if (includeAllCommitsInChangelog) { var other = BuildBlock("Other", linkBuilder, commits.Where(commit => !commit.IsFix && !commit.IsFeature && !commit.IsBreakingChange)); if (!string.IsNullOrWhiteSpace(other)) { markdown += other; markdown += "\n"; } } if (File.Exists(FilePath)) { var contents = File.ReadAllText(FilePath); var firstReleaseHeadlineIdx = contents.IndexOf("<a name=\"", StringComparison.Ordinal); if (firstReleaseHeadlineIdx >= 0) { markdown = contents.Insert(firstReleaseHeadlineIdx, markdown); } else { markdown = contents + "\n\n" + markdown; } File.WriteAllText(FilePath, markdown); } else { File.WriteAllText(FilePath, Preamble + "\n" + markdown); } }