From 0f030ec556203a69b3738ec4c2c8980779017b02 Mon Sep 17 00:00:00 2001 From: nigma143 <50573226+nigma143@users.noreply.github.com> Date: Sat, 4 Nov 2023 02:02:50 +0300 Subject: [PATCH] feat: add issue link support and templates for plain links (#109) * feat: add issue link support and templates for plain links * fix by Codacy Static Code Analysis * fix at CreateFor --- .../Changelog/AzureLinkBuilderTests.cs | 18 +++++ .../Changelog/BitbucketLinkBuilderTests.cs | 18 +++++ .../Changelog/ChangelogBuilderTests.cs | 42 +++++++++++ .../Changelog/GithubLinkBuilderTests.cs | 37 +++++++++ .../Changelog/GitlabLinkBuilderTests.cs | 18 +++++ .../Changelog/PlainLinkBuilderTest.cs | 75 +++++++++++++++++++ .../ConventionalCommitParserTests.cs | 25 ++++++- Versionize/Changelog/AzureLinkBuilder.cs | 5 ++ Versionize/Changelog/BitbucketLinkBuilder.cs | 7 +- Versionize/Changelog/ChangelogBuilder.cs | 12 ++- Versionize/Changelog/GithubLinkBuilder.cs | 5 ++ Versionize/Changelog/GitlabLinkBuilder.cs | 6 ++ Versionize/Changelog/IChangelogLinkBuilder.cs | 4 +- Versionize/Changelog/LinkBuilderFactory.cs | 9 ++- Versionize/Changelog/PlainLinkBuilder.cs | 31 ++++++++ Versionize/ChangelogOptions.cs | 11 +++ Versionize/ConventionalCommit.cs | 9 +++ Versionize/ConventionalCommitParser.cs | 16 +++- Versionize/Program.cs | 1 + Versionize/WorkingCopy.cs | 2 +- 20 files changed, 340 insertions(+), 11 deletions(-) create mode 100644 Versionize.Tests/Changelog/PlainLinkBuilderTest.cs diff --git a/Versionize.Tests/Changelog/AzureLinkBuilderTests.cs b/Versionize.Tests/Changelog/AzureLinkBuilderTests.cs index 45543b6..5b15327 100644 --- a/Versionize.Tests/Changelog/AzureLinkBuilderTests.cs +++ b/Versionize.Tests/Changelog/AzureLinkBuilderTests.cs @@ -77,6 +77,24 @@ public void ShouldBuildAHTTPSCommitLink() link.ShouldBe("https://dosse@dev.azure.com/dosse/DosSE.ERP.Cloud/_git/ERP/commit/734713bc047d87bf7eac9674765ae793478c50d3"); } + [Fact] + public void ShouldBuildASSHIssueLink() + { + var linkBuilder = new AzureLinkBuilder("git@ssh.dev.azure.com:v3/dosse/DosSE.ERP.Cloud/ERP.git"); + var link = linkBuilder.BuildIssueLink("123"); + + link.ShouldBe("https://v3@dev.azure.com/v3/dosse/DosSE.ERP.Cloud/ERP/_workitems/edit/123"); + } + + [Fact] + public void ShouldBuildAHTTPSIssueLink() + { + var linkBuilder = new AzureLinkBuilder("https://dosse@dev.azure.com/dosse/DosSE.ERP.Cloud/_git/ERP.git"); + var link = linkBuilder.BuildIssueLink("123"); + + link.ShouldBe("https://dosse@dev.azure.com/dosse/DosSE.ERP.Cloud/_git/ERP/_workitems/edit/123"); + } + [Fact] public void ShouldCreateAnAzureUrlBuilderForSSHPushUrlsEvenWithoutGitSuffix() { diff --git a/Versionize.Tests/Changelog/BitbucketLinkBuilderTests.cs b/Versionize.Tests/Changelog/BitbucketLinkBuilderTests.cs index df2b129..e2a47e0 100644 --- a/Versionize.Tests/Changelog/BitbucketLinkBuilderTests.cs +++ b/Versionize.Tests/Changelog/BitbucketLinkBuilderTests.cs @@ -114,6 +114,24 @@ public void ShouldBuildAComSSHCommitLink() link.ShouldBe("https://bitbucket.com/mobiloitteinc/dotnet-codebase/commits/734713bc047d87bf7eac9674765ae793478c50d3"); } + [Fact] + public void ShouldBuildAnOrgSSHIssueLink() + { + var linkBuilder = new BitbucketLinkBuilder(sshOrgPushUrl); + var link = linkBuilder.BuildIssueLink("123"); + + link.ShouldBe("https://bitbucket.org/mobiloitteinc/dotnet-codebase/issues/123"); + } + + [Fact] + public void ShouldBuildAComSSHIssueLink() + { + var linkBuilder = new BitbucketLinkBuilder(sshComPushUrl); + var link = linkBuilder.BuildIssueLink("321"); + + link.ShouldBe("https://bitbucket.com/mobiloitteinc/dotnet-codebase/issues/321"); + } + [Fact] public void ShouldBuildAnOrgHTTPSCommitLink() { diff --git a/Versionize.Tests/Changelog/ChangelogBuilderTests.cs b/Versionize.Tests/Changelog/ChangelogBuilderTests.cs index af02c84..84e10bc 100644 --- a/Versionize.Tests/Changelog/ChangelogBuilderTests.cs +++ b/Versionize.Tests/Changelog/ChangelogBuilderTests.cs @@ -84,6 +84,48 @@ public void ShouldGenerateAChangelogForFixFeatAndBreakingCommits() Assert.Equal(sb.Build(), changelogContents); } + [Fact] + public void ShouldGenerateAChangelogForFixFeatAndIssueLink() + { + var githubLinkBuilder = new GithubLinkBuilder( + "https://github.com/versionize/versionize.git"); + var changelog = ChangelogBuilder.CreateForPath(_testDirectory); + changelog.Write( + new Version(1, 1, 0), + DateTimeOffset.Parse("2023-10-31"), + githubLinkBuilder, + new List + { + ConventionalCommitParser.Parse(new TestCommit("a360d6a307909c6e571b29d4a329fd786c5d4543", "fix: a fix #107")), + ConventionalCommitParser.Parse(new TestCommit("b360d6a307909c6e571b29d4a329fd786c5d4543", "feat: a feature (#75)")), + ConventionalCommitParser.Parse( + new TestCommit("c360d6a307909c6e571b29d4a329fd786c5d4543", "feat: a breaking change feature\nBREAKING CHANGE: this will break everything")), + }, + ChangelogOptions.Default); + + var changelogContents = File.ReadAllText(changelog.FilePath); + + var expectedContent = @$"{ChangelogOptions.Preamble} + +## [1.1.0](https://www.github.com/versionize/versionize/releases/tag/v1.1.0) (2023-10-31) + +### Features + +* a breaking change feature ([c360d6a](https://www.github.com/versionize/versionize/commit/c360d6a307909c6e571b29d4a329fd786c5d4543)) +* a feature ([#75](https://www.github.com/versionize/versionize/issues/75)) ([b360d6a](https://www.github.com/versionize/versionize/commit/b360d6a307909c6e571b29d4a329fd786c5d4543)) + +### Bug Fixes + +* a fix [#107](https://www.github.com/versionize/versionize/issues/107) ([a360d6a](https://www.github.com/versionize/versionize/commit/a360d6a307909c6e571b29d4a329fd786c5d4543)) + +### Breaking Changes + +* a breaking change feature ([c360d6a](https://www.github.com/versionize/versionize/commit/c360d6a307909c6e571b29d4a329fd786c5d4543)) + +"; + Assert.Equal(expectedContent, changelogContents); + } + [Fact] public void ShouldHideFixSectionWhenHideIsTrue() { diff --git a/Versionize.Tests/Changelog/GithubLinkBuilderTests.cs b/Versionize.Tests/Changelog/GithubLinkBuilderTests.cs index dc88e38..e99e9c2 100644 --- a/Versionize.Tests/Changelog/GithubLinkBuilderTests.cs +++ b/Versionize.Tests/Changelog/GithubLinkBuilderTests.cs @@ -1,4 +1,5 @@ using LibGit2Sharp; +using NuGet.Versioning; using Shouldly; using Versionize.Tests.TestSupport; using Xunit; @@ -67,6 +68,42 @@ public void ShouldCreateAGithubUrlBuilderForHTTPSPushUrlsEvenWithoutGitSuffix() linkBuilder.ShouldBeAssignableTo(); } + [Fact] + public void ShouldBuildASSHLink() + { + var linkBuilder = new GithubLinkBuilder("git@github.com:versionize/versionize"); + + linkBuilder.BuildIssueLink("123") + .ShouldBe("https://www.github.com/versionize/versionize/issues/123"); + linkBuilder.BuildCommitLink( + new ConventionalCommit + { + Sha = "734713bc047d87bf7eac9674765ae793478c50d3" + }) + .ShouldBe("https://www.github.com/versionize/versionize/commit/734713bc047d87bf7eac9674765ae793478c50d3"); + linkBuilder.BuildVersionTagLink( + new SemanticVersion(1, 2, 3)) + .ShouldBe("https://www.github.com/versionize/versionize/releases/tag/v1.2.3"); + } + + [Fact] + public void ShouldBuildAHTTPSLink() + { + var linkBuilder = new GithubLinkBuilder("https://github.com/versionize/versionize.git"); + + linkBuilder.BuildIssueLink("123") + .ShouldBe("https://www.github.com/versionize/versionize/issues/123"); + linkBuilder.BuildCommitLink( + new ConventionalCommit + { + Sha = "734713bc047d87bf7eac9674765ae793478c50d3" + }) + .ShouldBe("https://www.github.com/versionize/versionize/commit/734713bc047d87bf7eac9674765ae793478c50d3"); + linkBuilder.BuildVersionTagLink( + new SemanticVersion(1, 2, 3)) + .ShouldBe("https://www.github.com/versionize/versionize/releases/tag/v1.2.3"); + } + private static Repository SetupRepositoryWithRemote(string remoteName, string pushUrl) { var workingDirectory = TempDir.Create(); diff --git a/Versionize.Tests/Changelog/GitlabLinkBuilderTests.cs b/Versionize.Tests/Changelog/GitlabLinkBuilderTests.cs index d6a9cfe..0456fa2 100644 --- a/Versionize.Tests/Changelog/GitlabLinkBuilderTests.cs +++ b/Versionize.Tests/Changelog/GitlabLinkBuilderTests.cs @@ -94,6 +94,24 @@ public void ShouldBuildAHTTPSCommitLink() link.ShouldBe("https://gitlab.com/inkscape/inkscape/-/commit/734713bc047d87bf7eac9674765ae793478c50d3"); } + [Fact] + public void ShouldBuildASSHIssueLink() + { + var linkBuilder = new GitlabLinkBuilder(inkscapeSSH); + var link = linkBuilder.BuildIssueLink("123"); + + link.ShouldBe("https://gitlab.com/inkscape/inkscape/-/issues/123"); + } + + [Fact] + public void ShouldBuildAHTTPSIssueLink() + { + var linkBuilder = new GitlabLinkBuilder(inkscapeHTTPS); + var link = linkBuilder.BuildIssueLink("123"); + + link.ShouldBe("https://gitlab.com/inkscape/inkscape/-/issues/123"); + } + [Fact] public void ShouldBuildASSHTagLink() { diff --git a/Versionize.Tests/Changelog/PlainLinkBuilderTest.cs b/Versionize.Tests/Changelog/PlainLinkBuilderTest.cs new file mode 100644 index 0000000..35e3164 --- /dev/null +++ b/Versionize.Tests/Changelog/PlainLinkBuilderTest.cs @@ -0,0 +1,75 @@ +using LibGit2Sharp; +using NuGet.Versioning; +using Shouldly; +using Versionize.Changelog; +using Versionize.Tests.TestSupport; +using Xunit; + +namespace Versionize.Tests.Changelog; + +public class PlainLinkBuilderTest +{ + [Fact] + public void ShouldCreatePlainLinkBuilder() + { + var repo = SetupRepositoryWithRemote("origin", "https://hostmeister.com/versionize/versionize.git"); + var linkBuilder = LinkBuilderFactory.CreateFor(repo); + + linkBuilder.ShouldBeAssignableTo(); + + linkBuilder.BuildIssueLink("123") + .ShouldBeEmpty(); + linkBuilder.BuildCommitLink( + new ConventionalCommit + { + Sha = "734713bc047d87bf7eac9674765ae793478c50d3" + }) + .ShouldBeEmpty(); + linkBuilder.BuildVersionTagLink( + new SemanticVersion(1, 2, 3)) + .ShouldBeEmpty(); + } + + [Fact] + public void ShouldBuildCustomLinks() + { + var repo = SetupRepositoryWithRemote("origin", "https://hostmeister.com/versionize/versionize.git"); + var linkBuilder = LinkBuilderFactory.CreateFor( + repo, + new PlainLinkTemplates + { + IssueLink = "https://my-repo/issues/{issue}", + CommitLink = "https://my-repo/commits/{commitSha}", + VersionTagLink = "https://my-repo/tags/v{version}", + }); + + linkBuilder.ShouldBeAssignableTo(); + + linkBuilder.BuildIssueLink("123") + .ShouldBe("https://my-repo/issues/123"); + linkBuilder.BuildCommitLink( + new ConventionalCommit + { + Sha = "734713bc047d87bf7eac9674765ae793478c50d3" + }) + .ShouldBe("https://my-repo/commits/734713bc047d87bf7eac9674765ae793478c50d3"); + linkBuilder.BuildVersionTagLink( + new SemanticVersion(1, 2, 3)) + .ShouldBe("https://my-repo/tags/v1.2.3"); + } + + private static Repository SetupRepositoryWithRemote(string remoteName, string pushUrl) + { + var workingDirectory = TempDir.Create(); + var repo = TempRepository.Create(workingDirectory); + + foreach (var existingRemoteName in repo.Network.Remotes.Select(remote => remote.Name)) + { + repo.Network.Remotes.Remove(existingRemoteName); + } + + repo.Network.Remotes.Add(remoteName, pushUrl); + + return repo; + } +} diff --git a/Versionize.Tests/ConventionalCommitParserTests.cs b/Versionize.Tests/ConventionalCommitParserTests.cs index d92e46c..c6cea5d 100644 --- a/Versionize.Tests/ConventionalCommitParserTests.cs +++ b/Versionize.Tests/ConventionalCommitParserTests.cs @@ -1,4 +1,4 @@ -using LibGit2Sharp; +using LibGit2Sharp; using Shouldly; using Xunit; @@ -72,6 +72,29 @@ public void ShouldSupportExclamationMarkToSignifyingBreakingChanges(string commi conventionalCommit.Notes[0].Title.ShouldBe("BREAKING CHANGE"); conventionalCommit.Notes[0].Text.ShouldBe(string.Empty); } + + [Theory] + [InlineData("fix: subject text #64", new[] {"64"})] + [InlineData("fix: subject #64 text", new[] { "64" })] + [InlineData("fix: #64 subject text", new[] { "64" })] + [InlineData("fix: subject text. #64 #65", new[] { "64", "65" })] + [InlineData("fix: subject text. (#64) (#65)", new[] { "64", "65" })] + [InlineData("fix: subject text. #64#65", new[] { "64", "65" })] + [InlineData("fix: #64 subject #65 text. (#66)", new[] { "64", "65", "66" })] + public void ShouldExtractCommitIssues(string commitMessage, string[] expectedIssues) + { + var testCommit = new TestCommit("c360d6a307909c6e571b29d4a329fd786c5d4543", commitMessage); + var conventionalCommit = ConventionalCommitParser.Parse(testCommit); + + Assert.Equal(conventionalCommit.Issues.Count, expectedIssues.Length); + + foreach (var expectedIssue in expectedIssues) + { + var issue = conventionalCommit.Issues.SingleOrDefault(x => x.Id == expectedIssue); + Assert.NotNull(issue); + Assert.Equal(issue.Token, $"#{expectedIssue}"); + } + } } public class TestCommit : Commit diff --git a/Versionize/Changelog/AzureLinkBuilder.cs b/Versionize/Changelog/AzureLinkBuilder.cs index 53409ba..7b9a75b 100644 --- a/Versionize/Changelog/AzureLinkBuilder.cs +++ b/Versionize/Changelog/AzureLinkBuilder.cs @@ -51,6 +51,11 @@ public string BuildVersionTagLink(Version version) return $"https://{_organization}@dev.azure.com/{_organization}/{_repository}/releases/tag/v{version}"; } + public string BuildIssueLink(string issueId) + { + return $"https://{_organization}@dev.azure.com/{_organization}/{_repository}/_workitems/edit/{issueId}"; + } + public string BuildCommitLink(ConventionalCommit commit) { return $"https://{_organization}@dev.azure.com/{_organization}/{_repository}/commit/{commit.Sha}"; diff --git a/Versionize/Changelog/BitbucketLinkBuilder.cs b/Versionize/Changelog/BitbucketLinkBuilder.cs index eb2ca27..23f0759 100644 --- a/Versionize/Changelog/BitbucketLinkBuilder.cs +++ b/Versionize/Changelog/BitbucketLinkBuilder.cs @@ -1,4 +1,4 @@ -using System.Text.RegularExpressions; +using System.Text.RegularExpressions; using Version = NuGet.Versioning.SemanticVersion; namespace Versionize.Changelog; @@ -59,6 +59,11 @@ public string BuildVersionTagLink(Version version) return $"https://bitbucket.{_domain}/{_organization}/{_repository}/src/v{version}"; } + public string BuildIssueLink(string issueId) + { + return $"https://bitbucket.{_domain}/{_organization}/{_repository}/issues/{issueId}"; + } + public string BuildCommitLink(ConventionalCommit commit) { return $"https://bitbucket.{_domain}/{_organization}/{_repository}/commits/{commit.Sha}"; diff --git a/Versionize/Changelog/ChangelogBuilder.cs b/Versionize/Changelog/ChangelogBuilder.cs index f1cff9f..91d8fdc 100644 --- a/Versionize/Changelog/ChangelogBuilder.cs +++ b/Versionize/Changelog/ChangelogBuilder.cs @@ -125,7 +125,17 @@ public static string BuildCommit(ConventionalCommit commit, IChangelogLinkBuilde sb.Append($"**{commit.Scope}:** "); } - sb.Append(commit.Subject); + var subject = commit.Subject; + foreach (var issue in commit.Issues) + { + var issueLink = linkBuilder.BuildIssueLink(issue.Id); + if (!string.IsNullOrEmpty(issueLink)) + { + subject = subject.Replace(issue.Token, $"[{issue.Token}]({issueLink})"); + } + } + + sb.Append(subject); var commitLink = linkBuilder.BuildCommitLink(commit); diff --git a/Versionize/Changelog/GithubLinkBuilder.cs b/Versionize/Changelog/GithubLinkBuilder.cs index 552ff1e..329abb8 100644 --- a/Versionize/Changelog/GithubLinkBuilder.cs +++ b/Versionize/Changelog/GithubLinkBuilder.cs @@ -51,6 +51,11 @@ public string BuildVersionTagLink(Version version) return $"https://www.github.com/{_organization}/{_repository}/releases/tag/v{version}"; } + public string BuildIssueLink(string issueId) + { + return $"https://www.github.com/{_organization}/{_repository}/issues/{issueId}"; + } + public string BuildCommitLink(ConventionalCommit commit) { return $"https://www.github.com/{_organization}/{_repository}/commit/{commit.Sha}"; diff --git a/Versionize/Changelog/GitlabLinkBuilder.cs b/Versionize/Changelog/GitlabLinkBuilder.cs index 16f023f..737d9a7 100644 --- a/Versionize/Changelog/GitlabLinkBuilder.cs +++ b/Versionize/Changelog/GitlabLinkBuilder.cs @@ -1,3 +1,4 @@ +using LibGit2Sharp; using System.Text.RegularExpressions; using Version = NuGet.Versioning.SemanticVersion; @@ -51,6 +52,11 @@ public string BuildVersionTagLink(Version version) return $"https://gitlab.com/{_organization}/{_repository}/-/tags/v{version}"; } + public string BuildIssueLink(string issueId) + { + return $"https://gitlab.com/{_organization}/{_repository}/-/issues/{issueId}"; + } + public string BuildCommitLink(ConventionalCommit commit) { return $"https://gitlab.com/{_organization}/{_repository}/-/commit/{commit.Sha}"; diff --git a/Versionize/Changelog/IChangelogLinkBuilder.cs b/Versionize/Changelog/IChangelogLinkBuilder.cs index 162ebda..2c837e7 100644 --- a/Versionize/Changelog/IChangelogLinkBuilder.cs +++ b/Versionize/Changelog/IChangelogLinkBuilder.cs @@ -1,9 +1,11 @@ -using Version = NuGet.Versioning.SemanticVersion; +using Version = NuGet.Versioning.SemanticVersion; namespace Versionize.Changelog; public interface IChangelogLinkBuilder { + string BuildIssueLink(string issueId); + string BuildCommitLink(ConventionalCommit commit); string BuildVersionTagLink(Version version); diff --git a/Versionize/Changelog/LinkBuilderFactory.cs b/Versionize/Changelog/LinkBuilderFactory.cs index cf03855..562ef3e 100644 --- a/Versionize/Changelog/LinkBuilderFactory.cs +++ b/Versionize/Changelog/LinkBuilderFactory.cs @@ -1,16 +1,17 @@ -using LibGit2Sharp; +#nullable enable +using LibGit2Sharp; namespace Versionize.Changelog; public abstract class LinkBuilderFactory { - public static IChangelogLinkBuilder CreateFor(Repository repository) + public static IChangelogLinkBuilder CreateFor(Repository repository, PlainLinkTemplates? linkTemplates = null) { var origin = repository.Network.Remotes.FirstOrDefault(remote => remote.Name == "origin") ?? repository.Network.Remotes.FirstOrDefault(); if (origin == null) { - return new PlainLinkBuilder(); + return new PlainLinkBuilder(linkTemplates); } if (GithubLinkBuilder.IsPushUrl(origin.PushUrl)) @@ -30,6 +31,6 @@ public static IChangelogLinkBuilder CreateFor(Repository repository) return new BitbucketLinkBuilder(origin.PushUrl); } - return new PlainLinkBuilder(); + return new PlainLinkBuilder(linkTemplates); } } diff --git a/Versionize/Changelog/PlainLinkBuilder.cs b/Versionize/Changelog/PlainLinkBuilder.cs index 0a15a8e..734e4de 100644 --- a/Versionize/Changelog/PlainLinkBuilder.cs +++ b/Versionize/Changelog/PlainLinkBuilder.cs @@ -1,16 +1,47 @@ +#nullable enable using Version = NuGet.Versioning.SemanticVersion; namespace Versionize.Changelog; public class PlainLinkBuilder : IChangelogLinkBuilder { + private readonly PlainLinkTemplates? _templates; + + public PlainLinkBuilder(PlainLinkTemplates? templates = null) + { + _templates = templates; + } + + public string BuildIssueLink(string issueId) + { + if (_templates?.IssueLink is { } template) + { + return template.Replace( + "{issue}", issueId, StringComparison.OrdinalIgnoreCase); + } + + return string.Empty; + } + public string BuildCommitLink(ConventionalCommit commit) { + if (_templates?.CommitLink is { } template) + { + return template.Replace( + "{commitSha}", commit.Sha, StringComparison.OrdinalIgnoreCase); + } + return string.Empty; } public string BuildVersionTagLink(Version version) { + if (_templates?.VersionTagLink is { } template) + { + return template.Replace( + "{version}", version.ToString(), StringComparison.OrdinalIgnoreCase); + } + return string.Empty; } } diff --git a/Versionize/ChangelogOptions.cs b/Versionize/ChangelogOptions.cs index e5548c0..56eff4c 100644 --- a/Versionize/ChangelogOptions.cs +++ b/Versionize/ChangelogOptions.cs @@ -24,4 +24,15 @@ public record class ChangelogOptions [JsonIgnore] public bool IncludeAllCommits { get; set; } public IEnumerable Sections { get; set; } + + public PlainLinkTemplates LinkTemplates { get; set; } +} + +public record PlainLinkTemplates +{ + public string IssueLink { get; set; } + + public string CommitLink { get; set; } + + public string VersionTagLink { get; set; } } diff --git a/Versionize/ConventionalCommit.cs b/Versionize/ConventionalCommit.cs index e14a3b2..2ae35ba 100644 --- a/Versionize/ConventionalCommit.cs +++ b/Versionize/ConventionalCommit.cs @@ -12,6 +12,8 @@ public class ConventionalCommit public List Notes { get; set; } = new List(); + public List Issues { get; set; } = new List(); + public bool IsFeature => Type == "feat"; public bool IsFix => Type == "fix"; public bool IsBreakingChange => Notes.Any(note => "BREAKING CHANGE".Equals(note.Title)); @@ -23,3 +25,10 @@ public class ConventionalCommitNote public string Text { get; set; } } + +public class ConventionalCommitIssue +{ + public string Token { get; set; } + + public string Id { get; set; } +} diff --git a/Versionize/ConventionalCommitParser.cs b/Versionize/ConventionalCommitParser.cs index ac1918d..2ae622c 100644 --- a/Versionize/ConventionalCommitParser.cs +++ b/Versionize/ConventionalCommitParser.cs @@ -1,4 +1,4 @@ -using System.Text.RegularExpressions; +using System.Text.RegularExpressions; using LibGit2Sharp; namespace Versionize; @@ -9,6 +9,8 @@ public static class ConventionalCommitParser private static readonly Regex HeaderPattern = new("^(?\\w*)(?:\\((?.*)\\))?(?!)?: (?.*)$", RegexOptions.Compiled | RegexOptions.CultureInvariant | RegexOptions.Singleline); + private static readonly Regex IssuesPattern = new("(?#(?\\d+))", RegexOptions.Compiled | RegexOptions.CultureInvariant | RegexOptions.Singleline); + public static List Parse(List commits) { return commits.ConvertAll(Parse); @@ -37,7 +39,6 @@ public static ConventionalCommit Parse(Commit commit) } var match = HeaderPattern.Match(header); - if (match.Success) { conventionalCommit.Scope = match.Groups["scope"].Value; @@ -52,6 +53,17 @@ public static ConventionalCommit Parse(Commit commit) Text = string.Empty }); } + + var issuesMatch = IssuesPattern.Matches(conventionalCommit.Subject); + foreach (var issueMatch in issuesMatch.Cast()) + { + conventionalCommit.Issues.Add( + new ConventionalCommitIssue + { + Token = issueMatch.Groups["issueToken"].Value, + Id = issueMatch.Groups["issueId"].Value, + }); + } } else { diff --git a/Versionize/Program.cs b/Versionize/Program.cs index 72ea0e6..86d574f 100644 --- a/Versionize/Program.cs +++ b/Versionize/Program.cs @@ -167,6 +167,7 @@ private static ChangelogOptions MergeChangelogOptions(ChangelogOptions customOpt { Header = customOptions.Header ?? defaultOptions.Header, Sections = customOptions.Sections ?? defaultOptions.Sections, + LinkTemplates = customOptions.LinkTemplates ?? defaultOptions.LinkTemplates }; } diff --git a/Versionize/WorkingCopy.cs b/Versionize/WorkingCopy.cs index 9001006..8a22013 100644 --- a/Versionize/WorkingCopy.cs +++ b/Versionize/WorkingCopy.cs @@ -174,7 +174,7 @@ public SemanticVersion Versionize(VersionizeOptions options) } var changelog = ChangelogBuilder.CreateForPath(workingDirectory); - var changelogLinkBuilder = LinkBuilderFactory.CreateFor(repo); + var changelogLinkBuilder = LinkBuilderFactory.CreateFor(repo, options.Changelog.LinkTemplates); if (options.DryRun) {