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); }
private static ChangelogOptions MergeChangelogOptions(ChangelogOptions customOptions, ChangelogOptions defaultOptions) { if (customOptions == null) { return(defaultOptions); } return(new ChangelogOptions { Header = customOptions.Header ?? defaultOptions.Header, Sections = customOptions.Sections ?? defaultOptions.Sections, }); }
public void AlteredCurrentVersionChangelog(bool prepends, int length) { // Set up the repo File.AppendAllText(readmePath, "\nThis is for a fix commit"); repo.Index.Add("README.md"); repo.Commit("feat(Foo): Foo feature"); var changelog = new Changelog(); File.WriteAllText(TestRepoChangelogPath, "This is previous stuff"); var options = new ChangelogOptions() { Version = "1.0.0", WorkingDirectory = Util.GetFullPath(Util.TEST_REPO_DIR), AlwaysPrepends = prepends }; changelog.Generate(options); File.AppendAllText(readmePath, "\nsecond commit"); repo.Index.Add("README.md"); repo.Commit("fix(Foo): second commit"); options.Version = "1.0.1"; changelog.Generate(options); File.AppendAllText(readmePath, "\n3rd commit"); repo.Index.Add("README.md"); repo.Commit("fix(Foo): 3rd commit commit"); options.Version = "1.0.1"; changelog.Generate(options); var text = File.ReadAllText(TestRepoChangelogPath); var r = text.Split(new[] { "1.0.1" }, StringSplitOptions.None); Assert.AreEqual(r.Length, length); }