diff --git a/src/GitVersion.Core.Tests/Core/RepositoryStoreTests.cs b/src/GitVersion.Core.Tests/Core/RepositoryStoreTests.cs index 717434b849..063e82a037 100644 --- a/src/GitVersion.Core.Tests/Core/RepositoryStoreTests.cs +++ b/src/GitVersion.Core.Tests/Core/RepositoryStoreTests.cs @@ -209,7 +209,7 @@ public void GetBranchesContainingCommitThrowsDirectlyOnNullCommit() var fixtureRepository = fixture.Repository.ToGitRepository(); var gitRepoMetadataProvider = new RepositoryStore(this.log, fixtureRepository); - Assert.Throws(() => gitRepoMetadataProvider.GetBranchesContainingCommit(null)); + Assert.Throws(() => gitRepoMetadataProvider.GetBranchesContainingCommit(null!)); } [Test] diff --git a/src/GitVersion.Core.Tests/IntegrationTests/HotfixBranchScenarios.cs b/src/GitVersion.Core.Tests/IntegrationTests/HotfixBranchScenarios.cs index 9679271260..b66bcf0cab 100644 --- a/src/GitVersion.Core.Tests/IntegrationTests/HotfixBranchScenarios.cs +++ b/src/GitVersion.Core.Tests/IntegrationTests/HotfixBranchScenarios.cs @@ -53,13 +53,15 @@ public void CanTakeVersionFromHotfixesBranch() r.MakeATaggedCommit("2.0.0"); }); // Merge hotfix branch to support - Commands.Checkout(fixture.Repository, MainBranch); - Commands.Checkout(fixture.Repository, fixture.Repository.CreateBranch("support-1.1", (LibGit2Sharp.Commit)fixture.Repository.Tags.Single(t => t.FriendlyName == "1.1.0").Target)); + var branch = fixture.Repository.CreateBranch( + "support-1.1", (LibGit2Sharp.Commit)fixture.Repository.Tags.Single(t => t.FriendlyName == "1.1.0").Target + ); + Commands.Checkout(fixture.Repository, branch); fixture.AssertFullSemver("1.1.0"); // create hotfix branch Commands.Checkout(fixture.Repository, fixture.Repository.CreateBranch("hotfixes/1.1.1")); - fixture.AssertFullSemver("1.1.1+0"); + fixture.AssertFullSemver("1.1.1-beta.1+0"); fixture.Repository.MakeACommit(); fixture.AssertFullSemver("1.1.1-beta.1+1"); @@ -85,7 +87,7 @@ public void PatchOlderReleaseExample() // create hotfix branch fixture.BranchTo("hotfix-1.1.1"); - fixture.AssertFullSemver("1.1.1+0"); + fixture.AssertFullSemver("1.1.1-beta.1+0"); fixture.MakeACommit(); fixture.AssertFullSemver("1.1.1-beta.1+1"); diff --git a/src/GitVersion.Core.Tests/IntegrationTests/PerformanceScenarios.cs b/src/GitVersion.Core.Tests/IntegrationTests/PerformanceScenarios.cs index 8506843fb7..b79e2644d9 100644 --- a/src/GitVersion.Core.Tests/IntegrationTests/PerformanceScenarios.cs +++ b/src/GitVersion.Core.Tests/IntegrationTests/PerformanceScenarios.cs @@ -24,6 +24,8 @@ public void RepositoryWithALotOfTags() var sw = Stopwatch.StartNew(); fixture.AssertFullSemver($"1.0.{maxCommits}-feature.1+1", configuration); + sw.Stop(); + sw.ElapsedMilliseconds.ShouldBeLessThan(5000); } } diff --git a/src/GitVersion.Core.Tests/IntegrationTests/SupportBranchScenarios.cs b/src/GitVersion.Core.Tests/IntegrationTests/SupportBranchScenarios.cs index 8c41ca6f20..49f8f2bf73 100644 --- a/src/GitVersion.Core.Tests/IntegrationTests/SupportBranchScenarios.cs +++ b/src/GitVersion.Core.Tests/IntegrationTests/SupportBranchScenarios.cs @@ -79,7 +79,7 @@ public void WhenSupportIsBranchedFromMainWithSpecificTag() using var fixture = new EmptyRepositoryFixture(); fixture.MakeACommit(); - fixture.AssertFullSemver("0.0.1-1"); + fixture.AssertFullSemver("0.0.1-1", configuration); fixture.ApplyTag("1.4.0-rc"); fixture.MakeACommit(); diff --git a/src/GitVersion.Core.Tests/VersionCalculation/SemanticVersionTests.cs b/src/GitVersion.Core.Tests/VersionCalculation/SemanticVersionTests.cs index 92e5459afa..573f192c26 100644 --- a/src/GitVersion.Core.Tests/VersionCalculation/SemanticVersionTests.cs +++ b/src/GitVersion.Core.Tests/VersionCalculation/SemanticVersionTests.cs @@ -158,4 +158,1384 @@ private static SemanticVersion BuildSemVer(int major, int minor, int patch, stri BuildMetaData = buildMetaDate ?? SemanticVersionBuildMetaData.Empty }; } + + [TestCase("0.0.0", VersionField.None, null, ExpectedResult = "0.0.0-1")] + [TestCase("0.0.0", VersionField.Patch, null, ExpectedResult = "0.0.1-1")] + [TestCase("0.0.0", VersionField.Minor, null, ExpectedResult = "0.1.0-1")] + [TestCase("0.0.0", VersionField.Major, null, ExpectedResult = "1.0.0-1")] + [TestCase("0.0.0", VersionField.None, "", ExpectedResult = "0.0.0-1")] + [TestCase("0.0.0", VersionField.Patch, "", ExpectedResult = "0.0.1-1")] + [TestCase("0.0.0", VersionField.Minor, "", ExpectedResult = "0.1.0-1")] + [TestCase("0.0.0", VersionField.Major, "", ExpectedResult = "1.0.0-1")] + [TestCase("0.0.0", VersionField.None, "foo", ExpectedResult = "0.0.0-foo.1")] + [TestCase("0.0.0", VersionField.Patch, "foo", ExpectedResult = "0.0.1-foo.1")] + [TestCase("0.0.0", VersionField.Minor, "foo", ExpectedResult = "0.1.0-foo.1")] + [TestCase("0.0.0", VersionField.Major, "foo", ExpectedResult = "1.0.0-foo.1")] + + [TestCase("0.0.1", VersionField.None, null, ExpectedResult = "0.0.1-1")] + [TestCase("0.0.1", VersionField.Patch, null, ExpectedResult = "0.0.2-1")] + [TestCase("0.0.1", VersionField.Minor, null, ExpectedResult = "0.1.0-1")] + [TestCase("0.0.1", VersionField.Major, null, ExpectedResult = "1.0.0-1")] + [TestCase("0.0.1", VersionField.None, "", ExpectedResult = "0.0.1-1")] + [TestCase("0.0.1", VersionField.Patch, "", ExpectedResult = "0.0.2-1")] + [TestCase("0.0.1", VersionField.Minor, "", ExpectedResult = "0.1.0-1")] + [TestCase("0.0.1", VersionField.Major, "", ExpectedResult = "1.0.0-1")] + [TestCase("0.0.1", VersionField.None, "foo", ExpectedResult = "0.0.1-foo.1")] + [TestCase("0.0.1", VersionField.Patch, "foo", ExpectedResult = "0.0.2-foo.1")] + [TestCase("0.0.1", VersionField.Minor, "foo", ExpectedResult = "0.1.0-foo.1")] + [TestCase("0.0.1", VersionField.Major, "foo", ExpectedResult = "1.0.0-foo.1")] + + [TestCase("0.1.0", VersionField.None, null, ExpectedResult = "0.1.0-1")] + [TestCase("0.1.0", VersionField.Patch, null, ExpectedResult = "0.1.1-1")] + [TestCase("0.1.0", VersionField.Minor, null, ExpectedResult = "0.2.0-1")] + [TestCase("0.1.0", VersionField.Major, null, ExpectedResult = "1.0.0-1")] + [TestCase("0.1.0", VersionField.None, "", ExpectedResult = "0.1.0-1")] + [TestCase("0.1.0", VersionField.Patch, "", ExpectedResult = "0.1.1-1")] + [TestCase("0.1.0", VersionField.Minor, "", ExpectedResult = "0.2.0-1")] + [TestCase("0.1.0", VersionField.Major, "", ExpectedResult = "1.0.0-1")] + [TestCase("0.1.0", VersionField.None, "foo", ExpectedResult = "0.1.0-foo.1")] + [TestCase("0.1.0", VersionField.Patch, "foo", ExpectedResult = "0.1.1-foo.1")] + [TestCase("0.1.0", VersionField.Minor, "foo", ExpectedResult = "0.2.0-foo.1")] + [TestCase("0.1.0", VersionField.Major, "foo", ExpectedResult = "1.0.0-foo.1")] + + [TestCase("0.1.1", VersionField.None, null, ExpectedResult = "0.1.1-1")] + [TestCase("0.1.1", VersionField.Patch, null, ExpectedResult = "0.1.2-1")] + [TestCase("0.1.1", VersionField.Minor, null, ExpectedResult = "0.2.0-1")] + [TestCase("0.1.1", VersionField.Major, null, ExpectedResult = "1.0.0-1")] + [TestCase("0.1.1", VersionField.None, "", ExpectedResult = "0.1.1-1")] + [TestCase("0.1.1", VersionField.Patch, "", ExpectedResult = "0.1.2-1")] + [TestCase("0.1.1", VersionField.Minor, "", ExpectedResult = "0.2.0-1")] + [TestCase("0.1.1", VersionField.Major, "", ExpectedResult = "1.0.0-1")] + [TestCase("0.1.1", VersionField.None, "foo", ExpectedResult = "0.1.1-foo.1")] + [TestCase("0.1.1", VersionField.Patch, "foo", ExpectedResult = "0.1.2-foo.1")] + [TestCase("0.1.1", VersionField.Minor, "foo", ExpectedResult = "0.2.0-foo.1")] + [TestCase("0.1.1", VersionField.Major, "foo", ExpectedResult = "1.0.0-foo.1")] + + [TestCase("1.0.0", VersionField.None, null, ExpectedResult = "1.0.0-1")] + [TestCase("1.0.0", VersionField.Patch, null, ExpectedResult = "1.0.1-1")] + [TestCase("1.0.0", VersionField.Minor, null, ExpectedResult = "1.1.0-1")] + [TestCase("1.0.0", VersionField.Major, null, ExpectedResult = "2.0.0-1")] + [TestCase("1.0.0", VersionField.None, "", ExpectedResult = "1.0.0-1")] + [TestCase("1.0.0", VersionField.Patch, "", ExpectedResult = "1.0.1-1")] + [TestCase("1.0.0", VersionField.Minor, "", ExpectedResult = "1.1.0-1")] + [TestCase("1.0.0", VersionField.Major, "", ExpectedResult = "2.0.0-1")] + [TestCase("1.0.0", VersionField.None, "foo", ExpectedResult = "1.0.0-foo.1")] + [TestCase("1.0.0", VersionField.Patch, "foo", ExpectedResult = "1.0.1-foo.1")] + [TestCase("1.0.0", VersionField.Minor, "foo", ExpectedResult = "1.1.0-foo.1")] + [TestCase("1.0.0", VersionField.Major, "foo", ExpectedResult = "2.0.0-foo.1")] + + [TestCase("1.0.1", VersionField.None, null, ExpectedResult = "1.0.1-1")] + [TestCase("1.0.1", VersionField.Patch, null, ExpectedResult = "1.0.2-1")] + [TestCase("1.0.1", VersionField.Minor, null, ExpectedResult = "1.1.0-1")] + [TestCase("1.0.1", VersionField.Major, null, ExpectedResult = "2.0.0-1")] + [TestCase("1.0.1", VersionField.None, "", ExpectedResult = "1.0.1-1")] + [TestCase("1.0.1", VersionField.Patch, "", ExpectedResult = "1.0.2-1")] + [TestCase("1.0.1", VersionField.Minor, "", ExpectedResult = "1.1.0-1")] + [TestCase("1.0.1", VersionField.Major, "", ExpectedResult = "2.0.0-1")] + [TestCase("1.0.1", VersionField.None, "foo", ExpectedResult = "1.0.1-foo.1")] + [TestCase("1.0.1", VersionField.Patch, "foo", ExpectedResult = "1.0.2-foo.1")] + [TestCase("1.0.1", VersionField.Minor, "foo", ExpectedResult = "1.1.0-foo.1")] + [TestCase("1.0.1", VersionField.Major, "foo", ExpectedResult = "2.0.0-foo.1")] + + [TestCase("1.1.0", VersionField.None, null, ExpectedResult = "1.1.0-1")] + [TestCase("1.1.0", VersionField.Patch, null, ExpectedResult = "1.1.1-1")] + [TestCase("1.1.0", VersionField.Minor, null, ExpectedResult = "1.2.0-1")] + [TestCase("1.1.0", VersionField.Major, null, ExpectedResult = "2.0.0-1")] + [TestCase("1.1.0", VersionField.None, "", ExpectedResult = "1.1.0-1")] + [TestCase("1.1.0", VersionField.Patch, "", ExpectedResult = "1.1.1-1")] + [TestCase("1.1.0", VersionField.Minor, "", ExpectedResult = "1.2.0-1")] + [TestCase("1.1.0", VersionField.Major, "", ExpectedResult = "2.0.0-1")] + [TestCase("1.1.0", VersionField.None, "foo", ExpectedResult = "1.1.0-foo.1")] + [TestCase("1.1.0", VersionField.Patch, "foo", ExpectedResult = "1.1.1-foo.1")] + [TestCase("1.1.0", VersionField.Minor, "foo", ExpectedResult = "1.2.0-foo.1")] + [TestCase("1.1.0", VersionField.Major, "foo", ExpectedResult = "2.0.0-foo.1")] + + [TestCase("1.1.1", VersionField.None, null, ExpectedResult = "1.1.1-1")] + [TestCase("1.1.1", VersionField.Patch, null, ExpectedResult = "1.1.2-1")] + [TestCase("1.1.1", VersionField.Minor, null, ExpectedResult = "1.2.0-1")] + [TestCase("1.1.1", VersionField.Major, null, ExpectedResult = "2.0.0-1")] + [TestCase("1.1.1", VersionField.None, "", ExpectedResult = "1.1.1-1")] + [TestCase("1.1.1", VersionField.Patch, "", ExpectedResult = "1.1.2-1")] + [TestCase("1.1.1", VersionField.Minor, "", ExpectedResult = "1.2.0-1")] + [TestCase("1.1.1", VersionField.Major, "", ExpectedResult = "2.0.0-1")] + [TestCase("1.1.1", VersionField.None, "foo", ExpectedResult = "1.1.1-foo.1")] + [TestCase("1.1.1", VersionField.Patch, "foo", ExpectedResult = "1.1.2-foo.1")] + [TestCase("1.1.1", VersionField.Minor, "foo", ExpectedResult = "1.2.0-foo.1")] + [TestCase("1.1.1", VersionField.Major, "foo", ExpectedResult = "2.0.0-foo.1")] + public string WhenIncrementingVersion(string value, VersionField increment, string? label) + { + // Arrange + var semanticVersion = SemanticVersion.Parse(value, null); + + // Act + var result = semanticVersion.Increment(increment, label); + + // Assert + return result.ToString("i"); + } + + [TestCase("0.0.0", VersionField.None, null, ExpectedResult = "0.0.0-1")] + [TestCase("0.0.0", VersionField.Patch, null, ExpectedResult = "0.0.1-1")] + [TestCase("0.0.0", VersionField.Minor, null, ExpectedResult = "0.1.0-1")] + [TestCase("0.0.0", VersionField.Major, null, ExpectedResult = "1.0.0-1")] + [TestCase("0.0.0", VersionField.None, "", ExpectedResult = "0.0.0-1")] + [TestCase("0.0.0", VersionField.Patch, "", ExpectedResult = "0.0.1-1")] + [TestCase("0.0.0", VersionField.Minor, "", ExpectedResult = "0.1.0-1")] + [TestCase("0.0.0", VersionField.Major, "", ExpectedResult = "1.0.0-1")] + [TestCase("0.0.0", VersionField.None, "foo", ExpectedResult = "0.0.0-foo.1")] + [TestCase("0.0.0", VersionField.Patch, "foo", ExpectedResult = "0.0.1-foo.1")] + [TestCase("0.0.0", VersionField.Minor, "foo", ExpectedResult = "0.1.0-foo.1")] + [TestCase("0.0.0", VersionField.Major, "foo", ExpectedResult = "1.0.0-foo.1")] + + [TestCase("0.0.1", VersionField.None, null, ExpectedResult = "0.0.1-1")] + [TestCase("0.0.1", VersionField.Patch, null, ExpectedResult = "0.0.2-1")] + [TestCase("0.0.1", VersionField.Minor, null, ExpectedResult = "0.1.0-1")] + [TestCase("0.0.1", VersionField.Major, null, ExpectedResult = "1.0.0-1")] + [TestCase("0.0.1", VersionField.None, "", ExpectedResult = "0.0.1-1")] + [TestCase("0.0.1", VersionField.Patch, "", ExpectedResult = "0.0.2-1")] + [TestCase("0.0.1", VersionField.Minor, "", ExpectedResult = "0.1.0-1")] + [TestCase("0.0.1", VersionField.Major, "", ExpectedResult = "1.0.0-1")] + [TestCase("0.0.1", VersionField.None, "foo", ExpectedResult = "0.0.1-foo.1")] + [TestCase("0.0.1", VersionField.Patch, "foo", ExpectedResult = "0.0.2-foo.1")] + [TestCase("0.0.1", VersionField.Minor, "foo", ExpectedResult = "0.1.0-foo.1")] + [TestCase("0.0.1", VersionField.Major, "foo", ExpectedResult = "1.0.0-foo.1")] + + [TestCase("0.1.0", VersionField.None, null, ExpectedResult = "0.1.0-1")] + [TestCase("0.1.0", VersionField.Patch, null, ExpectedResult = "0.1.1-1")] + [TestCase("0.1.0", VersionField.Minor, null, ExpectedResult = "0.2.0-1")] + [TestCase("0.1.0", VersionField.Major, null, ExpectedResult = "1.0.0-1")] + [TestCase("0.1.0", VersionField.None, "", ExpectedResult = "0.1.0-1")] + [TestCase("0.1.0", VersionField.Patch, "", ExpectedResult = "0.1.1-1")] + [TestCase("0.1.0", VersionField.Minor, "", ExpectedResult = "0.2.0-1")] + [TestCase("0.1.0", VersionField.Major, "", ExpectedResult = "1.0.0-1")] + [TestCase("0.1.0", VersionField.None, "foo", ExpectedResult = "0.1.0-foo.1")] + [TestCase("0.1.0", VersionField.Patch, "foo", ExpectedResult = "0.1.1-foo.1")] + [TestCase("0.1.0", VersionField.Minor, "foo", ExpectedResult = "0.2.0-foo.1")] + [TestCase("0.1.0", VersionField.Major, "foo", ExpectedResult = "1.0.0-foo.1")] + + [TestCase("0.1.1", VersionField.None, null, ExpectedResult = "0.1.1-1")] + [TestCase("0.1.1", VersionField.Patch, null, ExpectedResult = "0.1.2-1")] + [TestCase("0.1.1", VersionField.Minor, null, ExpectedResult = "0.2.0-1")] + [TestCase("0.1.1", VersionField.Major, null, ExpectedResult = "1.0.0-1")] + [TestCase("0.1.1", VersionField.None, "", ExpectedResult = "0.1.1-1")] + [TestCase("0.1.1", VersionField.Patch, "", ExpectedResult = "0.1.2-1")] + [TestCase("0.1.1", VersionField.Minor, "", ExpectedResult = "0.2.0-1")] + [TestCase("0.1.1", VersionField.Major, "", ExpectedResult = "1.0.0-1")] + [TestCase("0.1.1", VersionField.None, "foo", ExpectedResult = "0.1.1-foo.1")] + [TestCase("0.1.1", VersionField.Patch, "foo", ExpectedResult = "0.1.2-foo.1")] + [TestCase("0.1.1", VersionField.Minor, "foo", ExpectedResult = "0.2.0-foo.1")] + [TestCase("0.1.1", VersionField.Major, "foo", ExpectedResult = "1.0.0-foo.1")] + + [TestCase("1.0.0", VersionField.None, null, ExpectedResult = "1.0.0-1")] + [TestCase("1.0.0", VersionField.Patch, null, ExpectedResult = "1.0.1-1")] + [TestCase("1.0.0", VersionField.Minor, null, ExpectedResult = "1.1.0-1")] + [TestCase("1.0.0", VersionField.Major, null, ExpectedResult = "2.0.0-1")] + [TestCase("1.0.0", VersionField.None, "", ExpectedResult = "1.0.0-1")] + [TestCase("1.0.0", VersionField.Patch, "", ExpectedResult = "1.0.1-1")] + [TestCase("1.0.0", VersionField.Minor, "", ExpectedResult = "1.1.0-1")] + [TestCase("1.0.0", VersionField.Major, "", ExpectedResult = "2.0.0-1")] + [TestCase("1.0.0", VersionField.None, "foo", ExpectedResult = "1.0.0-foo.1")] + [TestCase("1.0.0", VersionField.Patch, "foo", ExpectedResult = "1.0.1-foo.1")] + [TestCase("1.0.0", VersionField.Minor, "foo", ExpectedResult = "1.1.0-foo.1")] + [TestCase("1.0.0", VersionField.Major, "foo", ExpectedResult = "2.0.0-foo.1")] + + [TestCase("1.0.1", VersionField.None, null, ExpectedResult = "1.0.1-1")] + [TestCase("1.0.1", VersionField.Patch, null, ExpectedResult = "1.0.2-1")] + [TestCase("1.0.1", VersionField.Minor, null, ExpectedResult = "1.1.0-1")] + [TestCase("1.0.1", VersionField.Major, null, ExpectedResult = "2.0.0-1")] + [TestCase("1.0.1", VersionField.None, "", ExpectedResult = "1.0.1-1")] + [TestCase("1.0.1", VersionField.Patch, "", ExpectedResult = "1.0.2-1")] + [TestCase("1.0.1", VersionField.Minor, "", ExpectedResult = "1.1.0-1")] + [TestCase("1.0.1", VersionField.Major, "", ExpectedResult = "2.0.0-1")] + [TestCase("1.0.1", VersionField.None, "foo", ExpectedResult = "1.0.1-foo.1")] + [TestCase("1.0.1", VersionField.Patch, "foo", ExpectedResult = "1.0.2-foo.1")] + [TestCase("1.0.1", VersionField.Minor, "foo", ExpectedResult = "1.1.0-foo.1")] + [TestCase("1.0.1", VersionField.Major, "foo", ExpectedResult = "2.0.0-foo.1")] + + [TestCase("1.1.0", VersionField.None, null, ExpectedResult = "1.1.0-1")] + [TestCase("1.1.0", VersionField.Patch, null, ExpectedResult = "1.1.1-1")] + [TestCase("1.1.0", VersionField.Minor, null, ExpectedResult = "1.2.0-1")] + [TestCase("1.1.0", VersionField.Major, null, ExpectedResult = "2.0.0-1")] + [TestCase("1.1.0", VersionField.None, "", ExpectedResult = "1.1.0-1")] + [TestCase("1.1.0", VersionField.Patch, "", ExpectedResult = "1.1.1-1")] + [TestCase("1.1.0", VersionField.Minor, "", ExpectedResult = "1.2.0-1")] + [TestCase("1.1.0", VersionField.Major, "", ExpectedResult = "2.0.0-1")] + [TestCase("1.1.0", VersionField.None, "foo", ExpectedResult = "1.1.0-foo.1")] + [TestCase("1.1.0", VersionField.Patch, "foo", ExpectedResult = "1.1.1-foo.1")] + [TestCase("1.1.0", VersionField.Minor, "foo", ExpectedResult = "1.2.0-foo.1")] + [TestCase("1.1.0", VersionField.Major, "foo", ExpectedResult = "2.0.0-foo.1")] + + [TestCase("1.1.1", VersionField.None, null, ExpectedResult = "1.1.1-1")] + [TestCase("1.1.1", VersionField.Patch, null, ExpectedResult = "1.1.2-1")] + [TestCase("1.1.1", VersionField.Minor, null, ExpectedResult = "1.2.0-1")] + [TestCase("1.1.1", VersionField.Major, null, ExpectedResult = "2.0.0-1")] + [TestCase("1.1.1", VersionField.None, "", ExpectedResult = "1.1.1-1")] + [TestCase("1.1.1", VersionField.Patch, "", ExpectedResult = "1.1.2-1")] + [TestCase("1.1.1", VersionField.Minor, "", ExpectedResult = "1.2.0-1")] + [TestCase("1.1.1", VersionField.Major, "", ExpectedResult = "2.0.0-1")] + [TestCase("1.1.1", VersionField.None, "foo", ExpectedResult = "1.1.1-foo.1")] + [TestCase("1.1.1", VersionField.Patch, "foo", ExpectedResult = "1.1.2-foo.1")] + [TestCase("1.1.1", VersionField.Minor, "foo", ExpectedResult = "1.2.0-foo.1")] + [TestCase("1.1.1", VersionField.Major, "foo", ExpectedResult = "2.0.0-foo.1")] + public string WhenIncrementingVersionInModeEnsureIntegrity(string value, VersionField increment, string? label) + { + // Arrange + var semanticVersion = SemanticVersion.Parse(value, null); + + // Act + var result = semanticVersion.Increment(increment, label, SemanticVersion.IncrementMode.EnsureIntegrity); + + // Assert + return result.ToString("i"); + } + + [TestCase("0.0.0", VersionField.None, null, ExpectedResult = "0.0.0-1")] + [TestCase("0.0.0", VersionField.Patch, null, ExpectedResult = "0.0.1-1")] + [TestCase("0.0.0", VersionField.Minor, null, ExpectedResult = "0.1.0-1")] + [TestCase("0.0.0", VersionField.Major, null, ExpectedResult = "1.0.0-1")] + [TestCase("0.0.0", VersionField.None, "", ExpectedResult = "0.0.0-1")] + [TestCase("0.0.0", VersionField.Patch, "", ExpectedResult = "0.0.1-1")] + [TestCase("0.0.0", VersionField.Minor, "", ExpectedResult = "0.1.0-1")] + [TestCase("0.0.0", VersionField.Major, "", ExpectedResult = "1.0.0-1")] + [TestCase("0.0.0", VersionField.None, "foo", ExpectedResult = "0.0.0-foo.1")] + [TestCase("0.0.0", VersionField.Patch, "foo", ExpectedResult = "0.0.1-foo.1")] + [TestCase("0.0.0", VersionField.Minor, "foo", ExpectedResult = "0.1.0-foo.1")] + [TestCase("0.0.0", VersionField.Major, "foo", ExpectedResult = "1.0.0-foo.1")] + + [TestCase("0.0.1", VersionField.None, null, ExpectedResult = "0.0.1-1")] + [TestCase("0.0.1", VersionField.Patch, null, ExpectedResult = "0.0.2-1")] + [TestCase("0.0.1", VersionField.Minor, null, ExpectedResult = "0.1.0-1")] + [TestCase("0.0.1", VersionField.Major, null, ExpectedResult = "1.0.0-1")] + [TestCase("0.0.1", VersionField.None, "", ExpectedResult = "0.0.1-1")] + [TestCase("0.0.1", VersionField.Patch, "", ExpectedResult = "0.0.2-1")] + [TestCase("0.0.1", VersionField.Minor, "", ExpectedResult = "0.1.0-1")] + [TestCase("0.0.1", VersionField.Major, "", ExpectedResult = "1.0.0-1")] + [TestCase("0.0.1", VersionField.None, "foo", ExpectedResult = "0.0.1-foo.1")] + [TestCase("0.0.1", VersionField.Patch, "foo", ExpectedResult = "0.0.2-foo.1")] + [TestCase("0.0.1", VersionField.Minor, "foo", ExpectedResult = "0.1.0-foo.1")] + [TestCase("0.0.1", VersionField.Major, "foo", ExpectedResult = "1.0.0-foo.1")] + + [TestCase("0.1.0", VersionField.None, null, ExpectedResult = "0.1.0-1")] + [TestCase("0.1.0", VersionField.Patch, null, ExpectedResult = "0.1.1-1")] + [TestCase("0.1.0", VersionField.Minor, null, ExpectedResult = "0.2.0-1")] + [TestCase("0.1.0", VersionField.Major, null, ExpectedResult = "1.0.0-1")] + [TestCase("0.1.0", VersionField.None, "", ExpectedResult = "0.1.0-1")] + [TestCase("0.1.0", VersionField.Patch, "", ExpectedResult = "0.1.1-1")] + [TestCase("0.1.0", VersionField.Minor, "", ExpectedResult = "0.2.0-1")] + [TestCase("0.1.0", VersionField.Major, "", ExpectedResult = "1.0.0-1")] + [TestCase("0.1.0", VersionField.None, "foo", ExpectedResult = "0.1.0-foo.1")] + [TestCase("0.1.0", VersionField.Patch, "foo", ExpectedResult = "0.1.1-foo.1")] + [TestCase("0.1.0", VersionField.Minor, "foo", ExpectedResult = "0.2.0-foo.1")] + [TestCase("0.1.0", VersionField.Major, "foo", ExpectedResult = "1.0.0-foo.1")] + + [TestCase("0.1.1", VersionField.None, null, ExpectedResult = "0.1.1-1")] + [TestCase("0.1.1", VersionField.Patch, null, ExpectedResult = "0.1.2-1")] + [TestCase("0.1.1", VersionField.Minor, null, ExpectedResult = "0.2.0-1")] + [TestCase("0.1.1", VersionField.Major, null, ExpectedResult = "1.0.0-1")] + [TestCase("0.1.1", VersionField.None, "", ExpectedResult = "0.1.1-1")] + [TestCase("0.1.1", VersionField.Patch, "", ExpectedResult = "0.1.2-1")] + [TestCase("0.1.1", VersionField.Minor, "", ExpectedResult = "0.2.0-1")] + [TestCase("0.1.1", VersionField.Major, "", ExpectedResult = "1.0.0-1")] + [TestCase("0.1.1", VersionField.None, "foo", ExpectedResult = "0.1.1-foo.1")] + [TestCase("0.1.1", VersionField.Patch, "foo", ExpectedResult = "0.1.2-foo.1")] + [TestCase("0.1.1", VersionField.Minor, "foo", ExpectedResult = "0.2.0-foo.1")] + [TestCase("0.1.1", VersionField.Major, "foo", ExpectedResult = "1.0.0-foo.1")] + + [TestCase("1.0.0", VersionField.None, null, ExpectedResult = "1.0.0-1")] + [TestCase("1.0.0", VersionField.Patch, null, ExpectedResult = "1.0.1-1")] + [TestCase("1.0.0", VersionField.Minor, null, ExpectedResult = "1.1.0-1")] + [TestCase("1.0.0", VersionField.Major, null, ExpectedResult = "2.0.0-1")] + [TestCase("1.0.0", VersionField.None, "", ExpectedResult = "1.0.0-1")] + [TestCase("1.0.0", VersionField.Patch, "", ExpectedResult = "1.0.1-1")] + [TestCase("1.0.0", VersionField.Minor, "", ExpectedResult = "1.1.0-1")] + [TestCase("1.0.0", VersionField.Major, "", ExpectedResult = "2.0.0-1")] + [TestCase("1.0.0", VersionField.None, "foo", ExpectedResult = "1.0.0-foo.1")] + [TestCase("1.0.0", VersionField.Patch, "foo", ExpectedResult = "1.0.1-foo.1")] + [TestCase("1.0.0", VersionField.Minor, "foo", ExpectedResult = "1.1.0-foo.1")] + [TestCase("1.0.0", VersionField.Major, "foo", ExpectedResult = "2.0.0-foo.1")] + + [TestCase("1.0.1", VersionField.None, null, ExpectedResult = "1.0.1-1")] + [TestCase("1.0.1", VersionField.Patch, null, ExpectedResult = "1.0.2-1")] + [TestCase("1.0.1", VersionField.Minor, null, ExpectedResult = "1.1.0-1")] + [TestCase("1.0.1", VersionField.Major, null, ExpectedResult = "2.0.0-1")] + [TestCase("1.0.1", VersionField.None, "", ExpectedResult = "1.0.1-1")] + [TestCase("1.0.1", VersionField.Patch, "", ExpectedResult = "1.0.2-1")] + [TestCase("1.0.1", VersionField.Minor, "", ExpectedResult = "1.1.0-1")] + [TestCase("1.0.1", VersionField.Major, "", ExpectedResult = "2.0.0-1")] + [TestCase("1.0.1", VersionField.None, "foo", ExpectedResult = "1.0.1-foo.1")] + [TestCase("1.0.1", VersionField.Patch, "foo", ExpectedResult = "1.0.2-foo.1")] + [TestCase("1.0.1", VersionField.Minor, "foo", ExpectedResult = "1.1.0-foo.1")] + [TestCase("1.0.1", VersionField.Major, "foo", ExpectedResult = "2.0.0-foo.1")] + + [TestCase("1.1.0", VersionField.None, null, ExpectedResult = "1.1.0-1")] + [TestCase("1.1.0", VersionField.Patch, null, ExpectedResult = "1.1.1-1")] + [TestCase("1.1.0", VersionField.Minor, null, ExpectedResult = "1.2.0-1")] + [TestCase("1.1.0", VersionField.Major, null, ExpectedResult = "2.0.0-1")] + [TestCase("1.1.0", VersionField.None, "", ExpectedResult = "1.1.0-1")] + [TestCase("1.1.0", VersionField.Patch, "", ExpectedResult = "1.1.1-1")] + [TestCase("1.1.0", VersionField.Minor, "", ExpectedResult = "1.2.0-1")] + [TestCase("1.1.0", VersionField.Major, "", ExpectedResult = "2.0.0-1")] + [TestCase("1.1.0", VersionField.None, "foo", ExpectedResult = "1.1.0-foo.1")] + [TestCase("1.1.0", VersionField.Patch, "foo", ExpectedResult = "1.1.1-foo.1")] + [TestCase("1.1.0", VersionField.Minor, "foo", ExpectedResult = "1.2.0-foo.1")] + [TestCase("1.1.0", VersionField.Major, "foo", ExpectedResult = "2.0.0-foo.1")] + + [TestCase("1.1.1", VersionField.None, null, ExpectedResult = "1.1.1-1")] + [TestCase("1.1.1", VersionField.Patch, null, ExpectedResult = "1.1.2-1")] + [TestCase("1.1.1", VersionField.Minor, null, ExpectedResult = "1.2.0-1")] + [TestCase("1.1.1", VersionField.Major, null, ExpectedResult = "2.0.0-1")] + [TestCase("1.1.1", VersionField.None, "", ExpectedResult = "1.1.1-1")] + [TestCase("1.1.1", VersionField.Patch, "", ExpectedResult = "1.1.2-1")] + [TestCase("1.1.1", VersionField.Minor, "", ExpectedResult = "1.2.0-1")] + [TestCase("1.1.1", VersionField.Major, "", ExpectedResult = "2.0.0-1")] + [TestCase("1.1.1", VersionField.None, "foo", ExpectedResult = "1.1.1-foo.1")] + [TestCase("1.1.1", VersionField.Patch, "foo", ExpectedResult = "1.1.2-foo.1")] + [TestCase("1.1.1", VersionField.Minor, "foo", ExpectedResult = "1.2.0-foo.1")] + [TestCase("1.1.1", VersionField.Major, "foo", ExpectedResult = "2.0.0-foo.1")] + public string WhenIncrementingVersionInModeForce(string value, VersionField increment, string? label) + { + // Arrange + var semanticVersion = SemanticVersion.Parse(value, null); + + // Act + var result = semanticVersion.Increment(increment, label, SemanticVersion.IncrementMode.Force); + + // Assert + return result.ToString("i"); + } + + [TestCase("0.0.0-2", VersionField.None, null, ExpectedResult = "0.0.0-3")] + [TestCase("0.0.0-2", VersionField.Patch, null, ExpectedResult = "0.0.0-3")] + [TestCase("0.0.0-2", VersionField.Minor, null, ExpectedResult = "0.0.0-3")] + [TestCase("0.0.0-2", VersionField.Major, null, ExpectedResult = "0.0.0-3")] + [TestCase("0.0.0-2", VersionField.None, "", ExpectedResult = "0.0.0-3")] + [TestCase("0.0.0-2", VersionField.Patch, "", ExpectedResult = "0.0.0-3")] + [TestCase("0.0.0-2", VersionField.Minor, "", ExpectedResult = "0.0.0-3")] + [TestCase("0.0.0-2", VersionField.Major, "", ExpectedResult = "0.0.0-3")] + [TestCase("0.0.0-2", VersionField.None, "foo", ExpectedResult = "0.0.0-foo.1")] + [TestCase("0.0.0-2", VersionField.Patch, "foo", ExpectedResult = "0.0.0-foo.1")] + [TestCase("0.0.0-2", VersionField.Minor, "foo", ExpectedResult = "0.0.0-foo.1")] + [TestCase("0.0.0-2", VersionField.Major, "foo", ExpectedResult = "0.0.0-foo.1")] + + [TestCase("0.0.1-2", VersionField.None, null, ExpectedResult = "0.0.1-3")] + [TestCase("0.0.1-2", VersionField.Patch, null, ExpectedResult = "0.0.1-3")] + [TestCase("0.0.1-2", VersionField.Minor, null, ExpectedResult = "0.0.1-3")] + [TestCase("0.0.1-2", VersionField.Major, null, ExpectedResult = "0.0.1-3")] + [TestCase("0.0.1-2", VersionField.None, "", ExpectedResult = "0.0.1-3")] + [TestCase("0.0.1-2", VersionField.Patch, "", ExpectedResult = "0.0.1-3")] + [TestCase("0.0.1-2", VersionField.Minor, "", ExpectedResult = "0.0.1-3")] + [TestCase("0.0.1-2", VersionField.Major, "", ExpectedResult = "0.0.1-3")] + [TestCase("0.0.1-2", VersionField.None, "foo", ExpectedResult = "0.0.1-foo.1")] + [TestCase("0.0.1-2", VersionField.Patch, "foo", ExpectedResult = "0.0.1-foo.1")] + [TestCase("0.0.1-2", VersionField.Minor, "foo", ExpectedResult = "0.0.1-foo.1")] + [TestCase("0.0.1-2", VersionField.Major, "foo", ExpectedResult = "0.0.1-foo.1")] + + [TestCase("0.1.0-2", VersionField.None, null, ExpectedResult = "0.1.0-3")] + [TestCase("0.1.0-2", VersionField.Patch, null, ExpectedResult = "0.1.0-3")] + [TestCase("0.1.0-2", VersionField.Minor, null, ExpectedResult = "0.1.0-3")] + [TestCase("0.1.0-2", VersionField.Major, null, ExpectedResult = "0.1.0-3")] + [TestCase("0.1.0-2", VersionField.None, "", ExpectedResult = "0.1.0-3")] + [TestCase("0.1.0-2", VersionField.Patch, "", ExpectedResult = "0.1.0-3")] + [TestCase("0.1.0-2", VersionField.Minor, "", ExpectedResult = "0.1.0-3")] + [TestCase("0.1.0-2", VersionField.Major, "", ExpectedResult = "0.1.0-3")] + [TestCase("0.1.0-2", VersionField.None, "foo", ExpectedResult = "0.1.0-foo.1")] + [TestCase("0.1.0-2", VersionField.Patch, "foo", ExpectedResult = "0.1.0-foo.1")] + [TestCase("0.1.0-2", VersionField.Minor, "foo", ExpectedResult = "0.1.0-foo.1")] + [TestCase("0.1.0-2", VersionField.Major, "foo", ExpectedResult = "0.1.0-foo.1")] + + [TestCase("0.1.1-2", VersionField.None, null, ExpectedResult = "0.1.1-3")] + [TestCase("0.1.1-2", VersionField.Patch, null, ExpectedResult = "0.1.1-3")] + [TestCase("0.1.1-2", VersionField.Minor, null, ExpectedResult = "0.1.1-3")] + [TestCase("0.1.1-2", VersionField.Major, null, ExpectedResult = "0.1.1-3")] + [TestCase("0.1.1-2", VersionField.None, "", ExpectedResult = "0.1.1-3")] + [TestCase("0.1.1-2", VersionField.Patch, "", ExpectedResult = "0.1.1-3")] + [TestCase("0.1.1-2", VersionField.Minor, "", ExpectedResult = "0.1.1-3")] + [TestCase("0.1.1-2", VersionField.Major, "", ExpectedResult = "0.1.1-3")] + [TestCase("0.1.1-2", VersionField.None, "foo", ExpectedResult = "0.1.1-foo.1")] + [TestCase("0.1.1-2", VersionField.Patch, "foo", ExpectedResult = "0.1.1-foo.1")] + [TestCase("0.1.1-2", VersionField.Minor, "foo", ExpectedResult = "0.1.1-foo.1")] + [TestCase("0.1.1-2", VersionField.Major, "foo", ExpectedResult = "0.1.1-foo.1")] + + [TestCase("1.0.0-2", VersionField.None, null, ExpectedResult = "1.0.0-3")] + [TestCase("1.0.0-2", VersionField.Patch, null, ExpectedResult = "1.0.0-3")] + [TestCase("1.0.0-2", VersionField.Minor, null, ExpectedResult = "1.0.0-3")] + [TestCase("1.0.0-2", VersionField.Major, null, ExpectedResult = "1.0.0-3")] + [TestCase("1.0.0-2", VersionField.None, "", ExpectedResult = "1.0.0-3")] + [TestCase("1.0.0-2", VersionField.Patch, "", ExpectedResult = "1.0.0-3")] + [TestCase("1.0.0-2", VersionField.Minor, "", ExpectedResult = "1.0.0-3")] + [TestCase("1.0.0-2", VersionField.Major, "", ExpectedResult = "1.0.0-3")] + [TestCase("1.0.0-2", VersionField.None, "foo", ExpectedResult = "1.0.0-foo.1")] + [TestCase("1.0.0-2", VersionField.Patch, "foo", ExpectedResult = "1.0.0-foo.1")] + [TestCase("1.0.0-2", VersionField.Minor, "foo", ExpectedResult = "1.0.0-foo.1")] + [TestCase("1.0.0-2", VersionField.Major, "foo", ExpectedResult = "1.0.0-foo.1")] + + [TestCase("1.0.1-2", VersionField.None, null, ExpectedResult = "1.0.1-3")] + [TestCase("1.0.1-2", VersionField.Patch, null, ExpectedResult = "1.0.1-3")] + [TestCase("1.0.1-2", VersionField.Minor, null, ExpectedResult = "1.0.1-3")] + [TestCase("1.0.1-2", VersionField.Major, null, ExpectedResult = "1.0.1-3")] + [TestCase("1.0.1-2", VersionField.None, "", ExpectedResult = "1.0.1-3")] + [TestCase("1.0.1-2", VersionField.Patch, "", ExpectedResult = "1.0.1-3")] + [TestCase("1.0.1-2", VersionField.Minor, "", ExpectedResult = "1.0.1-3")] + [TestCase("1.0.1-2", VersionField.Major, "", ExpectedResult = "1.0.1-3")] + [TestCase("1.0.1-2", VersionField.None, "foo", ExpectedResult = "1.0.1-foo.1")] + [TestCase("1.0.1-2", VersionField.Patch, "foo", ExpectedResult = "1.0.1-foo.1")] + [TestCase("1.0.1-2", VersionField.Minor, "foo", ExpectedResult = "1.0.1-foo.1")] + [TestCase("1.0.1-2", VersionField.Major, "foo", ExpectedResult = "1.0.1-foo.1")] + + [TestCase("1.1.0-2", VersionField.None, null, ExpectedResult = "1.1.0-3")] + [TestCase("1.1.0-2", VersionField.Patch, null, ExpectedResult = "1.1.0-3")] + [TestCase("1.1.0-2", VersionField.Minor, null, ExpectedResult = "1.1.0-3")] + [TestCase("1.1.0-2", VersionField.Major, null, ExpectedResult = "1.1.0-3")] + [TestCase("1.1.0-2", VersionField.None, "", ExpectedResult = "1.1.0-3")] + [TestCase("1.1.0-2", VersionField.Patch, "", ExpectedResult = "1.1.0-3")] + [TestCase("1.1.0-2", VersionField.Minor, "", ExpectedResult = "1.1.0-3")] + [TestCase("1.1.0-2", VersionField.Major, "", ExpectedResult = "1.1.0-3")] + [TestCase("1.1.0-2", VersionField.None, "foo", ExpectedResult = "1.1.0-foo.1")] + [TestCase("1.1.0-2", VersionField.Patch, "foo", ExpectedResult = "1.1.0-foo.1")] + [TestCase("1.1.0-2", VersionField.Minor, "foo", ExpectedResult = "1.1.0-foo.1")] + [TestCase("1.1.0-2", VersionField.Major, "foo", ExpectedResult = "1.1.0-foo.1")] + + [TestCase("1.1.1-2", VersionField.None, null, ExpectedResult = "1.1.1-3")] + [TestCase("1.1.1-2", VersionField.Patch, null, ExpectedResult = "1.1.1-3")] + [TestCase("1.1.1-2", VersionField.Minor, null, ExpectedResult = "1.1.1-3")] + [TestCase("1.1.1-2", VersionField.Major, null, ExpectedResult = "1.1.1-3")] + [TestCase("1.1.1-2", VersionField.None, "", ExpectedResult = "1.1.1-3")] + [TestCase("1.1.1-2", VersionField.Patch, "", ExpectedResult = "1.1.1-3")] + [TestCase("1.1.1-2", VersionField.Minor, "", ExpectedResult = "1.1.1-3")] + [TestCase("1.1.1-2", VersionField.Major, "", ExpectedResult = "1.1.1-3")] + [TestCase("1.1.1-2", VersionField.None, "foo", ExpectedResult = "1.1.1-foo.1")] + [TestCase("1.1.1-2", VersionField.Patch, "foo", ExpectedResult = "1.1.1-foo.1")] + [TestCase("1.1.1-2", VersionField.Minor, "foo", ExpectedResult = "1.1.1-foo.1")] + [TestCase("1.1.1-2", VersionField.Major, "foo", ExpectedResult = "1.1.1-foo.1")] + public string WhenIncrementingPreReleaseVersion(string value, VersionField increment, string? label) + { + // Arrange + var semanticVersion = SemanticVersion.Parse(value, null); + + // Act + var result = semanticVersion.Increment(increment, label); + + // Assert + return result.ToString("i"); + } + + [TestCase("0.0.0-2", VersionField.None, null, ExpectedResult = "0.0.0-3")] + [TestCase("0.0.0-2", VersionField.Patch, null, ExpectedResult = "0.0.1-1")] + [TestCase("0.0.0-2", VersionField.Minor, null, ExpectedResult = "0.1.0-1")] + [TestCase("0.0.0-2", VersionField.Major, null, ExpectedResult = "1.0.0-1")] + [TestCase("0.0.0-2", VersionField.None, "", ExpectedResult = "0.0.0-3")] + [TestCase("0.0.0-2", VersionField.Patch, "", ExpectedResult = "0.0.1-1")] + [TestCase("0.0.0-2", VersionField.Minor, "", ExpectedResult = "0.1.0-1")] + [TestCase("0.0.0-2", VersionField.Major, "", ExpectedResult = "1.0.0-1")] + [TestCase("0.0.0-2", VersionField.None, "foo", ExpectedResult = "0.0.0-foo.1")] + [TestCase("0.0.0-2", VersionField.Patch, "foo", ExpectedResult = "0.0.1-foo.1")] + [TestCase("0.0.0-2", VersionField.Minor, "foo", ExpectedResult = "0.1.0-foo.1")] + [TestCase("0.0.0-2", VersionField.Major, "foo", ExpectedResult = "1.0.0-foo.1")] + + [TestCase("0.0.1-2", VersionField.None, null, ExpectedResult = "0.0.1-3")] + [TestCase("0.0.1-2", VersionField.Patch, null, ExpectedResult = "0.0.1-3")] + [TestCase("0.0.1-2", VersionField.Minor, null, ExpectedResult = "0.1.0-1")] + [TestCase("0.0.1-2", VersionField.Major, null, ExpectedResult = "1.0.0-1")] + [TestCase("0.0.1-2", VersionField.None, "", ExpectedResult = "0.0.1-3")] + [TestCase("0.0.1-2", VersionField.Patch, "", ExpectedResult = "0.0.1-3")] + [TestCase("0.0.1-2", VersionField.Minor, "", ExpectedResult = "0.1.0-1")] + [TestCase("0.0.1-2", VersionField.Major, "", ExpectedResult = "1.0.0-1")] + [TestCase("0.0.1-2", VersionField.None, "foo", ExpectedResult = "0.0.1-foo.1")] + [TestCase("0.0.1-2", VersionField.Patch, "foo", ExpectedResult = "0.0.1-foo.1")] + [TestCase("0.0.1-2", VersionField.Minor, "foo", ExpectedResult = "0.1.0-foo.1")] + [TestCase("0.0.1-2", VersionField.Major, "foo", ExpectedResult = "1.0.0-foo.1")] + + [TestCase("0.1.0-2", VersionField.None, null, ExpectedResult = "0.1.0-3")] + [TestCase("0.1.0-2", VersionField.Patch, null, ExpectedResult = "0.1.1-1")] + [TestCase("0.1.0-2", VersionField.Minor, null, ExpectedResult = "0.1.0-3")] + [TestCase("0.1.0-2", VersionField.Major, null, ExpectedResult = "1.0.0-1")] + [TestCase("0.1.0-2", VersionField.None, "", ExpectedResult = "0.1.0-3")] + [TestCase("0.1.0-2", VersionField.Patch, "", ExpectedResult = "0.1.1-1")] + [TestCase("0.1.0-2", VersionField.Minor, "", ExpectedResult = "0.1.0-3")] + [TestCase("0.1.0-2", VersionField.Major, "", ExpectedResult = "1.0.0-1")] + [TestCase("0.1.0-2", VersionField.None, "foo", ExpectedResult = "0.1.0-foo.1")] + [TestCase("0.1.0-2", VersionField.Patch, "foo", ExpectedResult = "0.1.1-foo.1")] + [TestCase("0.1.0-2", VersionField.Minor, "foo", ExpectedResult = "0.1.0-foo.1")] + [TestCase("0.1.0-2", VersionField.Major, "foo", ExpectedResult = "1.0.0-foo.1")] + + [TestCase("0.1.1-2", VersionField.None, null, ExpectedResult = "0.1.1-3")] + [TestCase("0.1.1-2", VersionField.Patch, null, ExpectedResult = "0.1.1-3")] + [TestCase("0.1.1-2", VersionField.Minor, null, ExpectedResult = "0.2.0-1")] + [TestCase("0.1.1-2", VersionField.Major, null, ExpectedResult = "1.0.0-1")] + [TestCase("0.1.1-2", VersionField.None, "", ExpectedResult = "0.1.1-3")] + [TestCase("0.1.1-2", VersionField.Patch, "", ExpectedResult = "0.1.1-3")] + [TestCase("0.1.1-2", VersionField.Minor, "", ExpectedResult = "0.2.0-1")] + [TestCase("0.1.1-2", VersionField.Major, "", ExpectedResult = "1.0.0-1")] + [TestCase("0.1.1-2", VersionField.None, "foo", ExpectedResult = "0.1.1-foo.1")] + [TestCase("0.1.1-2", VersionField.Patch, "foo", ExpectedResult = "0.1.1-foo.1")] + [TestCase("0.1.1-2", VersionField.Minor, "foo", ExpectedResult = "0.2.0-foo.1")] + [TestCase("0.1.1-2", VersionField.Major, "foo", ExpectedResult = "1.0.0-foo.1")] + + [TestCase("1.0.0-2", VersionField.None, null, ExpectedResult = "1.0.0-3")] + [TestCase("1.0.0-2", VersionField.Patch, null, ExpectedResult = "1.0.1-1")] + [TestCase("1.0.0-2", VersionField.Minor, null, ExpectedResult = "1.1.0-1")] + [TestCase("1.0.0-2", VersionField.Major, null, ExpectedResult = "1.0.0-3")] + [TestCase("1.0.0-2", VersionField.None, "", ExpectedResult = "1.0.0-3")] + [TestCase("1.0.0-2", VersionField.Patch, "", ExpectedResult = "1.0.1-1")] + [TestCase("1.0.0-2", VersionField.Minor, "", ExpectedResult = "1.1.0-1")] + [TestCase("1.0.0-2", VersionField.Major, "", ExpectedResult = "1.0.0-3")] + [TestCase("1.0.0-2", VersionField.None, "foo", ExpectedResult = "1.0.0-foo.1")] + [TestCase("1.0.0-2", VersionField.Patch, "foo", ExpectedResult = "1.0.1-foo.1")] + [TestCase("1.0.0-2", VersionField.Minor, "foo", ExpectedResult = "1.1.0-foo.1")] + [TestCase("1.0.0-2", VersionField.Major, "foo", ExpectedResult = "1.0.0-foo.1")] + + [TestCase("1.0.1-2", VersionField.None, null, ExpectedResult = "1.0.1-3")] + [TestCase("1.0.1-2", VersionField.Patch, null, ExpectedResult = "1.0.1-3")] + [TestCase("1.0.1-2", VersionField.Minor, null, ExpectedResult = "1.1.0-1")] + [TestCase("1.0.1-2", VersionField.Major, null, ExpectedResult = "2.0.0-1")] + [TestCase("1.0.1-2", VersionField.None, "", ExpectedResult = "1.0.1-3")] + [TestCase("1.0.1-2", VersionField.Patch, "", ExpectedResult = "1.0.1-3")] + [TestCase("1.0.1-2", VersionField.Minor, "", ExpectedResult = "1.1.0-1")] + [TestCase("1.0.1-2", VersionField.Major, "", ExpectedResult = "2.0.0-1")] + [TestCase("1.0.1-2", VersionField.None, "foo", ExpectedResult = "1.0.1-foo.1")] + [TestCase("1.0.1-2", VersionField.Patch, "foo", ExpectedResult = "1.0.1-foo.1")] + [TestCase("1.0.1-2", VersionField.Minor, "foo", ExpectedResult = "1.1.0-foo.1")] + [TestCase("1.0.1-2", VersionField.Major, "foo", ExpectedResult = "2.0.0-foo.1")] + + [TestCase("1.1.0-2", VersionField.None, null, ExpectedResult = "1.1.0-3")] + [TestCase("1.1.0-2", VersionField.Patch, null, ExpectedResult = "1.1.1-1")] + [TestCase("1.1.0-2", VersionField.Minor, null, ExpectedResult = "1.1.0-3")] + [TestCase("1.1.0-2", VersionField.Major, null, ExpectedResult = "2.0.0-1")] + [TestCase("1.1.0-2", VersionField.None, "", ExpectedResult = "1.1.0-3")] + [TestCase("1.1.0-2", VersionField.Patch, "", ExpectedResult = "1.1.1-1")] + [TestCase("1.1.0-2", VersionField.Minor, "", ExpectedResult = "1.1.0-3")] + [TestCase("1.1.0-2", VersionField.Major, "", ExpectedResult = "2.0.0-1")] + [TestCase("1.1.0-2", VersionField.None, "foo", ExpectedResult = "1.1.0-foo.1")] + [TestCase("1.1.0-2", VersionField.Patch, "foo", ExpectedResult = "1.1.1-foo.1")] + [TestCase("1.1.0-2", VersionField.Minor, "foo", ExpectedResult = "1.1.0-foo.1")] + [TestCase("1.1.0-2", VersionField.Major, "foo", ExpectedResult = "2.0.0-foo.1")] + + [TestCase("1.1.1-2", VersionField.None, null, ExpectedResult = "1.1.1-3")] + [TestCase("1.1.1-2", VersionField.Patch, null, ExpectedResult = "1.1.1-3")] + [TestCase("1.1.1-2", VersionField.Minor, null, ExpectedResult = "1.2.0-1")] + [TestCase("1.1.1-2", VersionField.Major, null, ExpectedResult = "2.0.0-1")] + [TestCase("1.1.1-2", VersionField.None, "", ExpectedResult = "1.1.1-3")] + [TestCase("1.1.1-2", VersionField.Patch, "", ExpectedResult = "1.1.1-3")] + [TestCase("1.1.1-2", VersionField.Minor, "", ExpectedResult = "1.2.0-1")] + [TestCase("1.1.1-2", VersionField.Major, "", ExpectedResult = "2.0.0-1")] + [TestCase("1.1.1-2", VersionField.None, "foo", ExpectedResult = "1.1.1-foo.1")] + [TestCase("1.1.1-2", VersionField.Patch, "foo", ExpectedResult = "1.1.1-foo.1")] + [TestCase("1.1.1-2", VersionField.Minor, "foo", ExpectedResult = "1.2.0-foo.1")] + [TestCase("1.1.1-2", VersionField.Major, "foo", ExpectedResult = "2.0.0-foo.1")] + public string WhenIncrementingPreReleaseVersionInModeEnsureIntegrity(string value, VersionField increment, string? label) + { + // Arrange + var semanticVersion = SemanticVersion.Parse(value, null); + + // Act + var result = semanticVersion.Increment(increment, label, SemanticVersion.IncrementMode.EnsureIntegrity); + + // Assert + return result.ToString("i"); + } + + [TestCase("0.0.0-2", VersionField.None, null, ExpectedResult = "0.0.0-3")] + [TestCase("0.0.0-2", VersionField.Patch, null, ExpectedResult = "0.0.1-1")] + [TestCase("0.0.0-2", VersionField.Minor, null, ExpectedResult = "0.1.0-1")] + [TestCase("0.0.0-2", VersionField.Major, null, ExpectedResult = "1.0.0-1")] + [TestCase("0.0.0-2", VersionField.None, "", ExpectedResult = "0.0.0-3")] + [TestCase("0.0.0-2", VersionField.Patch, "", ExpectedResult = "0.0.1-1")] + [TestCase("0.0.0-2", VersionField.Minor, "", ExpectedResult = "0.1.0-1")] + [TestCase("0.0.0-2", VersionField.Major, "", ExpectedResult = "1.0.0-1")] + [TestCase("0.0.0-2", VersionField.None, "foo", ExpectedResult = "0.0.0-foo.1")] + [TestCase("0.0.0-2", VersionField.Patch, "foo", ExpectedResult = "0.0.1-foo.1")] + [TestCase("0.0.0-2", VersionField.Minor, "foo", ExpectedResult = "0.1.0-foo.1")] + [TestCase("0.0.0-2", VersionField.Major, "foo", ExpectedResult = "1.0.0-foo.1")] + + [TestCase("0.0.1-2", VersionField.None, null, ExpectedResult = "0.0.1-3")] + [TestCase("0.0.1-2", VersionField.Patch, null, ExpectedResult = "0.0.2-1")] + [TestCase("0.0.1-2", VersionField.Minor, null, ExpectedResult = "0.1.0-1")] + [TestCase("0.0.1-2", VersionField.Major, null, ExpectedResult = "1.0.0-1")] + [TestCase("0.0.1-2", VersionField.None, "", ExpectedResult = "0.0.1-3")] + [TestCase("0.0.1-2", VersionField.Patch, "", ExpectedResult = "0.0.2-1")] + [TestCase("0.0.1-2", VersionField.Minor, "", ExpectedResult = "0.1.0-1")] + [TestCase("0.0.1-2", VersionField.Major, "", ExpectedResult = "1.0.0-1")] + [TestCase("0.0.1-2", VersionField.None, "foo", ExpectedResult = "0.0.1-foo.1")] + [TestCase("0.0.1-2", VersionField.Patch, "foo", ExpectedResult = "0.0.2-foo.1")] + [TestCase("0.0.1-2", VersionField.Minor, "foo", ExpectedResult = "0.1.0-foo.1")] + [TestCase("0.0.1-2", VersionField.Major, "foo", ExpectedResult = "1.0.0-foo.1")] + + [TestCase("0.1.0-2", VersionField.None, null, ExpectedResult = "0.1.0-3")] + [TestCase("0.1.0-2", VersionField.Patch, null, ExpectedResult = "0.1.1-1")] + [TestCase("0.1.0-2", VersionField.Minor, null, ExpectedResult = "0.2.0-1")] + [TestCase("0.1.0-2", VersionField.Major, null, ExpectedResult = "1.0.0-1")] + [TestCase("0.1.0-2", VersionField.None, "", ExpectedResult = "0.1.0-3")] + [TestCase("0.1.0-2", VersionField.Patch, "", ExpectedResult = "0.1.1-1")] + [TestCase("0.1.0-2", VersionField.Minor, "", ExpectedResult = "0.2.0-1")] + [TestCase("0.1.0-2", VersionField.Major, "", ExpectedResult = "1.0.0-1")] + [TestCase("0.1.0-2", VersionField.None, "foo", ExpectedResult = "0.1.0-foo.1")] + [TestCase("0.1.0-2", VersionField.Patch, "foo", ExpectedResult = "0.1.1-foo.1")] + [TestCase("0.1.0-2", VersionField.Minor, "foo", ExpectedResult = "0.2.0-foo.1")] + [TestCase("0.1.0-2", VersionField.Major, "foo", ExpectedResult = "1.0.0-foo.1")] + + [TestCase("0.1.1-2", VersionField.None, null, ExpectedResult = "0.1.1-3")] + [TestCase("0.1.1-2", VersionField.Patch, null, ExpectedResult = "0.1.2-1")] + [TestCase("0.1.1-2", VersionField.Minor, null, ExpectedResult = "0.2.0-1")] + [TestCase("0.1.1-2", VersionField.Major, null, ExpectedResult = "1.0.0-1")] + [TestCase("0.1.1-2", VersionField.None, "", ExpectedResult = "0.1.1-3")] + [TestCase("0.1.1-2", VersionField.Patch, "", ExpectedResult = "0.1.2-1")] + [TestCase("0.1.1-2", VersionField.Minor, "", ExpectedResult = "0.2.0-1")] + [TestCase("0.1.1-2", VersionField.Major, "", ExpectedResult = "1.0.0-1")] + [TestCase("0.1.1-2", VersionField.None, "foo", ExpectedResult = "0.1.1-foo.1")] + [TestCase("0.1.1-2", VersionField.Patch, "foo", ExpectedResult = "0.1.2-foo.1")] + [TestCase("0.1.1-2", VersionField.Minor, "foo", ExpectedResult = "0.2.0-foo.1")] + [TestCase("0.1.1-2", VersionField.Major, "foo", ExpectedResult = "1.0.0-foo.1")] + + [TestCase("1.0.0-2", VersionField.None, null, ExpectedResult = "1.0.0-3")] + [TestCase("1.0.0-2", VersionField.Patch, null, ExpectedResult = "1.0.1-1")] + [TestCase("1.0.0-2", VersionField.Minor, null, ExpectedResult = "1.1.0-1")] + [TestCase("1.0.0-2", VersionField.Major, null, ExpectedResult = "2.0.0-1")] + [TestCase("1.0.0-2", VersionField.None, "", ExpectedResult = "1.0.0-3")] + [TestCase("1.0.0-2", VersionField.Patch, "", ExpectedResult = "1.0.1-1")] + [TestCase("1.0.0-2", VersionField.Minor, "", ExpectedResult = "1.1.0-1")] + [TestCase("1.0.0-2", VersionField.Major, "", ExpectedResult = "2.0.0-1")] + [TestCase("1.0.0-2", VersionField.None, "foo", ExpectedResult = "1.0.0-foo.1")] + [TestCase("1.0.0-2", VersionField.Patch, "foo", ExpectedResult = "1.0.1-foo.1")] + [TestCase("1.0.0-2", VersionField.Minor, "foo", ExpectedResult = "1.1.0-foo.1")] + [TestCase("1.0.0-2", VersionField.Major, "foo", ExpectedResult = "2.0.0-foo.1")] + + [TestCase("1.0.1-2", VersionField.None, null, ExpectedResult = "1.0.1-3")] + [TestCase("1.0.1-2", VersionField.Patch, null, ExpectedResult = "1.0.2-1")] + [TestCase("1.0.1-2", VersionField.Minor, null, ExpectedResult = "1.1.0-1")] + [TestCase("1.0.1-2", VersionField.Major, null, ExpectedResult = "2.0.0-1")] + [TestCase("1.0.1-2", VersionField.None, "", ExpectedResult = "1.0.1-3")] + [TestCase("1.0.1-2", VersionField.Patch, "", ExpectedResult = "1.0.2-1")] + [TestCase("1.0.1-2", VersionField.Minor, "", ExpectedResult = "1.1.0-1")] + [TestCase("1.0.1-2", VersionField.Major, "", ExpectedResult = "2.0.0-1")] + [TestCase("1.0.1-2", VersionField.None, "foo", ExpectedResult = "1.0.1-foo.1")] + [TestCase("1.0.1-2", VersionField.Patch, "foo", ExpectedResult = "1.0.2-foo.1")] + [TestCase("1.0.1-2", VersionField.Minor, "foo", ExpectedResult = "1.1.0-foo.1")] + [TestCase("1.0.1-2", VersionField.Major, "foo", ExpectedResult = "2.0.0-foo.1")] + + [TestCase("1.1.0-2", VersionField.None, null, ExpectedResult = "1.1.0-3")] + [TestCase("1.1.0-2", VersionField.Patch, null, ExpectedResult = "1.1.1-1")] + [TestCase("1.1.0-2", VersionField.Minor, null, ExpectedResult = "1.2.0-1")] + [TestCase("1.1.0-2", VersionField.Major, null, ExpectedResult = "2.0.0-1")] + [TestCase("1.1.0-2", VersionField.None, "", ExpectedResult = "1.1.0-3")] + [TestCase("1.1.0-2", VersionField.Patch, "", ExpectedResult = "1.1.1-1")] + [TestCase("1.1.0-2", VersionField.Minor, "", ExpectedResult = "1.2.0-1")] + [TestCase("1.1.0-2", VersionField.Major, "", ExpectedResult = "2.0.0-1")] + [TestCase("1.1.0-2", VersionField.None, "foo", ExpectedResult = "1.1.0-foo.1")] + [TestCase("1.1.0-2", VersionField.Patch, "foo", ExpectedResult = "1.1.1-foo.1")] + [TestCase("1.1.0-2", VersionField.Minor, "foo", ExpectedResult = "1.2.0-foo.1")] + [TestCase("1.1.0-2", VersionField.Major, "foo", ExpectedResult = "2.0.0-foo.1")] + + [TestCase("1.1.1-2", VersionField.None, null, ExpectedResult = "1.1.1-3")] + [TestCase("1.1.1-2", VersionField.Patch, null, ExpectedResult = "1.1.2-1")] + [TestCase("1.1.1-2", VersionField.Minor, null, ExpectedResult = "1.2.0-1")] + [TestCase("1.1.1-2", VersionField.Major, null, ExpectedResult = "2.0.0-1")] + [TestCase("1.1.1-2", VersionField.None, "", ExpectedResult = "1.1.1-3")] + [TestCase("1.1.1-2", VersionField.Patch, "", ExpectedResult = "1.1.2-1")] + [TestCase("1.1.1-2", VersionField.Minor, "", ExpectedResult = "1.2.0-1")] + [TestCase("1.1.1-2", VersionField.Major, "", ExpectedResult = "2.0.0-1")] + [TestCase("1.1.1-2", VersionField.None, "foo", ExpectedResult = "1.1.1-foo.1")] + [TestCase("1.1.1-2", VersionField.Patch, "foo", ExpectedResult = "1.1.2-foo.1")] + [TestCase("1.1.1-2", VersionField.Minor, "foo", ExpectedResult = "1.2.0-foo.1")] + [TestCase("1.1.1-2", VersionField.Major, "foo", ExpectedResult = "2.0.0-foo.1")] + public string WhenIncrementingPreReleaseVersionInModeForce(string value, VersionField increment, string? label) + { + // Arrange + var semanticVersion = SemanticVersion.Parse(value, null); + + // Act + var result = semanticVersion.Increment(increment, label, SemanticVersion.IncrementMode.Force); + + // Assert + return result.ToString("i"); + } + + [TestCase("0.0.0-foo.2", VersionField.None, null, ExpectedResult = "0.0.0-foo.3")] + [TestCase("0.0.0-foo.2", VersionField.Patch, null, ExpectedResult = "0.0.0-foo.3")] + [TestCase("0.0.0-foo.2", VersionField.Minor, null, ExpectedResult = "0.0.0-foo.3")] + [TestCase("0.0.0-foo.2", VersionField.Major, null, ExpectedResult = "0.0.0-foo.3")] + [TestCase("0.0.0-foo.2", VersionField.None, "", ExpectedResult = "0.0.0-1")] + [TestCase("0.0.0-foo.2", VersionField.Patch, "", ExpectedResult = "0.0.0-1")] + [TestCase("0.0.0-foo.2", VersionField.Minor, "", ExpectedResult = "0.0.0-1")] + [TestCase("0.0.0-foo.2", VersionField.Major, "", ExpectedResult = "0.0.0-1")] + [TestCase("0.0.0-foo.2", VersionField.None, "foo", ExpectedResult = "0.0.0-foo.3")] + [TestCase("0.0.0-foo.2", VersionField.Patch, "foo", ExpectedResult = "0.0.0-foo.3")] + [TestCase("0.0.0-foo.2", VersionField.Minor, "foo", ExpectedResult = "0.0.0-foo.3")] + [TestCase("0.0.0-foo.2", VersionField.Major, "foo", ExpectedResult = "0.0.0-foo.3")] + + [TestCase("0.0.1-foo.2", VersionField.None, null, ExpectedResult = "0.0.1-foo.3")] + [TestCase("0.0.1-foo.2", VersionField.Patch, null, ExpectedResult = "0.0.1-foo.3")] + [TestCase("0.0.1-foo.2", VersionField.Minor, null, ExpectedResult = "0.0.1-foo.3")] + [TestCase("0.0.1-foo.2", VersionField.Major, null, ExpectedResult = "0.0.1-foo.3")] + [TestCase("0.0.1-foo.2", VersionField.None, "", ExpectedResult = "0.0.1-1")] + [TestCase("0.0.1-foo.2", VersionField.Patch, "", ExpectedResult = "0.0.1-1")] + [TestCase("0.0.1-foo.2", VersionField.Minor, "", ExpectedResult = "0.0.1-1")] + [TestCase("0.0.1-foo.2", VersionField.Major, "", ExpectedResult = "0.0.1-1")] + [TestCase("0.0.1-foo.2", VersionField.None, "foo", ExpectedResult = "0.0.1-foo.3")] + [TestCase("0.0.1-foo.2", VersionField.Patch, "foo", ExpectedResult = "0.0.1-foo.3")] + [TestCase("0.0.1-foo.2", VersionField.Minor, "foo", ExpectedResult = "0.0.1-foo.3")] + [TestCase("0.0.1-foo.2", VersionField.Major, "foo", ExpectedResult = "0.0.1-foo.3")] + + [TestCase("0.1.0-foo.2", VersionField.None, null, ExpectedResult = "0.1.0-foo.3")] + [TestCase("0.1.0-foo.2", VersionField.Patch, null, ExpectedResult = "0.1.0-foo.3")] + [TestCase("0.1.0-foo.2", VersionField.Minor, null, ExpectedResult = "0.1.0-foo.3")] + [TestCase("0.1.0-foo.2", VersionField.Major, null, ExpectedResult = "0.1.0-foo.3")] + [TestCase("0.1.0-foo.2", VersionField.None, "", ExpectedResult = "0.1.0-1")] + [TestCase("0.1.0-foo.2", VersionField.Patch, "", ExpectedResult = "0.1.0-1")] + [TestCase("0.1.0-foo.2", VersionField.Minor, "", ExpectedResult = "0.1.0-1")] + [TestCase("0.1.0-foo.2", VersionField.Major, "", ExpectedResult = "0.1.0-1")] + [TestCase("0.1.0-foo.2", VersionField.None, "foo", ExpectedResult = "0.1.0-foo.3")] + [TestCase("0.1.0-foo.2", VersionField.Patch, "foo", ExpectedResult = "0.1.0-foo.3")] + [TestCase("0.1.0-foo.2", VersionField.Minor, "foo", ExpectedResult = "0.1.0-foo.3")] + [TestCase("0.1.0-foo.2", VersionField.Major, "foo", ExpectedResult = "0.1.0-foo.3")] + + [TestCase("0.1.1-foo.2", VersionField.None, null, ExpectedResult = "0.1.1-foo.3")] + [TestCase("0.1.1-foo.2", VersionField.Patch, null, ExpectedResult = "0.1.1-foo.3")] + [TestCase("0.1.1-foo.2", VersionField.Minor, null, ExpectedResult = "0.1.1-foo.3")] + [TestCase("0.1.1-foo.2", VersionField.Major, null, ExpectedResult = "0.1.1-foo.3")] + [TestCase("0.1.1-foo.2", VersionField.None, "", ExpectedResult = "0.1.1-1")] + [TestCase("0.1.1-foo.2", VersionField.Patch, "", ExpectedResult = "0.1.1-1")] + [TestCase("0.1.1-foo.2", VersionField.Minor, "", ExpectedResult = "0.1.1-1")] + [TestCase("0.1.1-foo.2", VersionField.Major, "", ExpectedResult = "0.1.1-1")] + [TestCase("0.1.1-foo.2", VersionField.None, "foo", ExpectedResult = "0.1.1-foo.3")] + [TestCase("0.1.1-foo.2", VersionField.Patch, "foo", ExpectedResult = "0.1.1-foo.3")] + [TestCase("0.1.1-foo.2", VersionField.Minor, "foo", ExpectedResult = "0.1.1-foo.3")] + [TestCase("0.1.1-foo.2", VersionField.Major, "foo", ExpectedResult = "0.1.1-foo.3")] + + [TestCase("1.0.0-foo.2", VersionField.None, null, ExpectedResult = "1.0.0-foo.3")] + [TestCase("1.0.0-foo.2", VersionField.Patch, null, ExpectedResult = "1.0.0-foo.3")] + [TestCase("1.0.0-foo.2", VersionField.Minor, null, ExpectedResult = "1.0.0-foo.3")] + [TestCase("1.0.0-foo.2", VersionField.Major, null, ExpectedResult = "1.0.0-foo.3")] + [TestCase("1.0.0-foo.2", VersionField.None, "", ExpectedResult = "1.0.0-1")] + [TestCase("1.0.0-foo.2", VersionField.Patch, "", ExpectedResult = "1.0.0-1")] + [TestCase("1.0.0-foo.2", VersionField.Minor, "", ExpectedResult = "1.0.0-1")] + [TestCase("1.0.0-foo.2", VersionField.Major, "", ExpectedResult = "1.0.0-1")] + [TestCase("1.0.0-foo.2", VersionField.None, "foo", ExpectedResult = "1.0.0-foo.3")] + [TestCase("1.0.0-foo.2", VersionField.Patch, "foo", ExpectedResult = "1.0.0-foo.3")] + [TestCase("1.0.0-foo.2", VersionField.Minor, "foo", ExpectedResult = "1.0.0-foo.3")] + [TestCase("1.0.0-foo.2", VersionField.Major, "foo", ExpectedResult = "1.0.0-foo.3")] + + [TestCase("1.0.1-foo.2", VersionField.None, null, ExpectedResult = "1.0.1-foo.3")] + [TestCase("1.0.1-foo.2", VersionField.Patch, null, ExpectedResult = "1.0.1-foo.3")] + [TestCase("1.0.1-foo.2", VersionField.Minor, null, ExpectedResult = "1.0.1-foo.3")] + [TestCase("1.0.1-foo.2", VersionField.Major, null, ExpectedResult = "1.0.1-foo.3")] + [TestCase("1.0.1-foo.2", VersionField.None, "", ExpectedResult = "1.0.1-1")] + [TestCase("1.0.1-foo.2", VersionField.Patch, "", ExpectedResult = "1.0.1-1")] + [TestCase("1.0.1-foo.2", VersionField.Minor, "", ExpectedResult = "1.0.1-1")] + [TestCase("1.0.1-foo.2", VersionField.Major, "", ExpectedResult = "1.0.1-1")] + [TestCase("1.0.1-foo.2", VersionField.None, "foo", ExpectedResult = "1.0.1-foo.3")] + [TestCase("1.0.1-foo.2", VersionField.Patch, "foo", ExpectedResult = "1.0.1-foo.3")] + [TestCase("1.0.1-foo.2", VersionField.Minor, "foo", ExpectedResult = "1.0.1-foo.3")] + [TestCase("1.0.1-foo.2", VersionField.Major, "foo", ExpectedResult = "1.0.1-foo.3")] + + [TestCase("1.1.0-foo.2", VersionField.None, null, ExpectedResult = "1.1.0-foo.3")] + [TestCase("1.1.0-foo.2", VersionField.Patch, null, ExpectedResult = "1.1.0-foo.3")] + [TestCase("1.1.0-foo.2", VersionField.Minor, null, ExpectedResult = "1.1.0-foo.3")] + [TestCase("1.1.0-foo.2", VersionField.Major, null, ExpectedResult = "1.1.0-foo.3")] + [TestCase("1.1.0-foo.2", VersionField.None, "", ExpectedResult = "1.1.0-1")] + [TestCase("1.1.0-foo.2", VersionField.Patch, "", ExpectedResult = "1.1.0-1")] + [TestCase("1.1.0-foo.2", VersionField.Minor, "", ExpectedResult = "1.1.0-1")] + [TestCase("1.1.0-foo.2", VersionField.Major, "", ExpectedResult = "1.1.0-1")] + [TestCase("1.1.0-foo.2", VersionField.None, "foo", ExpectedResult = "1.1.0-foo.3")] + [TestCase("1.1.0-foo.2", VersionField.Patch, "foo", ExpectedResult = "1.1.0-foo.3")] + [TestCase("1.1.0-foo.2", VersionField.Minor, "foo", ExpectedResult = "1.1.0-foo.3")] + [TestCase("1.1.0-foo.2", VersionField.Major, "foo", ExpectedResult = "1.1.0-foo.3")] + + [TestCase("1.1.1-foo.2", VersionField.None, null, ExpectedResult = "1.1.1-foo.3")] + [TestCase("1.1.1-foo.2", VersionField.Patch, null, ExpectedResult = "1.1.1-foo.3")] + [TestCase("1.1.1-foo.2", VersionField.Minor, null, ExpectedResult = "1.1.1-foo.3")] + [TestCase("1.1.1-foo.2", VersionField.Major, null, ExpectedResult = "1.1.1-foo.3")] + [TestCase("1.1.1-foo.2", VersionField.None, "", ExpectedResult = "1.1.1-1")] + [TestCase("1.1.1-foo.2", VersionField.Patch, "", ExpectedResult = "1.1.1-1")] + [TestCase("1.1.1-foo.2", VersionField.Minor, "", ExpectedResult = "1.1.1-1")] + [TestCase("1.1.1-foo.2", VersionField.Major, "", ExpectedResult = "1.1.1-1")] + [TestCase("1.1.1-foo.2", VersionField.None, "foo", ExpectedResult = "1.1.1-foo.3")] + [TestCase("1.1.1-foo.2", VersionField.Patch, "foo", ExpectedResult = "1.1.1-foo.3")] + [TestCase("1.1.1-foo.2", VersionField.Minor, "foo", ExpectedResult = "1.1.1-foo.3")] + [TestCase("1.1.1-foo.2", VersionField.Major, "foo", ExpectedResult = "1.1.1-foo.3")] + public string WhenIncrementingPreReleaseVersionFoo(string value, VersionField increment, string? label) + { + // Arrange + var semanticVersion = SemanticVersion.Parse(value, null); + + // Act + var result = semanticVersion.Increment(increment, label); + + // Assert + return result.ToString("i"); + } + + [TestCase("0.0.0-foo.2", VersionField.None, null, ExpectedResult = "0.0.0-foo.3")] + [TestCase("0.0.0-foo.2", VersionField.Patch, null, ExpectedResult = "0.0.1-foo.1")] + [TestCase("0.0.0-foo.2", VersionField.Minor, null, ExpectedResult = "0.1.0-foo.1")] + [TestCase("0.0.0-foo.2", VersionField.Major, null, ExpectedResult = "1.0.0-foo.1")] + [TestCase("0.0.0-foo.2", VersionField.None, "", ExpectedResult = "0.0.0-1")] + [TestCase("0.0.0-foo.2", VersionField.Patch, "", ExpectedResult = "0.0.1-1")] + [TestCase("0.0.0-foo.2", VersionField.Minor, "", ExpectedResult = "0.1.0-1")] + [TestCase("0.0.0-foo.2", VersionField.Major, "", ExpectedResult = "1.0.0-1")] + [TestCase("0.0.0-foo.2", VersionField.None, "foo", ExpectedResult = "0.0.0-foo.3")] + [TestCase("0.0.0-foo.2", VersionField.Patch, "foo", ExpectedResult = "0.0.1-foo.1")] + [TestCase("0.0.0-foo.2", VersionField.Minor, "foo", ExpectedResult = "0.1.0-foo.1")] + [TestCase("0.0.0-foo.2", VersionField.Major, "foo", ExpectedResult = "1.0.0-foo.1")] + + [TestCase("0.0.1-foo.2", VersionField.None, null, ExpectedResult = "0.0.1-foo.3")] + [TestCase("0.0.1-foo.2", VersionField.Patch, null, ExpectedResult = "0.0.1-foo.3")] + [TestCase("0.0.1-foo.2", VersionField.Minor, null, ExpectedResult = "0.1.0-foo.1")] + [TestCase("0.0.1-foo.2", VersionField.Major, null, ExpectedResult = "1.0.0-foo.1")] + [TestCase("0.0.1-foo.2", VersionField.None, "", ExpectedResult = "0.0.1-1")] + [TestCase("0.0.1-foo.2", VersionField.Patch, "", ExpectedResult = "0.0.1-1")] + [TestCase("0.0.1-foo.2", VersionField.Minor, "", ExpectedResult = "0.1.0-1")] + [TestCase("0.0.1-foo.2", VersionField.Major, "", ExpectedResult = "1.0.0-1")] + [TestCase("0.0.1-foo.2", VersionField.None, "foo", ExpectedResult = "0.0.1-foo.3")] + [TestCase("0.0.1-foo.2", VersionField.Patch, "foo", ExpectedResult = "0.0.1-foo.3")] + [TestCase("0.0.1-foo.2", VersionField.Minor, "foo", ExpectedResult = "0.1.0-foo.1")] + [TestCase("0.0.1-foo.2", VersionField.Major, "foo", ExpectedResult = "1.0.0-foo.1")] + + [TestCase("0.1.0-foo.2", VersionField.None, null, ExpectedResult = "0.1.0-foo.3")] + [TestCase("0.1.0-foo.2", VersionField.Patch, null, ExpectedResult = "0.1.1-foo.1")] + [TestCase("0.1.0-foo.2", VersionField.Minor, null, ExpectedResult = "0.1.0-foo.3")] + [TestCase("0.1.0-foo.2", VersionField.Major, null, ExpectedResult = "1.0.0-foo.1")] + [TestCase("0.1.0-foo.2", VersionField.None, "", ExpectedResult = "0.1.0-1")] + [TestCase("0.1.0-foo.2", VersionField.Patch, "", ExpectedResult = "0.1.1-1")] + [TestCase("0.1.0-foo.2", VersionField.Minor, "", ExpectedResult = "0.1.0-1")] + [TestCase("0.1.0-foo.2", VersionField.Major, "", ExpectedResult = "1.0.0-1")] + [TestCase("0.1.0-foo.2", VersionField.None, "foo", ExpectedResult = "0.1.0-foo.3")] + [TestCase("0.1.0-foo.2", VersionField.Patch, "foo", ExpectedResult = "0.1.1-foo.1")] + [TestCase("0.1.0-foo.2", VersionField.Minor, "foo", ExpectedResult = "0.1.0-foo.3")] + [TestCase("0.1.0-foo.2", VersionField.Major, "foo", ExpectedResult = "1.0.0-foo.1")] + + [TestCase("0.1.1-foo.2", VersionField.None, null, ExpectedResult = "0.1.1-foo.3")] + [TestCase("0.1.1-foo.2", VersionField.Patch, null, ExpectedResult = "0.1.1-foo.3")] + [TestCase("0.1.1-foo.2", VersionField.Minor, null, ExpectedResult = "0.2.0-foo.1")] + [TestCase("0.1.1-foo.2", VersionField.Major, null, ExpectedResult = "1.0.0-foo.1")] + [TestCase("0.1.1-foo.2", VersionField.None, "", ExpectedResult = "0.1.1-1")] + [TestCase("0.1.1-foo.2", VersionField.Patch, "", ExpectedResult = "0.1.1-1")] + [TestCase("0.1.1-foo.2", VersionField.Minor, "", ExpectedResult = "0.2.0-1")] + [TestCase("0.1.1-foo.2", VersionField.Major, "", ExpectedResult = "1.0.0-1")] + [TestCase("0.1.1-foo.2", VersionField.None, "foo", ExpectedResult = "0.1.1-foo.3")] + [TestCase("0.1.1-foo.2", VersionField.Patch, "foo", ExpectedResult = "0.1.1-foo.3")] + [TestCase("0.1.1-foo.2", VersionField.Minor, "foo", ExpectedResult = "0.2.0-foo.1")] + [TestCase("0.1.1-foo.2", VersionField.Major, "foo", ExpectedResult = "1.0.0-foo.1")] + + [TestCase("1.0.0-foo.2", VersionField.None, null, ExpectedResult = "1.0.0-foo.3")] + [TestCase("1.0.0-foo.2", VersionField.Patch, null, ExpectedResult = "1.0.1-foo.1")] + [TestCase("1.0.0-foo.2", VersionField.Minor, null, ExpectedResult = "1.1.0-foo.1")] + [TestCase("1.0.0-foo.2", VersionField.Major, null, ExpectedResult = "1.0.0-foo.3")] + [TestCase("1.0.0-foo.2", VersionField.None, "", ExpectedResult = "1.0.0-1")] + [TestCase("1.0.0-foo.2", VersionField.Patch, "", ExpectedResult = "1.0.1-1")] + [TestCase("1.0.0-foo.2", VersionField.Minor, "", ExpectedResult = "1.1.0-1")] + [TestCase("1.0.0-foo.2", VersionField.Major, "", ExpectedResult = "1.0.0-1")] + [TestCase("1.0.0-foo.2", VersionField.None, "foo", ExpectedResult = "1.0.0-foo.3")] + [TestCase("1.0.0-foo.2", VersionField.Patch, "foo", ExpectedResult = "1.0.1-foo.1")] + [TestCase("1.0.0-foo.2", VersionField.Minor, "foo", ExpectedResult = "1.1.0-foo.1")] + [TestCase("1.0.0-foo.2", VersionField.Major, "foo", ExpectedResult = "1.0.0-foo.3")] + + [TestCase("1.0.1-foo.2", VersionField.None, null, ExpectedResult = "1.0.1-foo.3")] + [TestCase("1.0.1-foo.2", VersionField.Patch, null, ExpectedResult = "1.0.1-foo.3")] + [TestCase("1.0.1-foo.2", VersionField.Minor, null, ExpectedResult = "1.1.0-foo.1")] + [TestCase("1.0.1-foo.2", VersionField.Major, null, ExpectedResult = "2.0.0-foo.1")] + [TestCase("1.0.1-foo.2", VersionField.None, "", ExpectedResult = "1.0.1-1")] + [TestCase("1.0.1-foo.2", VersionField.Patch, "", ExpectedResult = "1.0.1-1")] + [TestCase("1.0.1-foo.2", VersionField.Minor, "", ExpectedResult = "1.1.0-1")] + [TestCase("1.0.1-foo.2", VersionField.Major, "", ExpectedResult = "2.0.0-1")] + [TestCase("1.0.1-foo.2", VersionField.None, "foo", ExpectedResult = "1.0.1-foo.3")] + [TestCase("1.0.1-foo.2", VersionField.Patch, "foo", ExpectedResult = "1.0.1-foo.3")] + [TestCase("1.0.1-foo.2", VersionField.Minor, "foo", ExpectedResult = "1.1.0-foo.1")] + [TestCase("1.0.1-foo.2", VersionField.Major, "foo", ExpectedResult = "2.0.0-foo.1")] + + [TestCase("1.1.0-foo.2", VersionField.None, null, ExpectedResult = "1.1.0-foo.3")] + [TestCase("1.1.0-foo.2", VersionField.Patch, null, ExpectedResult = "1.1.1-foo.1")] + [TestCase("1.1.0-foo.2", VersionField.Minor, null, ExpectedResult = "1.1.0-foo.3")] + [TestCase("1.1.0-foo.2", VersionField.Major, null, ExpectedResult = "2.0.0-foo.1")] + [TestCase("1.1.0-foo.2", VersionField.None, "", ExpectedResult = "1.1.0-1")] + [TestCase("1.1.0-foo.2", VersionField.Patch, "", ExpectedResult = "1.1.1-1")] + [TestCase("1.1.0-foo.2", VersionField.Minor, "", ExpectedResult = "1.1.0-1")] + [TestCase("1.1.0-foo.2", VersionField.Major, "", ExpectedResult = "2.0.0-1")] + [TestCase("1.1.0-foo.2", VersionField.None, "foo", ExpectedResult = "1.1.0-foo.3")] + [TestCase("1.1.0-foo.2", VersionField.Patch, "foo", ExpectedResult = "1.1.1-foo.1")] + [TestCase("1.1.0-foo.2", VersionField.Minor, "foo", ExpectedResult = "1.1.0-foo.3")] + [TestCase("1.1.0-foo.2", VersionField.Major, "foo", ExpectedResult = "2.0.0-foo.1")] + + [TestCase("1.1.1-foo.2", VersionField.None, null, ExpectedResult = "1.1.1-foo.3")] + [TestCase("1.1.1-foo.2", VersionField.Patch, null, ExpectedResult = "1.1.1-foo.3")] + [TestCase("1.1.1-foo.2", VersionField.Minor, null, ExpectedResult = "1.2.0-foo.1")] + [TestCase("1.1.1-foo.2", VersionField.Major, null, ExpectedResult = "2.0.0-foo.1")] + [TestCase("1.1.1-foo.2", VersionField.None, "", ExpectedResult = "1.1.1-1")] + [TestCase("1.1.1-foo.2", VersionField.Patch, "", ExpectedResult = "1.1.1-1")] + [TestCase("1.1.1-foo.2", VersionField.Minor, "", ExpectedResult = "1.2.0-1")] + [TestCase("1.1.1-foo.2", VersionField.Major, "", ExpectedResult = "2.0.0-1")] + [TestCase("1.1.1-foo.2", VersionField.None, "foo", ExpectedResult = "1.1.1-foo.3")] + [TestCase("1.1.1-foo.2", VersionField.Patch, "foo", ExpectedResult = "1.1.1-foo.3")] + [TestCase("1.1.1-foo.2", VersionField.Minor, "foo", ExpectedResult = "1.2.0-foo.1")] + [TestCase("1.1.1-foo.2", VersionField.Major, "foo", ExpectedResult = "2.0.0-foo.1")] + public string WhenIncrementingPreReleaseVersionFooInModeEnsureIntegrity(string value, VersionField increment, string? label) + { + // Arrange + var semanticVersion = SemanticVersion.Parse(value, null); + + // Act + var result = semanticVersion.Increment(increment, label, SemanticVersion.IncrementMode.EnsureIntegrity); + + // Assert + return result.ToString("i"); + } + + [TestCase("0.0.0-foo.2", VersionField.None, null, ExpectedResult = "0.0.0-foo.3")] + [TestCase("0.0.0-foo.2", VersionField.Patch, null, ExpectedResult = "0.0.1-foo.1")] + [TestCase("0.0.0-foo.2", VersionField.Minor, null, ExpectedResult = "0.1.0-foo.1")] + [TestCase("0.0.0-foo.2", VersionField.Major, null, ExpectedResult = "1.0.0-foo.1")] + [TestCase("0.0.0-foo.2", VersionField.None, "", ExpectedResult = "0.0.0-1")] + [TestCase("0.0.0-foo.2", VersionField.Patch, "", ExpectedResult = "0.0.1-1")] + [TestCase("0.0.0-foo.2", VersionField.Minor, "", ExpectedResult = "0.1.0-1")] + [TestCase("0.0.0-foo.2", VersionField.Major, "", ExpectedResult = "1.0.0-1")] + [TestCase("0.0.0-foo.2", VersionField.None, "foo", ExpectedResult = "0.0.0-foo.3")] + [TestCase("0.0.0-foo.2", VersionField.Patch, "foo", ExpectedResult = "0.0.1-foo.1")] + [TestCase("0.0.0-foo.2", VersionField.Minor, "foo", ExpectedResult = "0.1.0-foo.1")] + [TestCase("0.0.0-foo.2", VersionField.Major, "foo", ExpectedResult = "1.0.0-foo.1")] + + [TestCase("0.0.1-foo.2", VersionField.None, null, ExpectedResult = "0.0.1-foo.3")] + [TestCase("0.0.1-foo.2", VersionField.Patch, null, ExpectedResult = "0.0.2-foo.1")] + [TestCase("0.0.1-foo.2", VersionField.Minor, null, ExpectedResult = "0.1.0-foo.1")] + [TestCase("0.0.1-foo.2", VersionField.Major, null, ExpectedResult = "1.0.0-foo.1")] + [TestCase("0.0.1-foo.2", VersionField.None, "", ExpectedResult = "0.0.1-1")] + [TestCase("0.0.1-foo.2", VersionField.Patch, "", ExpectedResult = "0.0.2-1")] + [TestCase("0.0.1-foo.2", VersionField.Minor, "", ExpectedResult = "0.1.0-1")] + [TestCase("0.0.1-foo.2", VersionField.Major, "", ExpectedResult = "1.0.0-1")] + [TestCase("0.0.1-foo.2", VersionField.None, "foo", ExpectedResult = "0.0.1-foo.3")] + [TestCase("0.0.1-foo.2", VersionField.Patch, "foo", ExpectedResult = "0.0.2-foo.1")] + [TestCase("0.0.1-foo.2", VersionField.Minor, "foo", ExpectedResult = "0.1.0-foo.1")] + [TestCase("0.0.1-foo.2", VersionField.Major, "foo", ExpectedResult = "1.0.0-foo.1")] + + [TestCase("0.1.0-foo.2", VersionField.None, null, ExpectedResult = "0.1.0-foo.3")] + [TestCase("0.1.0-foo.2", VersionField.Patch, null, ExpectedResult = "0.1.1-foo.1")] + [TestCase("0.1.0-foo.2", VersionField.Minor, null, ExpectedResult = "0.2.0-foo.1")] + [TestCase("0.1.0-foo.2", VersionField.Major, null, ExpectedResult = "1.0.0-foo.1")] + [TestCase("0.1.0-foo.2", VersionField.None, "", ExpectedResult = "0.1.0-1")] + [TestCase("0.1.0-foo.2", VersionField.Patch, "", ExpectedResult = "0.1.1-1")] + [TestCase("0.1.0-foo.2", VersionField.Minor, "", ExpectedResult = "0.2.0-1")] + [TestCase("0.1.0-foo.2", VersionField.Major, "", ExpectedResult = "1.0.0-1")] + [TestCase("0.1.0-foo.2", VersionField.None, "foo", ExpectedResult = "0.1.0-foo.3")] + [TestCase("0.1.0-foo.2", VersionField.Patch, "foo", ExpectedResult = "0.1.1-foo.1")] + [TestCase("0.1.0-foo.2", VersionField.Minor, "foo", ExpectedResult = "0.2.0-foo.1")] + [TestCase("0.1.0-foo.2", VersionField.Major, "foo", ExpectedResult = "1.0.0-foo.1")] + + [TestCase("0.1.1-foo.2", VersionField.None, null, ExpectedResult = "0.1.1-foo.3")] + [TestCase("0.1.1-foo.2", VersionField.Patch, null, ExpectedResult = "0.1.2-foo.1")] + [TestCase("0.1.1-foo.2", VersionField.Minor, null, ExpectedResult = "0.2.0-foo.1")] + [TestCase("0.1.1-foo.2", VersionField.Major, null, ExpectedResult = "1.0.0-foo.1")] + [TestCase("0.1.1-foo.2", VersionField.None, "", ExpectedResult = "0.1.1-1")] + [TestCase("0.1.1-foo.2", VersionField.Patch, "", ExpectedResult = "0.1.2-1")] + [TestCase("0.1.1-foo.2", VersionField.Minor, "", ExpectedResult = "0.2.0-1")] + [TestCase("0.1.1-foo.2", VersionField.Major, "", ExpectedResult = "1.0.0-1")] + [TestCase("0.1.1-foo.2", VersionField.None, "foo", ExpectedResult = "0.1.1-foo.3")] + [TestCase("0.1.1-foo.2", VersionField.Patch, "foo", ExpectedResult = "0.1.2-foo.1")] + [TestCase("0.1.1-foo.2", VersionField.Minor, "foo", ExpectedResult = "0.2.0-foo.1")] + [TestCase("0.1.1-foo.2", VersionField.Major, "foo", ExpectedResult = "1.0.0-foo.1")] + + [TestCase("1.0.0-foo.2", VersionField.None, null, ExpectedResult = "1.0.0-foo.3")] + [TestCase("1.0.0-foo.2", VersionField.Patch, null, ExpectedResult = "1.0.1-foo.1")] + [TestCase("1.0.0-foo.2", VersionField.Minor, null, ExpectedResult = "1.1.0-foo.1")] + [TestCase("1.0.0-foo.2", VersionField.Major, null, ExpectedResult = "2.0.0-foo.1")] + [TestCase("1.0.0-foo.2", VersionField.None, "", ExpectedResult = "1.0.0-1")] + [TestCase("1.0.0-foo.2", VersionField.Patch, "", ExpectedResult = "1.0.1-1")] + [TestCase("1.0.0-foo.2", VersionField.Minor, "", ExpectedResult = "1.1.0-1")] + [TestCase("1.0.0-foo.2", VersionField.Major, "", ExpectedResult = "2.0.0-1")] + [TestCase("1.0.0-foo.2", VersionField.None, "foo", ExpectedResult = "1.0.0-foo.3")] + [TestCase("1.0.0-foo.2", VersionField.Patch, "foo", ExpectedResult = "1.0.1-foo.1")] + [TestCase("1.0.0-foo.2", VersionField.Minor, "foo", ExpectedResult = "1.1.0-foo.1")] + [TestCase("1.0.0-foo.2", VersionField.Major, "foo", ExpectedResult = "2.0.0-foo.1")] + + [TestCase("1.0.1-foo.2", VersionField.None, null, ExpectedResult = "1.0.1-foo.3")] + [TestCase("1.0.1-foo.2", VersionField.Patch, null, ExpectedResult = "1.0.2-foo.1")] + [TestCase("1.0.1-foo.2", VersionField.Minor, null, ExpectedResult = "1.1.0-foo.1")] + [TestCase("1.0.1-foo.2", VersionField.Major, null, ExpectedResult = "2.0.0-foo.1")] + [TestCase("1.0.1-foo.2", VersionField.None, "", ExpectedResult = "1.0.1-1")] + [TestCase("1.0.1-foo.2", VersionField.Patch, "", ExpectedResult = "1.0.2-1")] + [TestCase("1.0.1-foo.2", VersionField.Minor, "", ExpectedResult = "1.1.0-1")] + [TestCase("1.0.1-foo.2", VersionField.Major, "", ExpectedResult = "2.0.0-1")] + [TestCase("1.0.1-foo.2", VersionField.None, "foo", ExpectedResult = "1.0.1-foo.3")] + [TestCase("1.0.1-foo.2", VersionField.Patch, "foo", ExpectedResult = "1.0.2-foo.1")] + [TestCase("1.0.1-foo.2", VersionField.Minor, "foo", ExpectedResult = "1.1.0-foo.1")] + [TestCase("1.0.1-foo.2", VersionField.Major, "foo", ExpectedResult = "2.0.0-foo.1")] + + [TestCase("1.1.0-foo.2", VersionField.None, null, ExpectedResult = "1.1.0-foo.3")] + [TestCase("1.1.0-foo.2", VersionField.Patch, null, ExpectedResult = "1.1.1-foo.1")] + [TestCase("1.1.0-foo.2", VersionField.Minor, null, ExpectedResult = "1.2.0-foo.1")] + [TestCase("1.1.0-foo.2", VersionField.Major, null, ExpectedResult = "2.0.0-foo.1")] + [TestCase("1.1.0-foo.2", VersionField.None, "", ExpectedResult = "1.1.0-1")] + [TestCase("1.1.0-foo.2", VersionField.Patch, "", ExpectedResult = "1.1.1-1")] + [TestCase("1.1.0-foo.2", VersionField.Minor, "", ExpectedResult = "1.2.0-1")] + [TestCase("1.1.0-foo.2", VersionField.Major, "", ExpectedResult = "2.0.0-1")] + [TestCase("1.1.0-foo.2", VersionField.None, "foo", ExpectedResult = "1.1.0-foo.3")] + [TestCase("1.1.0-foo.2", VersionField.Patch, "foo", ExpectedResult = "1.1.1-foo.1")] + [TestCase("1.1.0-foo.2", VersionField.Minor, "foo", ExpectedResult = "1.2.0-foo.1")] + [TestCase("1.1.0-foo.2", VersionField.Major, "foo", ExpectedResult = "2.0.0-foo.1")] + + [TestCase("1.1.1-foo.2", VersionField.None, null, ExpectedResult = "1.1.1-foo.3")] + [TestCase("1.1.1-foo.2", VersionField.Patch, null, ExpectedResult = "1.1.2-foo.1")] + [TestCase("1.1.1-foo.2", VersionField.Minor, null, ExpectedResult = "1.2.0-foo.1")] + [TestCase("1.1.1-foo.2", VersionField.Major, null, ExpectedResult = "2.0.0-foo.1")] + [TestCase("1.1.1-foo.2", VersionField.None, "", ExpectedResult = "1.1.1-1")] + [TestCase("1.1.1-foo.2", VersionField.Patch, "", ExpectedResult = "1.1.2-1")] + [TestCase("1.1.1-foo.2", VersionField.Minor, "", ExpectedResult = "1.2.0-1")] + [TestCase("1.1.1-foo.2", VersionField.Major, "", ExpectedResult = "2.0.0-1")] + [TestCase("1.1.1-foo.2", VersionField.None, "foo", ExpectedResult = "1.1.1-foo.3")] + [TestCase("1.1.1-foo.2", VersionField.Patch, "foo", ExpectedResult = "1.1.2-foo.1")] + [TestCase("1.1.1-foo.2", VersionField.Minor, "foo", ExpectedResult = "1.2.0-foo.1")] + [TestCase("1.1.1-foo.2", VersionField.Major, "foo", ExpectedResult = "2.0.0-foo.1")] + public string WhenIncrementingPreReleaseVersionFooInModeForce(string value, VersionField increment, string? label) + { + // Arrange + var semanticVersion = SemanticVersion.Parse(value, null); + + // Act + var result = semanticVersion.Increment(increment, label, SemanticVersion.IncrementMode.Force); + + // Assert + return result.ToString("i"); + } + + [TestCase("0.0.0-bar", VersionField.None, null, ExpectedResult = "0.0.0-bar")] + [TestCase("0.0.0-bar", VersionField.Patch, null, ExpectedResult = "0.0.0-bar")] + [TestCase("0.0.0-bar", VersionField.Minor, null, ExpectedResult = "0.0.0-bar")] + [TestCase("0.0.0-bar", VersionField.Major, null, ExpectedResult = "0.0.0-bar")] + [TestCase("0.0.0-bar", VersionField.None, "", ExpectedResult = "0.0.0-1")] + [TestCase("0.0.0-bar", VersionField.Patch, "", ExpectedResult = "0.0.0-1")] + [TestCase("0.0.0-bar", VersionField.Minor, "", ExpectedResult = "0.0.0-1")] + [TestCase("0.0.0-bar", VersionField.Major, "", ExpectedResult = "0.0.0-1")] + [TestCase("0.0.0-bar", VersionField.None, "bar", ExpectedResult = "0.0.0-bar")] + [TestCase("0.0.0-bar", VersionField.Patch, "bar", ExpectedResult = "0.0.0-bar")] + [TestCase("0.0.0-bar", VersionField.Minor, "bar", ExpectedResult = "0.0.0-bar")] + [TestCase("0.0.0-bar", VersionField.Major, "bar", ExpectedResult = "0.0.0-bar")] + + [TestCase("0.0.1-bar", VersionField.None, null, ExpectedResult = "0.0.1-bar")] + [TestCase("0.0.1-bar", VersionField.Patch, null, ExpectedResult = "0.0.1-bar")] + [TestCase("0.0.1-bar", VersionField.Minor, null, ExpectedResult = "0.0.1-bar")] + [TestCase("0.0.1-bar", VersionField.Major, null, ExpectedResult = "0.0.1-bar")] + [TestCase("0.0.1-bar", VersionField.None, "", ExpectedResult = "0.0.1-1")] + [TestCase("0.0.1-bar", VersionField.Patch, "", ExpectedResult = "0.0.1-1")] + [TestCase("0.0.1-bar", VersionField.Minor, "", ExpectedResult = "0.0.1-1")] + [TestCase("0.0.1-bar", VersionField.Major, "", ExpectedResult = "0.0.1-1")] + [TestCase("0.0.1-bar", VersionField.None, "bar", ExpectedResult = "0.0.1-bar")] + [TestCase("0.0.1-bar", VersionField.Patch, "bar", ExpectedResult = "0.0.1-bar")] + [TestCase("0.0.1-bar", VersionField.Minor, "bar", ExpectedResult = "0.0.1-bar")] + [TestCase("0.0.1-bar", VersionField.Major, "bar", ExpectedResult = "0.0.1-bar")] + + [TestCase("0.1.0-bar", VersionField.None, null, ExpectedResult = "0.1.0-bar")] + [TestCase("0.1.0-bar", VersionField.Patch, null, ExpectedResult = "0.1.0-bar")] + [TestCase("0.1.0-bar", VersionField.Minor, null, ExpectedResult = "0.1.0-bar")] + [TestCase("0.1.0-bar", VersionField.Major, null, ExpectedResult = "0.1.0-bar")] + [TestCase("0.1.0-bar", VersionField.None, "", ExpectedResult = "0.1.0-1")] + [TestCase("0.1.0-bar", VersionField.Patch, "", ExpectedResult = "0.1.0-1")] + [TestCase("0.1.0-bar", VersionField.Minor, "", ExpectedResult = "0.1.0-1")] + [TestCase("0.1.0-bar", VersionField.Major, "", ExpectedResult = "0.1.0-1")] + [TestCase("0.1.0-bar", VersionField.None, "bar", ExpectedResult = "0.1.0-bar")] + [TestCase("0.1.0-bar", VersionField.Patch, "bar", ExpectedResult = "0.1.0-bar")] + [TestCase("0.1.0-bar", VersionField.Minor, "bar", ExpectedResult = "0.1.0-bar")] + [TestCase("0.1.0-bar", VersionField.Major, "bar", ExpectedResult = "0.1.0-bar")] + + [TestCase("0.1.1-bar", VersionField.None, null, ExpectedResult = "0.1.1-bar")] + [TestCase("0.1.1-bar", VersionField.Patch, null, ExpectedResult = "0.1.1-bar")] + [TestCase("0.1.1-bar", VersionField.Minor, null, ExpectedResult = "0.1.1-bar")] + [TestCase("0.1.1-bar", VersionField.Major, null, ExpectedResult = "0.1.1-bar")] + [TestCase("0.1.1-bar", VersionField.None, "", ExpectedResult = "0.1.1-1")] + [TestCase("0.1.1-bar", VersionField.Patch, "", ExpectedResult = "0.1.1-1")] + [TestCase("0.1.1-bar", VersionField.Minor, "", ExpectedResult = "0.1.1-1")] + [TestCase("0.1.1-bar", VersionField.Major, "", ExpectedResult = "0.1.1-1")] + [TestCase("0.1.1-bar", VersionField.None, "bar", ExpectedResult = "0.1.1-bar")] + [TestCase("0.1.1-bar", VersionField.Patch, "bar", ExpectedResult = "0.1.1-bar")] + [TestCase("0.1.1-bar", VersionField.Minor, "bar", ExpectedResult = "0.1.1-bar")] + [TestCase("0.1.1-bar", VersionField.Major, "bar", ExpectedResult = "0.1.1-bar")] + + [TestCase("1.0.0-bar", VersionField.None, null, ExpectedResult = "1.0.0-bar")] + [TestCase("1.0.0-bar", VersionField.Patch, null, ExpectedResult = "1.0.0-bar")] + [TestCase("1.0.0-bar", VersionField.Minor, null, ExpectedResult = "1.0.0-bar")] + [TestCase("1.0.0-bar", VersionField.Major, null, ExpectedResult = "1.0.0-bar")] + [TestCase("1.0.0-bar", VersionField.None, "", ExpectedResult = "1.0.0-1")] + [TestCase("1.0.0-bar", VersionField.Patch, "", ExpectedResult = "1.0.0-1")] + [TestCase("1.0.0-bar", VersionField.Minor, "", ExpectedResult = "1.0.0-1")] + [TestCase("1.0.0-bar", VersionField.Major, "", ExpectedResult = "1.0.0-1")] + [TestCase("1.0.0-bar", VersionField.None, "bar", ExpectedResult = "1.0.0-bar")] + [TestCase("1.0.0-bar", VersionField.Patch, "bar", ExpectedResult = "1.0.0-bar")] + [TestCase("1.0.0-bar", VersionField.Minor, "bar", ExpectedResult = "1.0.0-bar")] + [TestCase("1.0.0-bar", VersionField.Major, "bar", ExpectedResult = "1.0.0-bar")] + + [TestCase("1.0.1-bar", VersionField.None, null, ExpectedResult = "1.0.1-bar")] + [TestCase("1.0.1-bar", VersionField.Patch, null, ExpectedResult = "1.0.1-bar")] + [TestCase("1.0.1-bar", VersionField.Minor, null, ExpectedResult = "1.0.1-bar")] + [TestCase("1.0.1-bar", VersionField.Major, null, ExpectedResult = "1.0.1-bar")] + [TestCase("1.0.1-bar", VersionField.None, "", ExpectedResult = "1.0.1-1")] + [TestCase("1.0.1-bar", VersionField.Patch, "", ExpectedResult = "1.0.1-1")] + [TestCase("1.0.1-bar", VersionField.Minor, "", ExpectedResult = "1.0.1-1")] + [TestCase("1.0.1-bar", VersionField.Major, "", ExpectedResult = "1.0.1-1")] + [TestCase("1.0.1-bar", VersionField.None, "bar", ExpectedResult = "1.0.1-bar")] + [TestCase("1.0.1-bar", VersionField.Patch, "bar", ExpectedResult = "1.0.1-bar")] + [TestCase("1.0.1-bar", VersionField.Minor, "bar", ExpectedResult = "1.0.1-bar")] + [TestCase("1.0.1-bar", VersionField.Major, "bar", ExpectedResult = "1.0.1-bar")] + + [TestCase("1.1.0-bar", VersionField.None, null, ExpectedResult = "1.1.0-bar")] + [TestCase("1.1.0-bar", VersionField.Patch, null, ExpectedResult = "1.1.0-bar")] + [TestCase("1.1.0-bar", VersionField.Minor, null, ExpectedResult = "1.1.0-bar")] + [TestCase("1.1.0-bar", VersionField.Major, null, ExpectedResult = "1.1.0-bar")] + [TestCase("1.1.0-bar", VersionField.None, "", ExpectedResult = "1.1.0-1")] + [TestCase("1.1.0-bar", VersionField.Patch, "", ExpectedResult = "1.1.0-1")] + [TestCase("1.1.0-bar", VersionField.Minor, "", ExpectedResult = "1.1.0-1")] + [TestCase("1.1.0-bar", VersionField.Major, "", ExpectedResult = "1.1.0-1")] + [TestCase("1.1.0-bar", VersionField.None, "bar", ExpectedResult = "1.1.0-bar")] + [TestCase("1.1.0-bar", VersionField.Patch, "bar", ExpectedResult = "1.1.0-bar")] + [TestCase("1.1.0-bar", VersionField.Minor, "bar", ExpectedResult = "1.1.0-bar")] + [TestCase("1.1.0-bar", VersionField.Major, "bar", ExpectedResult = "1.1.0-bar")] + + [TestCase("1.1.1-bar", VersionField.None, null, ExpectedResult = "1.1.1-bar")] + [TestCase("1.1.1-bar", VersionField.Patch, null, ExpectedResult = "1.1.1-bar")] + [TestCase("1.1.1-bar", VersionField.Minor, null, ExpectedResult = "1.1.1-bar")] + [TestCase("1.1.1-bar", VersionField.Major, null, ExpectedResult = "1.1.1-bar")] + [TestCase("1.1.1-bar", VersionField.None, "", ExpectedResult = "1.1.1-1")] + [TestCase("1.1.1-bar", VersionField.Patch, "", ExpectedResult = "1.1.1-1")] + [TestCase("1.1.1-bar", VersionField.Minor, "", ExpectedResult = "1.1.1-1")] + [TestCase("1.1.1-bar", VersionField.Major, "", ExpectedResult = "1.1.1-1")] + [TestCase("1.1.1-bar", VersionField.None, "bar", ExpectedResult = "1.1.1-bar")] + [TestCase("1.1.1-bar", VersionField.Patch, "bar", ExpectedResult = "1.1.1-bar")] + [TestCase("1.1.1-bar", VersionField.Minor, "bar", ExpectedResult = "1.1.1-bar")] + [TestCase("1.1.1-bar", VersionField.Major, "bar", ExpectedResult = "1.1.1-bar")] + public string WhenIncrementingPreReleaseVersionBar(string value, VersionField increment, string? label) + { + // Arrange + var semanticVersion = SemanticVersion.Parse(value, null); + + // Act + var result = semanticVersion.Increment(increment, label); + + // Assert + return result.ToString("i"); + } + + [TestCase("0.0.0-bar", VersionField.None, null, ExpectedResult = "0.0.0-bar")] + [TestCase("0.0.0-bar", VersionField.Patch, null, ExpectedResult = "0.0.1-bar")] + [TestCase("0.0.0-bar", VersionField.Minor, null, ExpectedResult = "0.1.0-bar")] + [TestCase("0.0.0-bar", VersionField.Major, null, ExpectedResult = "1.0.0-bar")] + [TestCase("0.0.0-bar", VersionField.None, "", ExpectedResult = "0.0.0-1")] + [TestCase("0.0.0-bar", VersionField.Patch, "", ExpectedResult = "0.0.1-1")] + [TestCase("0.0.0-bar", VersionField.Minor, "", ExpectedResult = "0.1.0-1")] + [TestCase("0.0.0-bar", VersionField.Major, "", ExpectedResult = "1.0.0-1")] + [TestCase("0.0.0-bar", VersionField.None, "bar", ExpectedResult = "0.0.0-bar")] + [TestCase("0.0.0-bar", VersionField.Patch, "bar", ExpectedResult = "0.0.1-bar")] + [TestCase("0.0.0-bar", VersionField.Minor, "bar", ExpectedResult = "0.1.0-bar")] + [TestCase("0.0.0-bar", VersionField.Major, "bar", ExpectedResult = "1.0.0-bar")] + + [TestCase("0.0.1-bar", VersionField.None, null, ExpectedResult = "0.0.1-bar")] + [TestCase("0.0.1-bar", VersionField.Patch, null, ExpectedResult = "0.0.1-bar")] + [TestCase("0.0.1-bar", VersionField.Minor, null, ExpectedResult = "0.1.0-bar")] + [TestCase("0.0.1-bar", VersionField.Major, null, ExpectedResult = "1.0.0-bar")] + [TestCase("0.0.1-bar", VersionField.None, "", ExpectedResult = "0.0.1-1")] + [TestCase("0.0.1-bar", VersionField.Patch, "", ExpectedResult = "0.0.1-1")] + [TestCase("0.0.1-bar", VersionField.Minor, "", ExpectedResult = "0.1.0-1")] + [TestCase("0.0.1-bar", VersionField.Major, "", ExpectedResult = "1.0.0-1")] + [TestCase("0.0.1-bar", VersionField.None, "bar", ExpectedResult = "0.0.1-bar")] + [TestCase("0.0.1-bar", VersionField.Patch, "bar", ExpectedResult = "0.0.1-bar")] + [TestCase("0.0.1-bar", VersionField.Minor, "bar", ExpectedResult = "0.1.0-bar")] + [TestCase("0.0.1-bar", VersionField.Major, "bar", ExpectedResult = "1.0.0-bar")] + + [TestCase("0.1.0-bar", VersionField.None, null, ExpectedResult = "0.1.0-bar")] + [TestCase("0.1.0-bar", VersionField.Patch, null, ExpectedResult = "0.1.1-bar")] + [TestCase("0.1.0-bar", VersionField.Minor, null, ExpectedResult = "0.1.0-bar")] + [TestCase("0.1.0-bar", VersionField.Major, null, ExpectedResult = "1.0.0-bar")] + [TestCase("0.1.0-bar", VersionField.None, "", ExpectedResult = "0.1.0-1")] + [TestCase("0.1.0-bar", VersionField.Patch, "", ExpectedResult = "0.1.1-1")] + [TestCase("0.1.0-bar", VersionField.Minor, "", ExpectedResult = "0.1.0-1")] + [TestCase("0.1.0-bar", VersionField.Major, "", ExpectedResult = "1.0.0-1")] + [TestCase("0.1.0-bar", VersionField.None, "bar", ExpectedResult = "0.1.0-bar")] + [TestCase("0.1.0-bar", VersionField.Patch, "bar", ExpectedResult = "0.1.1-bar")] + [TestCase("0.1.0-bar", VersionField.Minor, "bar", ExpectedResult = "0.1.0-bar")] + [TestCase("0.1.0-bar", VersionField.Major, "bar", ExpectedResult = "1.0.0-bar")] + + [TestCase("0.1.1-bar", VersionField.None, null, ExpectedResult = "0.1.1-bar")] + [TestCase("0.1.1-bar", VersionField.Patch, null, ExpectedResult = "0.1.1-bar")] + [TestCase("0.1.1-bar", VersionField.Minor, null, ExpectedResult = "0.2.0-bar")] + [TestCase("0.1.1-bar", VersionField.Major, null, ExpectedResult = "1.0.0-bar")] + [TestCase("0.1.1-bar", VersionField.None, "", ExpectedResult = "0.1.1-1")] + [TestCase("0.1.1-bar", VersionField.Patch, "", ExpectedResult = "0.1.1-1")] + [TestCase("0.1.1-bar", VersionField.Minor, "", ExpectedResult = "0.2.0-1")] + [TestCase("0.1.1-bar", VersionField.Major, "", ExpectedResult = "1.0.0-1")] + [TestCase("0.1.1-bar", VersionField.None, "bar", ExpectedResult = "0.1.1-bar")] + [TestCase("0.1.1-bar", VersionField.Patch, "bar", ExpectedResult = "0.1.1-bar")] + [TestCase("0.1.1-bar", VersionField.Minor, "bar", ExpectedResult = "0.2.0-bar")] + [TestCase("0.1.1-bar", VersionField.Major, "bar", ExpectedResult = "1.0.0-bar")] + + [TestCase("1.0.0-bar", VersionField.None, null, ExpectedResult = "1.0.0-bar")] + [TestCase("1.0.0-bar", VersionField.Patch, null, ExpectedResult = "1.0.1-bar")] + [TestCase("1.0.0-bar", VersionField.Minor, null, ExpectedResult = "1.1.0-bar")] + [TestCase("1.0.0-bar", VersionField.Major, null, ExpectedResult = "1.0.0-bar")] + [TestCase("1.0.0-bar", VersionField.None, "", ExpectedResult = "1.0.0-1")] + [TestCase("1.0.0-bar", VersionField.Patch, "", ExpectedResult = "1.0.1-1")] + [TestCase("1.0.0-bar", VersionField.Minor, "", ExpectedResult = "1.1.0-1")] + [TestCase("1.0.0-bar", VersionField.Major, "", ExpectedResult = "1.0.0-1")] + [TestCase("1.0.0-bar", VersionField.None, "bar", ExpectedResult = "1.0.0-bar")] + [TestCase("1.0.0-bar", VersionField.Patch, "bar", ExpectedResult = "1.0.1-bar")] + [TestCase("1.0.0-bar", VersionField.Minor, "bar", ExpectedResult = "1.1.0-bar")] + [TestCase("1.0.0-bar", VersionField.Major, "bar", ExpectedResult = "1.0.0-bar")] + + [TestCase("1.0.1-bar", VersionField.None, null, ExpectedResult = "1.0.1-bar")] + [TestCase("1.0.1-bar", VersionField.Patch, null, ExpectedResult = "1.0.1-bar")] + [TestCase("1.0.1-bar", VersionField.Minor, null, ExpectedResult = "1.1.0-bar")] + [TestCase("1.0.1-bar", VersionField.Major, null, ExpectedResult = "2.0.0-bar")] + [TestCase("1.0.1-bar", VersionField.None, "", ExpectedResult = "1.0.1-1")] + [TestCase("1.0.1-bar", VersionField.Patch, "", ExpectedResult = "1.0.1-1")] + [TestCase("1.0.1-bar", VersionField.Minor, "", ExpectedResult = "1.1.0-1")] + [TestCase("1.0.1-bar", VersionField.Major, "", ExpectedResult = "2.0.0-1")] + [TestCase("1.0.1-bar", VersionField.None, "bar", ExpectedResult = "1.0.1-bar")] + [TestCase("1.0.1-bar", VersionField.Patch, "bar", ExpectedResult = "1.0.1-bar")] + [TestCase("1.0.1-bar", VersionField.Minor, "bar", ExpectedResult = "1.1.0-bar")] + [TestCase("1.0.1-bar", VersionField.Major, "bar", ExpectedResult = "2.0.0-bar")] + + [TestCase("1.1.0-bar", VersionField.None, null, ExpectedResult = "1.1.0-bar")] + [TestCase("1.1.0-bar", VersionField.Patch, null, ExpectedResult = "1.1.1-bar")] + [TestCase("1.1.0-bar", VersionField.Minor, null, ExpectedResult = "1.1.0-bar")] + [TestCase("1.1.0-bar", VersionField.Major, null, ExpectedResult = "2.0.0-bar")] + [TestCase("1.1.0-bar", VersionField.None, "", ExpectedResult = "1.1.0-1")] + [TestCase("1.1.0-bar", VersionField.Patch, "", ExpectedResult = "1.1.1-1")] + [TestCase("1.1.0-bar", VersionField.Minor, "", ExpectedResult = "1.1.0-1")] + [TestCase("1.1.0-bar", VersionField.Major, "", ExpectedResult = "2.0.0-1")] + [TestCase("1.1.0-bar", VersionField.None, "bar", ExpectedResult = "1.1.0-bar")] + [TestCase("1.1.0-bar", VersionField.Patch, "bar", ExpectedResult = "1.1.1-bar")] + [TestCase("1.1.0-bar", VersionField.Minor, "bar", ExpectedResult = "1.1.0-bar")] + [TestCase("1.1.0-bar", VersionField.Major, "bar", ExpectedResult = "2.0.0-bar")] + + [TestCase("1.1.1-bar", VersionField.None, null, ExpectedResult = "1.1.1-bar")] + [TestCase("1.1.1-bar", VersionField.Patch, null, ExpectedResult = "1.1.1-bar")] + [TestCase("1.1.1-bar", VersionField.Minor, null, ExpectedResult = "1.2.0-bar")] + [TestCase("1.1.1-bar", VersionField.Major, null, ExpectedResult = "2.0.0-bar")] + [TestCase("1.1.1-bar", VersionField.None, "", ExpectedResult = "1.1.1-1")] + [TestCase("1.1.1-bar", VersionField.Patch, "", ExpectedResult = "1.1.1-1")] + [TestCase("1.1.1-bar", VersionField.Minor, "", ExpectedResult = "1.2.0-1")] + [TestCase("1.1.1-bar", VersionField.Major, "", ExpectedResult = "2.0.0-1")] + [TestCase("1.1.1-bar", VersionField.None, "bar", ExpectedResult = "1.1.1-bar")] + [TestCase("1.1.1-bar", VersionField.Patch, "bar", ExpectedResult = "1.1.1-bar")] + [TestCase("1.1.1-bar", VersionField.Minor, "bar", ExpectedResult = "1.2.0-bar")] + [TestCase("1.1.1-bar", VersionField.Major, "bar", ExpectedResult = "2.0.0-bar")] + public string WhenIncrementingPreReleaseVersionBarInModeEnsureIntegrity(string value, VersionField increment, string? label) + { + // Arrange + var semanticVersion = SemanticVersion.Parse(value, null); + + // Act + var result = semanticVersion.Increment(increment, label, SemanticVersion.IncrementMode.EnsureIntegrity); + + // Assert + return result.ToString("i"); + } + + [TestCase("0.0.0-bar", VersionField.None, null, ExpectedResult = "0.0.0-bar")] + [TestCase("0.0.0-bar", VersionField.Patch, null, ExpectedResult = "0.0.1-bar")] + [TestCase("0.0.0-bar", VersionField.Minor, null, ExpectedResult = "0.1.0-bar")] + [TestCase("0.0.0-bar", VersionField.Major, null, ExpectedResult = "1.0.0-bar")] + [TestCase("0.0.0-bar", VersionField.None, "", ExpectedResult = "0.0.0-1")] + [TestCase("0.0.0-bar", VersionField.Patch, "", ExpectedResult = "0.0.1-1")] + [TestCase("0.0.0-bar", VersionField.Minor, "", ExpectedResult = "0.1.0-1")] + [TestCase("0.0.0-bar", VersionField.Major, "", ExpectedResult = "1.0.0-1")] + [TestCase("0.0.0-bar", VersionField.None, "bar", ExpectedResult = "0.0.0-bar")] + [TestCase("0.0.0-bar", VersionField.Patch, "bar", ExpectedResult = "0.0.1-bar")] + [TestCase("0.0.0-bar", VersionField.Minor, "bar", ExpectedResult = "0.1.0-bar")] + [TestCase("0.0.0-bar", VersionField.Major, "bar", ExpectedResult = "1.0.0-bar")] + + [TestCase("0.0.1-bar", VersionField.None, null, ExpectedResult = "0.0.1-bar")] + [TestCase("0.0.1-bar", VersionField.Patch, null, ExpectedResult = "0.0.2-bar")] + [TestCase("0.0.1-bar", VersionField.Minor, null, ExpectedResult = "0.1.0-bar")] + [TestCase("0.0.1-bar", VersionField.Major, null, ExpectedResult = "1.0.0-bar")] + [TestCase("0.0.1-bar", VersionField.None, "", ExpectedResult = "0.0.1-1")] + [TestCase("0.0.1-bar", VersionField.Patch, "", ExpectedResult = "0.0.2-1")] + [TestCase("0.0.1-bar", VersionField.Minor, "", ExpectedResult = "0.1.0-1")] + [TestCase("0.0.1-bar", VersionField.Major, "", ExpectedResult = "1.0.0-1")] + [TestCase("0.0.1-bar", VersionField.None, "bar", ExpectedResult = "0.0.1-bar")] + [TestCase("0.0.1-bar", VersionField.Patch, "bar", ExpectedResult = "0.0.2-bar")] + [TestCase("0.0.1-bar", VersionField.Minor, "bar", ExpectedResult = "0.1.0-bar")] + [TestCase("0.0.1-bar", VersionField.Major, "bar", ExpectedResult = "1.0.0-bar")] + + [TestCase("0.1.0-bar", VersionField.None, null, ExpectedResult = "0.1.0-bar")] + [TestCase("0.1.0-bar", VersionField.Patch, null, ExpectedResult = "0.1.1-bar")] + [TestCase("0.1.0-bar", VersionField.Minor, null, ExpectedResult = "0.2.0-bar")] + [TestCase("0.1.0-bar", VersionField.Major, null, ExpectedResult = "1.0.0-bar")] + [TestCase("0.1.0-bar", VersionField.None, "", ExpectedResult = "0.1.0-1")] + [TestCase("0.1.0-bar", VersionField.Patch, "", ExpectedResult = "0.1.1-1")] + [TestCase("0.1.0-bar", VersionField.Minor, "", ExpectedResult = "0.2.0-1")] + [TestCase("0.1.0-bar", VersionField.Major, "", ExpectedResult = "1.0.0-1")] + [TestCase("0.1.0-bar", VersionField.None, "bar", ExpectedResult = "0.1.0-bar")] + [TestCase("0.1.0-bar", VersionField.Patch, "bar", ExpectedResult = "0.1.1-bar")] + [TestCase("0.1.0-bar", VersionField.Minor, "bar", ExpectedResult = "0.2.0-bar")] + [TestCase("0.1.0-bar", VersionField.Major, "bar", ExpectedResult = "1.0.0-bar")] + + [TestCase("0.1.1-bar", VersionField.None, null, ExpectedResult = "0.1.1-bar")] + [TestCase("0.1.1-bar", VersionField.Patch, null, ExpectedResult = "0.1.2-bar")] + [TestCase("0.1.1-bar", VersionField.Minor, null, ExpectedResult = "0.2.0-bar")] + [TestCase("0.1.1-bar", VersionField.Major, null, ExpectedResult = "1.0.0-bar")] + [TestCase("0.1.1-bar", VersionField.None, "", ExpectedResult = "0.1.1-1")] + [TestCase("0.1.1-bar", VersionField.Patch, "", ExpectedResult = "0.1.2-1")] + [TestCase("0.1.1-bar", VersionField.Minor, "", ExpectedResult = "0.2.0-1")] + [TestCase("0.1.1-bar", VersionField.Major, "", ExpectedResult = "1.0.0-1")] + [TestCase("0.1.1-bar", VersionField.None, "bar", ExpectedResult = "0.1.1-bar")] + [TestCase("0.1.1-bar", VersionField.Patch, "bar", ExpectedResult = "0.1.2-bar")] + [TestCase("0.1.1-bar", VersionField.Minor, "bar", ExpectedResult = "0.2.0-bar")] + [TestCase("0.1.1-bar", VersionField.Major, "bar", ExpectedResult = "1.0.0-bar")] + + [TestCase("1.0.0-bar", VersionField.None, null, ExpectedResult = "1.0.0-bar")] + [TestCase("1.0.0-bar", VersionField.Patch, null, ExpectedResult = "1.0.1-bar")] + [TestCase("1.0.0-bar", VersionField.Minor, null, ExpectedResult = "1.1.0-bar")] + [TestCase("1.0.0-bar", VersionField.Major, null, ExpectedResult = "2.0.0-bar")] + [TestCase("1.0.0-bar", VersionField.None, "", ExpectedResult = "1.0.0-1")] + [TestCase("1.0.0-bar", VersionField.Patch, "", ExpectedResult = "1.0.1-1")] + [TestCase("1.0.0-bar", VersionField.Minor, "", ExpectedResult = "1.1.0-1")] + [TestCase("1.0.0-bar", VersionField.Major, "", ExpectedResult = "2.0.0-1")] + [TestCase("1.0.0-bar", VersionField.None, "bar", ExpectedResult = "1.0.0-bar")] + [TestCase("1.0.0-bar", VersionField.Patch, "bar", ExpectedResult = "1.0.1-bar")] + [TestCase("1.0.0-bar", VersionField.Minor, "bar", ExpectedResult = "1.1.0-bar")] + [TestCase("1.0.0-bar", VersionField.Major, "bar", ExpectedResult = "2.0.0-bar")] + + [TestCase("1.0.1-bar", VersionField.None, null, ExpectedResult = "1.0.1-bar")] + [TestCase("1.0.1-bar", VersionField.Patch, null, ExpectedResult = "1.0.2-bar")] + [TestCase("1.0.1-bar", VersionField.Minor, null, ExpectedResult = "1.1.0-bar")] + [TestCase("1.0.1-bar", VersionField.Major, null, ExpectedResult = "2.0.0-bar")] + [TestCase("1.0.1-bar", VersionField.None, "", ExpectedResult = "1.0.1-1")] + [TestCase("1.0.1-bar", VersionField.Patch, "", ExpectedResult = "1.0.2-1")] + [TestCase("1.0.1-bar", VersionField.Minor, "", ExpectedResult = "1.1.0-1")] + [TestCase("1.0.1-bar", VersionField.Major, "", ExpectedResult = "2.0.0-1")] + [TestCase("1.0.1-bar", VersionField.None, "bar", ExpectedResult = "1.0.1-bar")] + [TestCase("1.0.1-bar", VersionField.Patch, "bar", ExpectedResult = "1.0.2-bar")] + [TestCase("1.0.1-bar", VersionField.Minor, "bar", ExpectedResult = "1.1.0-bar")] + [TestCase("1.0.1-bar", VersionField.Major, "bar", ExpectedResult = "2.0.0-bar")] + + [TestCase("1.1.0-bar", VersionField.None, null, ExpectedResult = "1.1.0-bar")] + [TestCase("1.1.0-bar", VersionField.Patch, null, ExpectedResult = "1.1.1-bar")] + [TestCase("1.1.0-bar", VersionField.Minor, null, ExpectedResult = "1.2.0-bar")] + [TestCase("1.1.0-bar", VersionField.Major, null, ExpectedResult = "2.0.0-bar")] + [TestCase("1.1.0-bar", VersionField.None, "", ExpectedResult = "1.1.0-1")] + [TestCase("1.1.0-bar", VersionField.Patch, "", ExpectedResult = "1.1.1-1")] + [TestCase("1.1.0-bar", VersionField.Minor, "", ExpectedResult = "1.2.0-1")] + [TestCase("1.1.0-bar", VersionField.Major, "", ExpectedResult = "2.0.0-1")] + [TestCase("1.1.0-bar", VersionField.None, "bar", ExpectedResult = "1.1.0-bar")] + [TestCase("1.1.0-bar", VersionField.Patch, "bar", ExpectedResult = "1.1.1-bar")] + [TestCase("1.1.0-bar", VersionField.Minor, "bar", ExpectedResult = "1.2.0-bar")] + [TestCase("1.1.0-bar", VersionField.Major, "bar", ExpectedResult = "2.0.0-bar")] + + [TestCase("1.1.1-bar", VersionField.None, null, ExpectedResult = "1.1.1-bar")] + [TestCase("1.1.1-bar", VersionField.Patch, null, ExpectedResult = "1.1.2-bar")] + [TestCase("1.1.1-bar", VersionField.Minor, null, ExpectedResult = "1.2.0-bar")] + [TestCase("1.1.1-bar", VersionField.Major, null, ExpectedResult = "2.0.0-bar")] + [TestCase("1.1.1-bar", VersionField.None, "", ExpectedResult = "1.1.1-1")] + [TestCase("1.1.1-bar", VersionField.Patch, "", ExpectedResult = "1.1.2-1")] + [TestCase("1.1.1-bar", VersionField.Minor, "", ExpectedResult = "1.2.0-1")] + [TestCase("1.1.1-bar", VersionField.Major, "", ExpectedResult = "2.0.0-1")] + [TestCase("1.1.1-bar", VersionField.None, "bar", ExpectedResult = "1.1.1-bar")] + [TestCase("1.1.1-bar", VersionField.Patch, "bar", ExpectedResult = "1.1.2-bar")] + [TestCase("1.1.1-bar", VersionField.Minor, "bar", ExpectedResult = "1.2.0-bar")] + [TestCase("1.1.1-bar", VersionField.Major, "bar", ExpectedResult = "2.0.0-bar")] + public string WhenIncrementingPreReleaseVersionBarInModeForce(string value, VersionField increment, string? label) + { + // Arrange + var semanticVersion = SemanticVersion.Parse(value, null); + + // Act + var result = semanticVersion.Increment(increment, label, SemanticVersion.IncrementMode.Force); + + // Assert + return result.ToString("i"); + } } diff --git a/src/GitVersion.Core.Tests/VersionCalculation/Strategies/ConfigNextVersionBaseVersionStrategyTests.cs b/src/GitVersion.Core.Tests/VersionCalculation/Strategies/ConfigNextVersionBaseVersionStrategyTests.cs index a7df492c2e..78b9453adc 100644 --- a/src/GitVersion.Core.Tests/VersionCalculation/Strategies/ConfigNextVersionBaseVersionStrategyTests.cs +++ b/src/GitVersion.Core.Tests/VersionCalculation/Strategies/ConfigNextVersionBaseVersionStrategyTests.cs @@ -33,7 +33,7 @@ public void ConfigNextVersionTest(string nextVersion, string expectedVersion, Se baseVersion.ShouldNotBeNull(); baseVersion.ShouldIncrement.ShouldBe(false); - baseVersion.SemanticVersion.ToString().ShouldBe(expectedVersion); + baseVersion.GetSemanticVersion().ToString().ShouldBe(expectedVersion); } [TestCase("0.1", SemanticVersionFormat.Strict)] diff --git a/src/GitVersion.Core.Tests/VersionCalculation/Strategies/MergeMessageBaseVersionStrategyTests.cs b/src/GitVersion.Core.Tests/VersionCalculation/Strategies/MergeMessageBaseVersionStrategyTests.cs index adc7a34dd2..b421250ad6 100644 --- a/src/GitVersion.Core.Tests/VersionCalculation/Strategies/MergeMessageBaseVersionStrategyTests.cs +++ b/src/GitVersion.Core.Tests/VersionCalculation/Strategies/MergeMessageBaseVersionStrategyTests.cs @@ -177,7 +177,7 @@ private static void AssertMergeMessage(string message, string? expectedVersion, else { baseVersion.ShouldNotBeNull(); - baseVersion.SemanticVersion.ToString().ShouldBe(expectedVersion); + baseVersion.GetSemanticVersion().ToString().ShouldBe(expectedVersion); } } diff --git a/src/GitVersion.Core.Tests/VersionCalculation/Strategies/VersionInBranchNameBaseVersionStrategyTests.cs b/src/GitVersion.Core.Tests/VersionCalculation/Strategies/VersionInBranchNameBaseVersionStrategyTests.cs index e006162870..ed6852d234 100644 --- a/src/GitVersion.Core.Tests/VersionCalculation/Strategies/VersionInBranchNameBaseVersionStrategyTests.cs +++ b/src/GitVersion.Core.Tests/VersionCalculation/Strategies/VersionInBranchNameBaseVersionStrategyTests.cs @@ -28,7 +28,7 @@ public void CanTakeVersionFromNameOfReleaseBranch(string branchName, string expe strategy.ShouldNotBeNull(); var baseVersion = strategy.GetBaseVersions(effectiveBranchConfiguration).Single(); - baseVersion.SemanticVersion.ToString().ShouldBe(expectedBaseVersion); + baseVersion.GetSemanticVersion().ToString().ShouldBe(expectedBaseVersion); } [TestCase("origin/hotfix-2.0.0")] @@ -90,7 +90,7 @@ public void CanTakeVersionFromNameOfConfiguredReleaseBranch(string branchName, s strategy.ShouldNotBeNull(); var baseVersion = strategy.GetBaseVersions(effectiveBranchConfiguration).Single(); - baseVersion.SemanticVersion.ToString().ShouldBe(expectedBaseVersion); + baseVersion.GetSemanticVersion().ToString().ShouldBe(expectedBaseVersion); } [TestCase("origin", "release-2.0.0", "2.0.0")] @@ -114,7 +114,7 @@ public void CanTakeVersionFromNameOfRemoteReleaseBranch(string origin, string br strategy.ShouldNotBeNull(); var baseVersion = strategy.GetBaseVersions(effectiveBranchConfiguration).Single(); - baseVersion.SemanticVersion.ToString().ShouldBe(expectedBaseVersion); + baseVersion.GetSemanticVersion().ToString().ShouldBe(expectedBaseVersion); } private static IVersionStrategy GetVersionStrategy(IGitRepository repository, diff --git a/src/GitVersion.Core/Core/Abstractions/IRepositoryStore.cs b/src/GitVersion.Core/Core/Abstractions/IRepositoryStore.cs index 65397c4a08..49a0f6bede 100644 --- a/src/GitVersion.Core/Core/Abstractions/IRepositoryStore.cs +++ b/src/GitVersion.Core/Core/Abstractions/IRepositoryStore.cs @@ -16,12 +16,13 @@ public interface IRepositoryStore IEnumerable GetCommitLog(ICommit? baseVersionSource, ICommit? currentCommit); IBranch GetTargetBranch(string? targetBranchName); - IBranch? FindBranch(string? branchName); + IBranch? FindBranch(ReferenceName branchName); + IBranch? FindBranch(string branchName); IBranch? FindMainBranch(IGitVersionConfiguration configuration); IEnumerable FindMainlineBranches(IGitVersionConfiguration configuration); IEnumerable GetReleaseBranches(IEnumerable> releaseBranchConfig); IEnumerable ExcludingBranches(IEnumerable branchesToExclude); - IEnumerable GetBranchesContainingCommit(ICommit? commit, IEnumerable? branches = null, bool onlyTrackedBranches = false); + IEnumerable GetBranchesContainingCommit(ICommit commit, IEnumerable? branches = null, bool onlyTrackedBranches = false); IDictionary> GetMainlineBranches(ICommit commit, IGitVersionConfiguration configuration); @@ -41,8 +42,6 @@ public interface IRepositoryStore SemanticVersion? GetCurrentCommitTaggedVersion(ICommit? commit, string? tagPrefix, SemanticVersionFormat format, bool handleDetachedBranch); - IEnumerable GetVersionTagsOnBranch(IBranch branch, string? tagPrefix, SemanticVersionFormat format); - IReadOnlyList GetTaggedSemanticVersions(string? tagPrefix, SemanticVersionFormat format); IReadOnlyList GetTaggedSemanticVersionsOnBranch(IBranch branch, string? tagPrefix, SemanticVersionFormat format); diff --git a/src/GitVersion.Core/Core/BranchRepository.cs b/src/GitVersion.Core/Core/BranchRepository.cs new file mode 100644 index 0000000000..9aa90e9658 --- /dev/null +++ b/src/GitVersion.Core/Core/BranchRepository.cs @@ -0,0 +1,41 @@ +using GitVersion.Configuration; +using GitVersion.Extensions; + +namespace GitVersion.Core; + +internal sealed class BranchRepository : IBranchRepository +{ + private GitVersionContext VersionContext => this.versionContextLazy.Value; + private readonly Lazy versionContextLazy; + + private readonly IGitRepository gitRepository; + + public BranchRepository(Lazy versionContext, IGitRepository gitRepository) + { + this.versionContextLazy = versionContext.NotNull(); + this.gitRepository = gitRepository.NotNull(); + } + + public IEnumerable GetMainlineBranches(params IBranch[] excludeBranches) + => GetBranches(new HashSet(excludeBranches), configuration => configuration.IsMainline == true); + + public IEnumerable GetReleaseBranches(params IBranch[] excludeBranches) + => GetBranches(new HashSet(excludeBranches), configuration => configuration.IsReleaseBranch == true); + + private IEnumerable GetBranches(HashSet excludeBranches, Func predicate) + { + predicate.NotNull(); + + foreach (var branch in this.gitRepository.Branches) + { + if (!excludeBranches.Contains(branch)) + { + var branchConfiguration = VersionContext.Configuration.GetBranchConfiguration(branch.Name); + if (predicate(branchConfiguration)) + { + yield return branch; + } + } + } + } +} diff --git a/src/GitVersion.Core/Core/BranchesContainingCommitFinder.cs b/src/GitVersion.Core/Core/BranchesContainingCommitFinder.cs index b379cf6d74..4e912800a0 100644 --- a/src/GitVersion.Core/Core/BranchesContainingCommitFinder.cs +++ b/src/GitVersion.Core/Core/BranchesContainingCommitFinder.cs @@ -14,9 +14,9 @@ public BranchesContainingCommitFinder(IGitRepository repository, ILog log) this.log = log.NotNull(); } - public IEnumerable GetBranchesContainingCommit(ICommit? commit, IEnumerable? branches = null, bool onlyTrackedBranches = false) + public IEnumerable GetBranchesContainingCommit(ICommit commit, IEnumerable? branches = null, bool onlyTrackedBranches = false) { - commit = commit.NotNull(); + commit.NotNull(); branches ??= this.repository.Branches.ToList(); // TODO Should we cache this? diff --git a/src/GitVersion.Core/Core/GitVersionContextFactory.cs b/src/GitVersion.Core/Core/GitVersionContextFactory.cs index 42c61c704d..8a2b7f028e 100644 --- a/src/GitVersion.Core/Core/GitVersionContextFactory.cs +++ b/src/GitVersion.Core/Core/GitVersionContextFactory.cs @@ -23,6 +23,8 @@ public GitVersionContext Create(GitVersionOptions gitVersionOptions) var currentBranch = this.repositoryStore.GetTargetBranch(gitVersionOptions.RepositoryInfo.TargetBranch) ?? throw new InvalidOperationException("Need a branch to operate on"); var currentCommit = this.repositoryStore.GetCurrentCommit(currentBranch, gitVersionOptions.RepositoryInfo.CommitId); + if (currentCommit is null) throw new GitVersionException("No commits found on the current branch."); + var overrideConfiguration = this.options.Value.ConfigurationInfo.OverrideConfiguration; var configuration = this.configurationProvider.Provide(overrideConfiguration); if (currentBranch.IsDetachedHead) diff --git a/src/GitVersion.Core/Core/IBranchRepository.cs b/src/GitVersion.Core/Core/IBranchRepository.cs new file mode 100644 index 0000000000..bc13477299 --- /dev/null +++ b/src/GitVersion.Core/Core/IBranchRepository.cs @@ -0,0 +1,8 @@ +namespace GitVersion.Core; + +internal interface IBranchRepository +{ + IEnumerable GetMainlineBranches(params IBranch[] excludeBranches); + + IEnumerable GetReleaseBranches(params IBranch[] excludeBranches); +} diff --git a/src/GitVersion.Core/Core/ITaggedSemanticVersionRepository.cs b/src/GitVersion.Core/Core/ITaggedSemanticVersionRepository.cs new file mode 100644 index 0000000000..35930a3a15 --- /dev/null +++ b/src/GitVersion.Core/Core/ITaggedSemanticVersionRepository.cs @@ -0,0 +1,30 @@ +using GitVersion.Configuration; + +namespace GitVersion.Core; + +internal interface ITaggedSemanticVersionRepository +{ + ILookup GetTaggedSemanticVersions(IBranch branch, EffectiveConfiguration configuration); + + ILookup GetAllTaggedSemanticVersions(string? tagPrefix, SemanticVersionFormat format); + + ILookup GetTaggedSemanticVersionsOfBranch( + IBranch branch, + string? tagPrefix, + SemanticVersionFormat format); + + ILookup GetTaggedSemanticVersionsOfMergeTarget( + IBranch branch, + string? tagPrefix, + SemanticVersionFormat format); + + ILookup GetTaggedSemanticVersionsOfMainlineBranches( + string? tagPrefix, + SemanticVersionFormat format, + params IBranch[] excludeBranches); + + ILookup GetTaggedSemanticVersionsOfReleaseBranches( + string? tagPrefix, + SemanticVersionFormat format, + params IBranch[] excludeBranches); +} diff --git a/src/GitVersion.Core/Core/RepositoryStore.cs b/src/GitVersion.Core/Core/RepositoryStore.cs index e9ed4acb46..e14eba10f3 100644 --- a/src/GitVersion.Core/Core/RepositoryStore.cs +++ b/src/GitVersion.Core/Core/RepositoryStore.cs @@ -104,7 +104,9 @@ public IBranch GetTargetBranch(string? targetBranchName) return desiredBranch; } - public IBranch? FindBranch(string? branchName) => this.repository.Branches.FirstOrDefault(x => x.Name.EquivalentTo(branchName)); + public IBranch? FindBranch(ReferenceName branchName) => this.repository.Branches.FirstOrDefault(x => x.Name.Equals(branchName)); + + public IBranch? FindBranch(string branchName) => this.repository.Branches.FirstOrDefault(x => x.Name.EquivalentTo(branchName)); public IBranch? FindMainBranch(IGitVersionConfiguration configuration) { @@ -143,8 +145,10 @@ private static bool IsReleaseBranch(INamedReference branch, IEnumerable ExcludingBranches(IEnumerable branchesToExclude) => this.repository.Branches.ExcludeBranches(branchesToExclude); - public IEnumerable GetBranchesContainingCommit(ICommit? commit, IEnumerable? branches = null, bool onlyTrackedBranches = false) + public IEnumerable GetBranchesContainingCommit(ICommit commit, IEnumerable? branches = null, bool onlyTrackedBranches = false) { + commit.NotNull(); + var branchesContainingCommitFinder = new BranchesContainingCommitFinder(this.repository, this.log); return branchesContainingCommitFinder.GetBranchesContainingCommit(commit, branches, onlyTrackedBranches); } @@ -253,29 +257,6 @@ public IEnumerable FindCommitBranchesWasBranchedFrom(IBranch branc .SelectMany(tag => GetCurrentCommitSemanticVersions(commit, tagPrefix, tag, format, handleDetachedBranch)) .Max(); - public IEnumerable GetVersionTagsOnBranch(IBranch branch, string? tagPrefix, SemanticVersionFormat format) - { - branch = branch.NotNull(); - - if (this.taggedSemanticVersionsOnBranchCache.TryGetValue(branch, out var onBranch)) - { - this.log.Debug($"Cache hit for version tags on branch '{branch.Name.Canonical}"); - return onBranch.Select(element => element.Value); - } - - using (this.log.IndentLog($"Getting version tags from branch '{branch.Name.Canonical}'.")) - { - var semanticVersions = GetTaggedSemanticVersions(tagPrefix, format); - var tagsBySha = semanticVersions.Where(t => t.Tag.TargetSha != null).ToLookup(t => t.Tag.TargetSha, t => t); - - var versionTags = (branch.Commits?.SelectMany(c => tagsBySha[c.Sha].Select(t => t)) - ?? Enumerable.Empty()).ToList(); - - this.taggedSemanticVersionsOnBranchCache.Add(branch, versionTags); - return versionTags.Select(element => element.Value); - } - } - public IReadOnlyList GetTaggedSemanticVersions(string? tagPrefix, SemanticVersionFormat format) { if (this.taggedSemanticVersionsCache != null) @@ -316,7 +297,7 @@ public IReadOnlyList GetTaggedSemanticVersionsOnBranch( var semanticVersions = GetTaggedSemanticVersions(tagPrefix, format); var tagsBySha = semanticVersions.Where(t => t.Tag.TargetSha != null).ToLookup(t => t.Tag.TargetSha, t => t); - var versionTags = (branch.Commits?.SelectMany(c => tagsBySha[c.Sha].Select(t => t)) + var versionTags = (branch.Commits.SelectMany(c => tagsBySha[c.Sha].Select(t => t)) ?? Enumerable.Empty()).ToList(); this.taggedSemanticVersionsOnBranchCache.Add(branch, versionTags); diff --git a/src/GitVersion.Core/Core/TaggedSemanticVersionService.cs b/src/GitVersion.Core/Core/TaggedSemanticVersionService.cs new file mode 100644 index 0000000000..185a59657f --- /dev/null +++ b/src/GitVersion.Core/Core/TaggedSemanticVersionService.cs @@ -0,0 +1,279 @@ +using System.Collections.Concurrent; +using GitVersion.Configuration; +using GitVersion.Extensions; +using GitVersion.Logging; + +namespace GitVersion.Core; + +internal sealed class TaggedSemanticVersionRepository : ITaggedSemanticVersionRepository +{ + private readonly ILog log; + + private GitVersionContext VersionContext => this.versionContextLazy.Value; + private readonly Lazy versionContextLazy; + + private readonly IGitRepository gitRepository; + private readonly IBranchRepository branchRepository; + + public TaggedSemanticVersionRepository(ILog log, Lazy versionContext, IGitRepository gitRepository, + IBranchRepository branchRepository) + { + this.log = log.NotNull(); + this.versionContextLazy = versionContext.NotNull(); + this.gitRepository = gitRepository.NotNull(); + this.branchRepository = branchRepository.NotNull(); + } + + public ILookup GetTaggedSemanticVersions(IBranch branch, EffectiveConfiguration configuration) + { + configuration.NotNull(); + + IEnumerable<(ICommit Key, SemanticVersionWithTag Value)> GetElements() + { + var olderThan = VersionContext.CurrentCommit.When; + + var semanticVersionsOfBranch = GetTaggedSemanticVersionsOfBranch( + branch: branch, + tagPrefix: configuration.TagPrefix, + format: configuration.SemanticVersionFormat + ); + foreach (var grouping in semanticVersionsOfBranch) + { + if (grouping.Key.When > olderThan) continue; + + foreach (var semanticVersion in grouping) + { + yield return new(grouping.Key, semanticVersion); + } + } + + if (configuration.TrackMergeTarget) + { + var semanticVersionsOfMergeTarget = GetTaggedSemanticVersionsOfMergeTarget( + branch: branch, + tagPrefix: configuration.TagPrefix, + format: configuration.SemanticVersionFormat + ); + foreach (var grouping in semanticVersionsOfMergeTarget) + { + if (grouping.Key.When > olderThan) continue; + + foreach (var semanticVersion in grouping) + { + yield return new(grouping.Key, semanticVersion); + } + } + } + + if (configuration.TracksReleaseBranches) + { + var semanticVersionsOfReleaseBranches = GetTaggedSemanticVersionsOfReleaseBranches( + tagPrefix: configuration.TagPrefix, + format: configuration.SemanticVersionFormat, + excludeBranches: branch + ); + foreach (var grouping in semanticVersionsOfReleaseBranches) + { + if (grouping.Key.When > olderThan) continue; + + foreach (var semanticVersion in grouping) + { + yield return new(grouping.Key, semanticVersion); + } + } + } + + if (!configuration.IsMainline && !configuration.IsReleaseBranch) + { + var semanticVersionsOfMainlineBranches = GetTaggedSemanticVersionsOfMainlineBranches( + tagPrefix: configuration.TagPrefix, + format: configuration.SemanticVersionFormat, + excludeBranches: branch + ); + foreach (var grouping in semanticVersionsOfMainlineBranches) + { + if (grouping.Key.When > olderThan) continue; + + foreach (var semanticVersion in grouping) + { + yield return new(grouping.Key, semanticVersion); + } + } + } + } + + return GetElements().ToLookup(element => element.Key, element => element.Value); + } + + private readonly ConcurrentDictionary<(string, SemanticVersionFormat), ILookup> + allTaggedSemanticVersionsCache = new(); + + public ILookup GetAllTaggedSemanticVersions(string? tagPrefix, SemanticVersionFormat format) + { + tagPrefix ??= string.Empty; + + IEnumerable GetElements() + { + this.log.Info($"Getting tagged semantic versions. TagPrefix: {tagPrefix} and Format: {format}"); + + foreach (var tag in this.gitRepository.Tags) + { + if (SemanticVersion.TryParse(tag.Name.Friendly, tagPrefix, out var semanticVersion, format)) + { + yield return new SemanticVersionWithTag(semanticVersion, tag); + } + } + } + + bool isCached = true; + var result = allTaggedSemanticVersionsCache.GetOrAdd(new(tagPrefix, format), _ => + { + isCached = false; + return GetElements().ToLookup(element => element.Tag.Commit, element => element); + }); + + if (isCached) + { + this.log.Debug($"Returning cached tagged semantic versions. TagPrefix: {tagPrefix} and Format: {format}"); + } + + return result; + } + + private readonly ConcurrentDictionary<(IBranch, string, SemanticVersionFormat), ILookup> + taggedSemanticVersionsOfBranchCache = new(); + + public ILookup GetTaggedSemanticVersionsOfBranch( + IBranch branch, string? tagPrefix, SemanticVersionFormat format) + { + branch.NotNull(); + tagPrefix ??= string.Empty; + + IEnumerable GetElements() + { + using (this.log.IndentLog($"Getting tagged semantic versions on branch '{branch.Name.Canonical}'. " + + $"TagPrefix: {tagPrefix} and Format: {format}")) + { + var semanticVersions = GetAllTaggedSemanticVersions(tagPrefix, format); + + foreach (var commit in branch.Commits) + { + foreach (var semanticVersion in semanticVersions[commit]) + { + yield return semanticVersion; + } + } + } + } + + bool isCached = true; + var result = taggedSemanticVersionsOfBranchCache.GetOrAdd(new(branch, tagPrefix, format), _ => + { + isCached = false; + var semanticVersions = GetElements(); + return semanticVersions.ToLookup(element => element.Tag.Commit, element => element); + }); + + if (isCached) + { + this.log.Debug( + $"Returning cached tagged semantic versions on branch '{branch.Name.Canonical}'. " + + $"TagPrefix: {tagPrefix} and Format: {format}" + ); + } + + return result; + } + + private readonly ConcurrentDictionary<(IBranch, string, SemanticVersionFormat), ILookup> + taggedSemanticVersionsOfMergeTargetCache = new(); + + public ILookup GetTaggedSemanticVersionsOfMergeTarget( + IBranch branch, string? tagPrefix, SemanticVersionFormat format) + { + branch.NotNull(); + tagPrefix ??= string.Empty; + + IEnumerable<(ICommit, SemanticVersionWithTag)> GetElements() + { + using (this.log.IndentLog($"Getting tagged semantic versions by track merge target '{branch.Name.Canonical}'. " + + $"TagPrefix: {tagPrefix} and Format: {format}")) + { + var shaHashSet = new HashSet(branch.Commits.Select(element => element.Id.Sha)); + + foreach (var semanticVersion in GetAllTaggedSemanticVersions(tagPrefix, format).SelectMany(_ => _)) + { + foreach (var commit in semanticVersion.Tag.Commit.Parents.Where(element => shaHashSet.Contains(element.Id.Sha))) + { + yield return new(commit, semanticVersion); + } + } + } + } + + bool isCached = true; + var result = taggedSemanticVersionsOfMergeTargetCache.GetOrAdd(new(branch, tagPrefix, format), _ => + { + isCached = false; + return GetElements().ToLookup(element => element.Item1, element => element.Item2); + }); + + if (isCached) + { + this.log.Debug( + $"Returning cached tagged semantic versions by track merge target '{branch.Name.Canonical}'. " + + $"TagPrefix: {tagPrefix} and Format: {format}" + ); + } + + return result; + } + + public ILookup GetTaggedSemanticVersionsOfMainlineBranches( + string? tagPrefix, SemanticVersionFormat format, params IBranch[] excludeBranches) + { + tagPrefix ??= string.Empty; + excludeBranches.NotNull(); + + IEnumerable GetElements() + { + using (this.log.IndentLog($"Getting tagged semantic versions of mainline branches. " + + $"TagPrefix: {tagPrefix} and Format: {format}")) + { + foreach (var mainlinemBranch in branchRepository.GetMainlineBranches(excludeBranches)) + { + foreach (var semanticVersion in GetTaggedSemanticVersionsOfBranch(mainlinemBranch, tagPrefix, format).SelectMany(_ => _)) + { + yield return semanticVersion; + } + } + } + } + + return GetElements().ToLookup(element => element.Tag.Commit, element => element); + } + + public ILookup GetTaggedSemanticVersionsOfReleaseBranches( + string? tagPrefix, SemanticVersionFormat format, params IBranch[] excludeBranches) + { + tagPrefix ??= string.Empty; + excludeBranches.NotNull(); + + IEnumerable GetElements() + { + using (this.log.IndentLog($"Getting tagged semantic versions of release branches. " + + $"TagPrefix: {tagPrefix} and Format: {format}")) + { + foreach (var releaseBranch in branchRepository.GetReleaseBranches(excludeBranches)) + { + foreach (var semanticVersion in GetTaggedSemanticVersionsOfBranch(releaseBranch, tagPrefix, format).SelectMany(_ => _)) + { + yield return semanticVersion; + } + } + } + } + + return GetElements().ToLookup(element => element.Tag.Commit, element => element); + } +} diff --git a/src/GitVersion.Core/Extensions/ConfigurationExtensions.cs b/src/GitVersion.Core/Extensions/ConfigurationExtensions.cs index 39286f9db7..3ca2a64d12 100644 --- a/src/GitVersion.Core/Extensions/ConfigurationExtensions.cs +++ b/src/GitVersion.Core/Extensions/ConfigurationExtensions.cs @@ -18,6 +18,9 @@ public static EffectiveConfiguration GetEffectiveConfiguration(this IGitVersionC return new(configuration, branchConfiguration); } + public static IBranchConfiguration GetBranchConfiguration(this IGitVersionConfiguration configuration, IBranch branch) + => GetBranchConfiguration(configuration, branch.NotNull().Name); + public static IBranchConfiguration GetBranchConfiguration(this IGitVersionConfiguration configuration, ReferenceName branchName) { var branchConfiguration = GetBranchConfigurations(configuration, branchName.WithoutOrigin).FirstOrDefault(); diff --git a/src/GitVersion.Core/Extensions/EnumerableExtensions.cs b/src/GitVersion.Core/Extensions/EnumerableExtensions.cs index 1a50ff29c1..085de0f618 100644 --- a/src/GitVersion.Core/Extensions/EnumerableExtensions.cs +++ b/src/GitVersion.Core/Extensions/EnumerableExtensions.cs @@ -28,4 +28,14 @@ public static T SingleOfType(this IEnumerable source) return source.OfType().Single(); } + + public static void AddRange(this ICollection source, IEnumerable items) + { + source.NotNull(); + + foreach (var item in items.NotNull()) + { + source.Add(item); + } + } } diff --git a/src/GitVersion.Core/Extensions/VersionFieldExtensions.cs b/src/GitVersion.Core/Extensions/VersionFieldExtensions.cs new file mode 100644 index 0000000000..cf5f9c6d66 --- /dev/null +++ b/src/GitVersion.Core/Extensions/VersionFieldExtensions.cs @@ -0,0 +1,14 @@ +namespace GitVersion.Extensions; + +internal static class VersionFieldExtensions +{ + public static VersionField Consolidate(this VersionField source, VersionField? item, params VersionField?[] items) + { + VersionField result = source; + foreach (VersionField? increment in new[] { item }.Concat(items)) + { + if (result < increment) result = increment.Value; + } + return result; + } +} diff --git a/src/GitVersion.Core/Git/IBranch.cs b/src/GitVersion.Core/Git/IBranch.cs index cb7f0f2f87..e0745b87c2 100644 --- a/src/GitVersion.Core/Git/IBranch.cs +++ b/src/GitVersion.Core/Git/IBranch.cs @@ -6,5 +6,5 @@ public interface IBranch : IEquatable, IComparable, INamedRef bool IsRemote { get; } bool IsTracking { get; } bool IsDetachedHead { get; } - ICommitCollection? Commits { get; } + ICommitCollection Commits { get; } } diff --git a/src/GitVersion.Core/Git/ICommit.cs b/src/GitVersion.Core/Git/ICommit.cs index d9f27390fe..8506809be8 100644 --- a/src/GitVersion.Core/Git/ICommit.cs +++ b/src/GitVersion.Core/Git/ICommit.cs @@ -2,6 +2,7 @@ namespace GitVersion; public interface ICommit : IEquatable, IComparable, IGitObject { + bool IsMergeCommit => Parents.Count() >= 2; IEnumerable Parents { get; } DateTimeOffset When { get; } string Message { get; } diff --git a/src/GitVersion.Core/Git/ITag.cs b/src/GitVersion.Core/Git/ITag.cs index c856aab033..3a450e7cb9 100644 --- a/src/GitVersion.Core/Git/ITag.cs +++ b/src/GitVersion.Core/Git/ITag.cs @@ -2,7 +2,7 @@ namespace GitVersion; public interface ITag : IEquatable, IComparable, INamedReference { - string? TargetSha { get; } + string TargetSha { get; } ICommit Commit { get; } } diff --git a/src/GitVersion.Core/GitVersionContext.cs b/src/GitVersion.Core/GitVersionContext.cs index c7869987b6..bf2dc7259e 100644 --- a/src/GitVersion.Core/GitVersionContext.cs +++ b/src/GitVersion.Core/GitVersionContext.cs @@ -17,17 +17,17 @@ public class GitVersionContext public IBranch CurrentBranch { get; } - public ICommit? CurrentCommit { get; } + public ICommit CurrentCommit { get; } public bool IsCurrentCommitTagged => CurrentCommitTaggedVersion != null; public int NumberOfUncommittedChanges { get; } - public GitVersionContext(IBranch currentBranch, ICommit? currentCommit, + public GitVersionContext(IBranch currentBranch, ICommit currentCommit, IGitVersionConfiguration configuration, SemanticVersion? currentCommitTaggedVersion, int numberOfUncommittedChanges) { CurrentBranch = currentBranch.NotNull(); - CurrentCommit = currentCommit; + CurrentCommit = currentCommit.NotNull(); Configuration = configuration.NotNull(); CurrentCommitTaggedVersion = currentCommitTaggedVersion; NumberOfUncommittedChanges = numberOfUncommittedChanges; diff --git a/src/GitVersion.Core/GitVersionCoreModule.cs b/src/GitVersion.Core/GitVersionCoreModule.cs index 8aa8632ca1..c996abb27c 100644 --- a/src/GitVersion.Core/GitVersionCoreModule.cs +++ b/src/GitVersion.Core/GitVersionCoreModule.cs @@ -1,4 +1,5 @@ using GitVersion.Common; +using GitVersion.Core; using GitVersion.Extensions; using GitVersion.VersionCalculation; using GitVersion.VersionCalculation.Caching; @@ -17,6 +18,8 @@ public void RegisterTypes(IServiceCollection services) services.AddSingleton(); services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); services.AddSingleton(); services.AddSingleton(sp => diff --git a/src/GitVersion.Core/MergeMessage.cs b/src/GitVersion.Core/MergeMessage.cs index 8269ad88fa..4c60b3f253 100644 --- a/src/GitVersion.Core/MergeMessage.cs +++ b/src/GitVersion.Core/MergeMessage.cs @@ -1,3 +1,4 @@ +using System.Diagnostics.CodeAnalysis; using System.Text.RegularExpressions; using GitVersion.Configuration; using GitVersion.Extensions; @@ -93,4 +94,20 @@ private ReferenceName GetMergedBranchName(string mergedBranch) } return ReferenceName.FromBranchName(mergedBranch); } + + public static bool TryParse( + ICommit mergeCommit, IGitVersionConfiguration configuration, [NotNullWhen(true)] out MergeMessage? mergeMessage) + { + mergeCommit.NotNull(); + configuration.NotNull(); + + mergeMessage = null; + + if (mergeCommit.IsMergeCommit) + { + mergeMessage = new MergeMessage(mergeCommit.Message, configuration); + } + + return mergeMessage != null; + } } diff --git a/src/GitVersion.Core/PublicAPI.Unshipped.txt b/src/GitVersion.Core/PublicAPI.Unshipped.txt index 9bf862ff13..a478ef4f2c 100644 --- a/src/GitVersion.Core/PublicAPI.Unshipped.txt +++ b/src/GitVersion.Core/PublicAPI.Unshipped.txt @@ -88,7 +88,8 @@ GitVersion.CommitSortStrategies.Time = 2 -> GitVersion.CommitSortStrategies GitVersion.CommitSortStrategies.Topological = 1 -> GitVersion.CommitSortStrategies GitVersion.Common.IRepositoryStore GitVersion.Common.IRepositoryStore.ExcludingBranches(System.Collections.Generic.IEnumerable! branchesToExclude) -> System.Collections.Generic.IEnumerable! -GitVersion.Common.IRepositoryStore.FindBranch(string? branchName) -> GitVersion.IBranch? +GitVersion.Common.IRepositoryStore.FindBranch(GitVersion.ReferenceName! branchName) -> GitVersion.IBranch? +GitVersion.Common.IRepositoryStore.FindBranch(string! branchName) -> GitVersion.IBranch? GitVersion.Common.IRepositoryStore.FindCommitBranchWasBranchedFrom(GitVersion.IBranch? branch, GitVersion.Configuration.IGitVersionConfiguration! configuration, params GitVersion.IBranch![]! excludedBranches) -> GitVersion.BranchCommit GitVersion.Common.IRepositoryStore.FindCommitBranchesWasBranchedFrom(GitVersion.IBranch! branch, GitVersion.Configuration.IGitVersionConfiguration! configuration, System.Collections.Generic.IEnumerable! excludedBranches) -> System.Collections.Generic.IEnumerable! GitVersion.Common.IRepositoryStore.FindCommitBranchesWasBranchedFrom(GitVersion.IBranch! branch, GitVersion.Configuration.IGitVersionConfiguration! configuration, params GitVersion.IBranch![]! excludedBranches) -> System.Collections.Generic.IEnumerable! @@ -96,7 +97,7 @@ GitVersion.Common.IRepositoryStore.FindMainBranch(GitVersion.Configuration.IGitV GitVersion.Common.IRepositoryStore.FindMainlineBranches(GitVersion.Configuration.IGitVersionConfiguration! configuration) -> System.Collections.Generic.IEnumerable! GitVersion.Common.IRepositoryStore.FindMergeBase(GitVersion.IBranch? branch, GitVersion.IBranch? otherBranch) -> GitVersion.ICommit? GitVersion.Common.IRepositoryStore.FindMergeBase(GitVersion.ICommit! commit, GitVersion.ICommit! mainlineTip) -> GitVersion.ICommit? -GitVersion.Common.IRepositoryStore.GetBranchesContainingCommit(GitVersion.ICommit? commit, System.Collections.Generic.IEnumerable? branches = null, bool onlyTrackedBranches = false) -> System.Collections.Generic.IEnumerable! +GitVersion.Common.IRepositoryStore.GetBranchesContainingCommit(GitVersion.ICommit! commit, System.Collections.Generic.IEnumerable? branches = null, bool onlyTrackedBranches = false) -> System.Collections.Generic.IEnumerable! GitVersion.Common.IRepositoryStore.GetCommitLog(GitVersion.ICommit? baseVersionSource, GitVersion.ICommit? currentCommit) -> System.Collections.Generic.IEnumerable! GitVersion.Common.IRepositoryStore.GetCurrentCommit(GitVersion.IBranch! currentBranch, string? commitId) -> GitVersion.ICommit? GitVersion.Common.IRepositoryStore.GetCurrentCommitTaggedVersion(GitVersion.ICommit? commit, string? tagPrefix, GitVersion.SemanticVersionFormat format, bool handleDetachedBranch) -> GitVersion.SemanticVersion? @@ -110,7 +111,6 @@ GitVersion.Common.IRepositoryStore.GetSourceBranches(GitVersion.IBranch! branch, GitVersion.Common.IRepositoryStore.GetTaggedSemanticVersions(string? tagPrefix, GitVersion.SemanticVersionFormat format) -> System.Collections.Generic.IReadOnlyList! GitVersion.Common.IRepositoryStore.GetTaggedSemanticVersionsOnBranch(GitVersion.IBranch! branch, string? tagPrefix, GitVersion.SemanticVersionFormat format) -> System.Collections.Generic.IReadOnlyList! GitVersion.Common.IRepositoryStore.GetTargetBranch(string? targetBranchName) -> GitVersion.IBranch! -GitVersion.Common.IRepositoryStore.GetVersionTagsOnBranch(GitVersion.IBranch! branch, string? tagPrefix, GitVersion.SemanticVersionFormat format) -> System.Collections.Generic.IEnumerable! GitVersion.Common.IRepositoryStore.IsCommitOnBranch(GitVersion.ICommit? baseVersionSource, GitVersion.IBranch! branch, GitVersion.ICommit! firstMatchingCommit) -> bool GitVersion.Configuration.ConfigurationExtensions GitVersion.Configuration.EffectiveBranchConfiguration @@ -247,9 +247,9 @@ GitVersion.GitVersionCommonModule.RegisterTypes(Microsoft.Extensions.DependencyI GitVersion.GitVersionContext GitVersion.GitVersionContext.Configuration.get -> GitVersion.Configuration.IGitVersionConfiguration! GitVersion.GitVersionContext.CurrentBranch.get -> GitVersion.IBranch! -GitVersion.GitVersionContext.CurrentCommit.get -> GitVersion.ICommit? +GitVersion.GitVersionContext.CurrentCommit.get -> GitVersion.ICommit! GitVersion.GitVersionContext.CurrentCommitTaggedVersion.get -> GitVersion.SemanticVersion? -GitVersion.GitVersionContext.GitVersionContext(GitVersion.IBranch! currentBranch, GitVersion.ICommit? currentCommit, GitVersion.Configuration.IGitVersionConfiguration! configuration, GitVersion.SemanticVersion? currentCommitTaggedVersion, int numberOfUncommittedChanges) -> void +GitVersion.GitVersionContext.GitVersionContext(GitVersion.IBranch! currentBranch, GitVersion.ICommit! currentCommit, GitVersion.Configuration.IGitVersionConfiguration! configuration, GitVersion.SemanticVersion? currentCommitTaggedVersion, int numberOfUncommittedChanges) -> void GitVersion.GitVersionContext.IsCurrentCommitTagged.get -> bool GitVersion.GitVersionContext.NumberOfUncommittedChanges.get -> int GitVersion.GitVersionCoreModule @@ -296,7 +296,7 @@ GitVersion.Helpers.RetryAction.RetryAction(int maxRetries = 5) -> void GitVersion.Helpers.ServiceMessageEscapeHelper GitVersion.Helpers.StringComparerUtils GitVersion.IBranch -GitVersion.IBranch.Commits.get -> GitVersion.ICommitCollection? +GitVersion.IBranch.Commits.get -> GitVersion.ICommitCollection! GitVersion.IBranch.IsDetachedHead.get -> bool GitVersion.IBranch.IsRemote.get -> bool GitVersion.IBranch.IsTracking.get -> bool @@ -306,6 +306,7 @@ GitVersion.IBranchCollection.ExcludeBranches(System.Collections.Generic.IEnumera GitVersion.IBranchCollection.UpdateTrackedBranch(GitVersion.IBranch! branch, string! remoteTrackingReferenceName) -> void GitVersion.IBranchCollection.this[string! name].get -> GitVersion.IBranch? GitVersion.ICommit +GitVersion.ICommit.IsMergeCommit.get -> bool GitVersion.ICommit.Message.get -> string! GitVersion.ICommit.Parents.get -> System.Collections.Generic.IEnumerable! GitVersion.ICommit.When.get -> System.DateTimeOffset @@ -402,7 +403,7 @@ GitVersion.IRemoteCollection.Update(string! remoteName, string! refSpec) -> void GitVersion.IRemoteCollection.this[string! name].get -> GitVersion.IRemote? GitVersion.ITag GitVersion.ITag.Commit.get -> GitVersion.ICommit! -GitVersion.ITag.TargetSha.get -> string? +GitVersion.ITag.TargetSha.get -> string! GitVersion.ITagCollection GitVersion.IVersionConverter GitVersion.IVersionConverter.Execute(GitVersion.OutputVariables.GitVersionVariables! variables, T context) -> void @@ -547,13 +548,25 @@ GitVersion.SemanticVersion GitVersion.SemanticVersion.BuildMetaData.get -> GitVersion.SemanticVersionBuildMetaData! GitVersion.SemanticVersion.BuildMetaData.init -> void GitVersion.SemanticVersion.CompareTo(GitVersion.SemanticVersion? value) -> int -GitVersion.SemanticVersion.CompareTo(GitVersion.SemanticVersion? value, bool includePrerelease) -> int +GitVersion.SemanticVersion.CompareTo(GitVersion.SemanticVersion? value, bool includePreRelease) -> int GitVersion.SemanticVersion.Equals(GitVersion.SemanticVersion? obj) -> bool +GitVersion.SemanticVersion.Increment(GitVersion.VersionField increment, string? label, GitVersion.SemanticVersion.IncrementMode mode) -> GitVersion.SemanticVersion! +GitVersion.SemanticVersion.Increment(GitVersion.VersionField incrementStrategy, string? label) -> GitVersion.SemanticVersion! +GitVersion.SemanticVersion.Increment(GitVersion.VersionField incrementStrategy, string? label, bool forceIncrement) -> GitVersion.SemanticVersion! +GitVersion.SemanticVersion.IncrementMode +GitVersion.SemanticVersion.IncrementMode.EnsureIntegrity = 2 -> GitVersion.SemanticVersion.IncrementMode +GitVersion.SemanticVersion.IncrementMode.Force = 1 -> GitVersion.SemanticVersion.IncrementMode +GitVersion.SemanticVersion.IncrementMode.Standard = 0 -> GitVersion.SemanticVersion.IncrementMode GitVersion.SemanticVersion.IncrementVersion(GitVersion.VersionField incrementStrategy) -> GitVersion.SemanticVersion! -GitVersion.SemanticVersion.IncrementVersion(GitVersion.VersionField incrementStrategy, string? label) -> GitVersion.SemanticVersion! GitVersion.SemanticVersion.IsEmpty() -> bool +GitVersion.SemanticVersion.IsEqualTo(GitVersion.SemanticVersion? value, bool includePreRelease = true) -> bool +GitVersion.SemanticVersion.IsGreaterThan(GitVersion.SemanticVersion? value, bool includePreRelease = true) -> bool +GitVersion.SemanticVersion.IsGreaterThanOrEqualTo(GitVersion.SemanticVersion? value, bool includePreRelease = true) -> bool GitVersion.SemanticVersion.IsLabeledWith(string! value) -> bool +GitVersion.SemanticVersion.IsLessThan(GitVersion.SemanticVersion? value, bool includePreRelease = true) -> bool +GitVersion.SemanticVersion.IsLessThanOrEqualTo(GitVersion.SemanticVersion? value, bool includePreRelease = true) -> bool GitVersion.SemanticVersion.IsMatchForBranchSpecificLabel(string? value) -> bool +GitVersion.SemanticVersion.IsPreRelease.get -> bool GitVersion.SemanticVersion.Major.get -> long GitVersion.SemanticVersion.Major.init -> void GitVersion.SemanticVersion.Minor.get -> long @@ -650,12 +663,14 @@ GitVersion.Settings.OnlyTrackedBranches -> bool GitVersion.Settings.Settings() -> void GitVersion.VersionCalculation.BaseVersion GitVersion.VersionCalculation.BaseVersion.BaseVersion(GitVersion.VersionCalculation.BaseVersion! baseVersion) -> void +GitVersion.VersionCalculation.BaseVersion.BaseVersion(string! source, bool shouldIncrement) -> void GitVersion.VersionCalculation.BaseVersion.BaseVersion(string! source, bool shouldIncrement, GitVersion.SemanticVersion! semanticVersion, GitVersion.ICommit? baseVersionSource, string? branchNameOverride) -> void GitVersion.VersionCalculation.BaseVersion.BaseVersionSource.get -> GitVersion.ICommit? GitVersion.VersionCalculation.BaseVersion.BaseVersionSource.init -> void GitVersion.VersionCalculation.BaseVersion.BranchNameOverride.get -> string? GitVersion.VersionCalculation.BaseVersion.BranchNameOverride.init -> void -GitVersion.VersionCalculation.BaseVersion.SemanticVersion.get -> GitVersion.SemanticVersion! +GitVersion.VersionCalculation.BaseVersion.GetSemanticVersion() -> GitVersion.SemanticVersion! +GitVersion.VersionCalculation.BaseVersion.SemanticVersion.get -> GitVersion.SemanticVersion? GitVersion.VersionCalculation.BaseVersion.SemanticVersion.init -> void GitVersion.VersionCalculation.BaseVersion.ShouldIncrement.get -> bool GitVersion.VersionCalculation.BaseVersion.ShouldIncrement.init -> void @@ -678,8 +693,10 @@ GitVersion.VersionCalculation.CommitMessageIncrementMode.MergeMessageOnly = 2 -> GitVersion.VersionCalculation.IEffectiveBranchConfigurationFinder GitVersion.VersionCalculation.IEffectiveBranchConfigurationFinder.GetConfigurations(GitVersion.IBranch! branch, GitVersion.Configuration.IGitVersionConfiguration! configuration) -> System.Collections.Generic.IEnumerable! GitVersion.VersionCalculation.IIncrementStrategyFinder -GitVersion.VersionCalculation.IIncrementStrategyFinder.DetermineIncrementedField(GitVersion.ICommit? currentCommit, GitVersion.VersionCalculation.BaseVersion! baseVersion, GitVersion.Configuration.EffectiveConfiguration! configuration) -> GitVersion.VersionField +GitVersion.VersionCalculation.IIncrementStrategyFinder.DetermineIncrementedField(GitVersion.ICommit! currentCommit, GitVersion.VersionCalculation.BaseVersion! baseVersion, GitVersion.Configuration.EffectiveConfiguration! configuration) -> GitVersion.VersionField +GitVersion.VersionCalculation.IIncrementStrategyFinder.GetIncrementForcedByCommit(GitVersion.ICommit! commit, GitVersion.Configuration.EffectiveConfiguration! configuration) -> GitVersion.VersionField GitVersion.VersionCalculation.IIncrementStrategyFinder.GetIncrementForCommits(string? majorVersionBumpMessage, string? minorVersionBumpMessage, string? patchVersionBumpMessage, string? noBumpMessage, GitVersion.ICommit![]! commits) -> GitVersion.VersionField? +GitVersion.VersionCalculation.IIncrementStrategyFinder.GetMergedCommits(GitVersion.ICommit! mergeCommit, int index) -> System.Collections.Generic.IEnumerable! GitVersion.VersionCalculation.INextVersionCalculator GitVersion.VersionCalculation.INextVersionCalculator.FindVersion() -> GitVersion.VersionCalculation.NextVersion! GitVersion.VersionCalculation.IVariableProvider @@ -701,6 +718,11 @@ GitVersion.VersionCalculation.NextVersion.NextVersion(GitVersion.SemanticVersion GitVersion.VersionCalculation.VersionCalculationModule GitVersion.VersionCalculation.VersionCalculationModule.RegisterTypes(Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> void GitVersion.VersionCalculation.VersionCalculationModule.VersionCalculationModule() -> void +GitVersion.VersionCalculation.VersioningMode.ContinuousDelivery = 1 -> GitVersion.VersionCalculation.VersioningMode +GitVersion.VersionCalculation.VersioningMode.ContinuousDeployment = 2 -> GitVersion.VersionCalculation.VersioningMode +GitVersion.VersionCalculation.VersioningMode.Mainline = 3 -> GitVersion.VersionCalculation.VersioningMode +GitVersion.VersionCalculation.VersioningMode.ManualDeployment = 0 -> GitVersion.VersionCalculation.VersioningMode +GitVersion.VersionCalculation.VersioningMode.TrunkBased = 4 -> GitVersion.VersionCalculation.VersioningMode GitVersion.VersionCalculation.VersionStrategyBase GitVersion.VersionCalculation.VersionStrategyBase.Context.get -> GitVersion.GitVersionContext! GitVersion.VersionCalculation.VersionStrategyBase.VersionStrategyBase(System.Lazy! versionContext) -> void @@ -708,9 +730,6 @@ GitVersion.VersionCalculation.VersionStrategyModule GitVersion.VersionCalculation.VersionStrategyModule.RegisterTypes(Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> void GitVersion.VersionCalculation.VersionStrategyModule.VersionStrategyModule() -> void GitVersion.VersionCalculation.VersioningMode -GitVersion.VersionCalculation.VersioningMode.ContinuousDelivery = 0 -> GitVersion.VersionCalculation.VersioningMode -GitVersion.VersionCalculation.VersioningMode.ContinuousDeployment = 1 -> GitVersion.VersionCalculation.VersioningMode -GitVersion.VersionCalculation.VersioningMode.Mainline = 2 -> GitVersion.VersionCalculation.VersioningMode GitVersion.VersionField GitVersion.VersionField.Major = 3 -> GitVersion.VersionField GitVersion.VersionField.Minor = 2 -> GitVersion.VersionField @@ -760,6 +779,7 @@ readonly GitVersion.Agents.BuildAgentBase.Log -> GitVersion.Logging.ILog! static GitVersion.BranchCommit.operator !=(GitVersion.BranchCommit left, GitVersion.BranchCommit right) -> bool static GitVersion.BranchCommit.operator ==(GitVersion.BranchCommit left, GitVersion.BranchCommit right) -> bool static GitVersion.Configuration.ConfigurationExtensions.FindGitDir(this string! path) -> (string! GitDirectory, string! WorkingTreeDirectory)? +static GitVersion.Configuration.ConfigurationExtensions.GetBranchConfiguration(this GitVersion.Configuration.IGitVersionConfiguration! configuration, GitVersion.IBranch! branch) -> GitVersion.Configuration.IBranchConfiguration! static GitVersion.Configuration.ConfigurationExtensions.GetBranchConfiguration(this GitVersion.Configuration.IGitVersionConfiguration! configuration, GitVersion.ReferenceName! branchName) -> GitVersion.Configuration.IBranchConfiguration! static GitVersion.Configuration.ConfigurationExtensions.GetBranchSpecificLabel(this GitVersion.Configuration.EffectiveConfiguration! configuration, GitVersion.ReferenceName! branchName, string? branchNameOverride) -> string? static GitVersion.Configuration.ConfigurationExtensions.GetBranchSpecificLabel(this GitVersion.Configuration.EffectiveConfiguration! configuration, string? branchName, string? branchNameOverride) -> string? @@ -776,6 +796,7 @@ static GitVersion.Extensions.CommonExtensions.NotNull(this T? value, string! static GitVersion.Extensions.CommonExtensions.NotNullOrEmpty(this string? value, string! name = "") -> string! static GitVersion.Extensions.CommonExtensions.NotNullOrWhitespace(this string? value, string! name = "") -> string! static GitVersion.Extensions.DictionaryExtensions.GetOrAdd(this System.Collections.Generic.IDictionary! dict, TKey key, System.Func! getValue) -> TValue +static GitVersion.Extensions.EnumerableExtensions.AddRange(this System.Collections.Generic.ICollection! source, System.Collections.Generic.IEnumerable! items) -> void static GitVersion.Extensions.EnumerableExtensions.OnlyOrDefault(this System.Collections.Generic.IEnumerable! source) -> T? static GitVersion.Extensions.EnumerableExtensions.SingleOfType(this System.Collections.IEnumerable! source) -> T static GitVersion.Extensions.GitExtensions.CreateGitLogArgs(int? maxCommits) -> string! @@ -833,6 +854,7 @@ static GitVersion.Logging.LogExtensions.Warning(this GitVersion.Logging.ILog! lo static GitVersion.Logging.LogExtensions.Warning(this GitVersion.Logging.ILog! log, GitVersion.Logging.Verbosity verbosity, string! format, params object![]! args) -> void static GitVersion.Logging.LogExtensions.Warning(this GitVersion.Logging.ILog! log, string! format, params object![]! args) -> void static GitVersion.Logging.LogExtensions.Write(this GitVersion.Logging.ILog! log, GitVersion.Logging.LogLevel level, string! format, params object![]! args) -> void +static GitVersion.MergeMessage.TryParse(GitVersion.ICommit! mergeCommit, GitVersion.Configuration.IGitVersionConfiguration! configuration, out GitVersion.MergeMessage? mergeMessage) -> bool static GitVersion.ReferenceName.FromBranchName(string! branchName) -> GitVersion.ReferenceName! static GitVersion.ReferenceName.Parse(string! canonicalName) -> GitVersion.ReferenceName! static GitVersion.ReferenceName.TryParse(out GitVersion.ReferenceName? value, string! canonicalName) -> bool diff --git a/src/GitVersion.Core/SemVer/SemanticVersion.cs b/src/GitVersion.Core/SemVer/SemanticVersion.cs index 9bc64617f8..f7a9b7ff66 100644 --- a/src/GitVersion.Core/SemVer/SemanticVersion.cs +++ b/src/GitVersion.Core/SemVer/SemanticVersion.cs @@ -24,6 +24,8 @@ public class SemanticVersion : IFormattable, IComparable, IEqua public long Patch { get; init; } + public bool IsPreRelease => PreReleaseTag.HasTag(); + public SemanticVersionPreReleaseTag PreReleaseTag { get; init; } public SemanticVersionBuildMetaData BuildMetaData { get; init; } @@ -31,7 +33,7 @@ public class SemanticVersion : IFormattable, IComparable, IEqua public bool IsLabeledWith(string value) => PreReleaseTag.HasTag() && PreReleaseTag.Name.IsEquivalentTo(value); public bool IsMatchForBranchSpecificLabel(string? value) - => PreReleaseTag.Name.Length == 0 || value is null || IsLabeledWith(value); + => (PreReleaseTag.Name.Length == 0 && PreReleaseTag.Number is null) || value is null || IsLabeledWith(value); public SemanticVersion(long major = 0, long minor = 0, long patch = 0) { @@ -220,9 +222,24 @@ private static bool TryParseLoose(string version, [NotNullWhen(true)] out Semant return true; } - public int CompareTo(SemanticVersion? value) => CompareTo(value, true); + public bool IsGreaterThan(SemanticVersion? value, bool includePreRelease = true) + => CompareTo(value, includePreRelease) > 0; + + public bool IsGreaterThanOrEqualTo(SemanticVersion? value, bool includePreRelease = true) + => CompareTo(value, includePreRelease) >= 0; + + public bool IsLessThan(SemanticVersion? value, bool includePreRelease = true) + => CompareTo(value, includePreRelease) < 0; + + public bool IsLessThanOrEqualTo(SemanticVersion? value, bool includePreRelease = true) + => CompareTo(value, includePreRelease) <= 0; - public int CompareTo(SemanticVersion? value, bool includePrerelease) + public bool IsEqualTo(SemanticVersion? value, bool includePreRelease = true) + => CompareTo(value, includePreRelease) == 0; + + public int CompareTo(SemanticVersion? value) => CompareTo(value, includePreRelease: true); + + public int CompareTo(SemanticVersion? value, bool includePreRelease) { if (value == null) { @@ -252,7 +269,7 @@ public int CompareTo(SemanticVersion? value, bool includePrerelease) } return -1; } - if (includePrerelease && this.PreReleaseTag != value.PreReleaseTag) + if (includePreRelease && this.PreReleaseTag != value.PreReleaseTag) { if (this.PreReleaseTag > value.PreReleaseTag) { @@ -313,9 +330,6 @@ public string ToString(string? format, IFormatProvider? formatProvider) public SemanticVersion IncrementVersion(VersionField incrementStrategy) => IncrementVersion(incrementStrategy, null, isMainRelease: true); - public SemanticVersion IncrementVersion(VersionField incrementStrategy, string? label) - => IncrementVersion(incrementStrategy, label, isMainRelease: false); - private SemanticVersion IncrementVersion(VersionField incrementStrategy, string? label, bool isMainRelease) { var major = Major; @@ -370,4 +384,106 @@ private SemanticVersion IncrementVersion(VersionField incrementStrategy, string? PreReleaseTag = new SemanticVersionPreReleaseTag(preReleaseTagName, preReleaseTagNumber, true) }; } + + public SemanticVersion Increment(VersionField incrementStrategy, string? label) + => Increment(incrementStrategy, label, mode: IncrementMode.Standard); + + public SemanticVersion Increment(VersionField incrementStrategy, string? label, bool forceIncrement) + => Increment(incrementStrategy, label, mode: forceIncrement ? IncrementMode.Force : IncrementMode.Standard); + + public SemanticVersion Increment(VersionField increment, string? label, IncrementMode mode) + { + long major = Major; + long minor = Minor; + long patch = Patch; + long? preReleaseNumber = PreReleaseTag.Number; + + bool hasPreReleaseTag = PreReleaseTag.HasTag(); + + switch (increment) + { + case VersionField.None: + preReleaseNumber++; + break; + + case VersionField.Patch: + if (hasPreReleaseTag && (mode == IncrementMode.Standard + || mode == IncrementMode.EnsureIntegrity && patch != 0)) + { + preReleaseNumber++; + } + else + { + patch++; + if (preReleaseNumber.HasValue) preReleaseNumber = 1; + } + break; + + case VersionField.Minor: + if (hasPreReleaseTag && (mode == IncrementMode.Standard + || mode == IncrementMode.EnsureIntegrity && minor != 0 && patch == 0)) + { + preReleaseNumber++; + } + else + { + minor++; + patch = 0; + if (preReleaseNumber.HasValue) preReleaseNumber = 1; + } + break; + + case VersionField.Major: + if (hasPreReleaseTag && (mode == IncrementMode.Standard + || mode == IncrementMode.EnsureIntegrity && major != 0 && minor == 0 && patch == 0)) + { + preReleaseNumber++; + } + else + { + major++; + minor = 0; + patch = 0; + if (preReleaseNumber.HasValue) preReleaseNumber = 1; + } + break; + + default: + throw new ArgumentOutOfRangeException(nameof(increment)); + } + + string preReleaseTagName; + if (hasPreReleaseTag) + { + preReleaseTagName = PreReleaseTag.Name; + } + else + { + preReleaseNumber = 1; + preReleaseTagName = string.Empty; + } + + if (label is not null && preReleaseTagName != label) + { + preReleaseNumber = 1; + preReleaseTagName = label; + } + + return new SemanticVersion(this) + { + Major = major, + Minor = minor, + Patch = patch, + PreReleaseTag = new SemanticVersionPreReleaseTag(preReleaseTagName, preReleaseNumber, true) + }; + } + + public enum IncrementMode + { + Standard, + + Force, + + EnsureIntegrity + } } diff --git a/src/GitVersion.Core/VersionCalculation/Abstractions/IIncrementStrategyFinder.cs b/src/GitVersion.Core/VersionCalculation/Abstractions/IIncrementStrategyFinder.cs index c7d0c9b576..3ae1f61f25 100644 --- a/src/GitVersion.Core/VersionCalculation/Abstractions/IIncrementStrategyFinder.cs +++ b/src/GitVersion.Core/VersionCalculation/Abstractions/IIncrementStrategyFinder.cs @@ -4,10 +4,14 @@ namespace GitVersion.VersionCalculation; public interface IIncrementStrategyFinder { - VersionField DetermineIncrementedField(ICommit? currentCommit, BaseVersion baseVersion, EffectiveConfiguration configuration); + VersionField DetermineIncrementedField(ICommit currentCommit, BaseVersion baseVersion, EffectiveConfiguration configuration); VersionField? GetIncrementForCommits( string? majorVersionBumpMessage, string? minorVersionBumpMessage, string? patchVersionBumpMessage, string? noBumpMessage, ICommit[] commits ); + + IEnumerable GetMergedCommits(ICommit mergeCommit, int index); + + VersionField GetIncrementForcedByCommit(ICommit commit, EffectiveConfiguration configuration); } diff --git a/src/GitVersion.Core/VersionCalculation/IncrementStrategyFinder.cs b/src/GitVersion.Core/VersionCalculation/IncrementStrategyFinder.cs index 42849f1f9f..dfa9d667dd 100644 --- a/src/GitVersion.Core/VersionCalculation/IncrementStrategyFinder.cs +++ b/src/GitVersion.Core/VersionCalculation/IncrementStrategyFinder.cs @@ -16,7 +16,7 @@ internal class IncrementStrategyFinder : IIncrementStrategyFinder private readonly Dictionary commitIncrementCache = new(); private readonly Dictionary> headCommitsMapCache = new(); private readonly Dictionary headCommitsCache = new(); - private readonly Lazy> tagsShaCache; + private readonly Lazy> tagsShaCache; private static readonly Regex DefaultMajorPatternRegex = new(DefaultMajorPattern, RegexOptions.Compiled | RegexOptions.IgnoreCase); private static readonly Regex DefaultMinorPatternRegex = new(DefaultMinorPattern, RegexOptions.Compiled | RegexOptions.IgnoreCase); @@ -28,10 +28,10 @@ internal class IncrementStrategyFinder : IIncrementStrategyFinder public IncrementStrategyFinder(IGitRepository repository) { this.repository = repository.NotNull(); - this.tagsShaCache = new Lazy>(ReadRepositoryTagsSha); + this.tagsShaCache = new Lazy>(ReadRepositoryTagsSha); } - public VersionField DetermineIncrementedField(ICommit? currentCommit, BaseVersion baseVersion, EffectiveConfiguration configuration) + public VersionField DetermineIncrementedField(ICommit currentCommit, BaseVersion baseVersion, EffectiveConfiguration configuration) { baseVersion.NotNull(); configuration.NotNull(); @@ -104,7 +104,7 @@ public VersionField DetermineIncrementedField(ICommit? currentCommit, BaseVersio ); } - private IReadOnlySet ReadRepositoryTagsSha() => repository.Tags.Select(t => t.TargetSha).ToHashSet(); + private IReadOnlySet ReadRepositoryTagsSha() => repository.Tags.Select(t => t.TargetSha).ToHashSet(); private static Regex TryGetRegexOrDefault(string? messageRegex, Regex defaultRegex) => messageRegex == null @@ -175,4 +175,44 @@ private static IEnumerable GetCommitsReacheableFromHead(IGitRepository return repo.Commits.QueryBy(filter); } + + public IEnumerable GetMergedCommits(ICommit mergeCommit, int index) + { + mergeCommit.NotNull(); + + if (!mergeCommit.IsMergeCommit) + { + throw new ArgumentException("The parameter is not a merge commit.", nameof(mergeCommit)); + } + + ICommit baseCommit = mergeCommit.Parents.First(); + ICommit mergedCommit = GetMergedHead(mergeCommit); + if (index == 0) (mergedCommit, baseCommit) = (baseCommit, mergedCommit); + + ICommit findMergeBase = this.repository.FindMergeBase(baseCommit, mergedCommit) + ?? throw new InvalidOperationException("Cannot find the base commit of merged branch."); + + return GetIntermediateCommits(findMergeBase, mergedCommit); + } + + private static ICommit GetMergedHead(ICommit mergeCommit) + { + var parents = mergeCommit.Parents.Skip(1).ToList(); + if (parents.Count > 1) + throw new NotSupportedException("Mainline development does not support more than one merge source in a single commit yet"); + return parents.Single(); + } + + public VersionField GetIncrementForcedByCommit(ICommit commit, EffectiveConfiguration configuration) + { + commit.NotNull(); + configuration.NotNull(); + + var majorRegex = TryGetRegexOrDefault(configuration.MajorVersionBumpMessage, DefaultMajorPatternRegex); + var minorRegex = TryGetRegexOrDefault(configuration.MinorVersionBumpMessage, DefaultMinorPatternRegex); + var patchRegex = TryGetRegexOrDefault(configuration.PatchVersionBumpMessage, DefaultPatchPatternRegex); + var none = TryGetRegexOrDefault(configuration.NoBumpMessage, DefaultNoBumpPatternRegex); + + return GetIncrementFromCommit(commit, majorRegex, minorRegex, patchRegex, none) ?? VersionField.None; + } } diff --git a/src/GitVersion.Core/VersionCalculation/VersionCalculationModule.cs b/src/GitVersion.Core/VersionCalculation/VersionCalculationModule.cs index 348438ddc0..fc4e5987ef 100644 --- a/src/GitVersion.Core/VersionCalculation/VersionCalculationModule.cs +++ b/src/GitVersion.Core/VersionCalculation/VersionCalculationModule.cs @@ -11,7 +11,6 @@ public void RegisterTypes(IServiceCollection services) services.AddSingleton(); services.AddSingleton(); - services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); diff --git a/src/GitVersion.Core/VersionCalculation/VersionCalculators/ContinuousDeliveryVersionCalculator.cs b/src/GitVersion.Core/VersionCalculation/VersionCalculators/ContinuousDeliveryVersionCalculator.cs index 627bd11d30..12fcbb61fd 100644 --- a/src/GitVersion.Core/VersionCalculation/VersionCalculators/ContinuousDeliveryVersionCalculator.cs +++ b/src/GitVersion.Core/VersionCalculation/VersionCalculators/ContinuousDeliveryVersionCalculator.cs @@ -49,7 +49,7 @@ private SemanticVersion CalculateInternal(NextVersion nextVersion) } var baseVersionBuildMetaData = CreateVersionBuildMetaData(nextVersion.BaseVersion.BaseVersionSource); - return new SemanticVersion(nextVersion.BaseVersion.SemanticVersion) + return new SemanticVersion(nextVersion.BaseVersion.GetSemanticVersion()) { BuildMetaData = baseVersionBuildMetaData }; diff --git a/src/GitVersion.Core/VersionCalculation/VersionCalculators/ContinuousDeploymentVersionCalculator.cs b/src/GitVersion.Core/VersionCalculation/VersionCalculators/ContinuousDeploymentVersionCalculator.cs index 9b51505dc6..4e6d360606 100644 --- a/src/GitVersion.Core/VersionCalculation/VersionCalculators/ContinuousDeploymentVersionCalculator.cs +++ b/src/GitVersion.Core/VersionCalculation/VersionCalculators/ContinuousDeploymentVersionCalculator.cs @@ -52,7 +52,7 @@ private SemanticVersion CalculateInternal(NextVersion nextVersion) Contract.Assume(baseVersionBuildMetaData.CommitsSinceTag.HasValue); - return new SemanticVersion(nextVersion.BaseVersion.SemanticVersion) + return new SemanticVersion(nextVersion.BaseVersion.GetSemanticVersion()) { PreReleaseTag = SemanticVersionPreReleaseTag.Empty, BuildMetaData = new SemanticVersionBuildMetaData(baseVersionBuildMetaData) diff --git a/src/GitVersion.Core/VersionCalculation/VersionCalculators/MainlineVersionCalculator.cs b/src/GitVersion.Core/VersionCalculation/VersionCalculators/MainlineVersionCalculator.cs index 5fe8d8ca58..d6c6496056 100644 --- a/src/GitVersion.Core/VersionCalculation/VersionCalculators/MainlineVersionCalculator.cs +++ b/src/GitVersion.Core/VersionCalculation/VersionCalculators/MainlineVersionCalculator.cs @@ -25,15 +25,14 @@ public SemanticVersion Calculate(NextVersion nextVersion) { var baseVersion = nextVersion.BaseVersion; - if (baseVersion.SemanticVersion.PreReleaseTag.HasTag()) - //if (!nextVersion.Configuration.Label.IsNullOrEmpty()) + if (baseVersion.GetSemanticVersion().PreReleaseTag.HasTag()) { throw new NotSupportedException("Mainline development mode doesn't yet support pre-release tags on main"); } using (this.log.IndentLog("Using mainline development mode to calculate current version")) { - SemanticVersion mainlineVersion = new(baseVersion.SemanticVersion) + SemanticVersion mainlineVersion = new(baseVersion.GetSemanticVersion()) { PreReleaseTag = SemanticVersionPreReleaseTag.Empty }; @@ -175,7 +174,7 @@ private IBranch GetMainline(ICommit? baseVersionSource) this.log.Info("Found possible mainline branches: " + string.Join(", ", mainlineBranchNames)); // Find closest mainline branch - var firstMatchingCommit = Context.CurrentBranch.Commits?.FirstOrDefault(c => mainlineBranches.ContainsKey(c.Sha)); + var firstMatchingCommit = Context.CurrentBranch.Commits.FirstOrDefault(c => mainlineBranches.ContainsKey(c.Sha)); if (firstMatchingCommit is null) { var mainlineBranchList = mainlineBranches.Values.SelectMany(x => x).ToList(); diff --git a/src/GitVersion.Core/VersionCalculation/VersionCalculators/ManualDeploymentVersionCalculator.cs b/src/GitVersion.Core/VersionCalculation/VersionCalculators/ManualDeploymentVersionCalculator.cs index f37bfa69dd..6ab9f02a18 100644 --- a/src/GitVersion.Core/VersionCalculation/VersionCalculators/ManualDeploymentVersionCalculator.cs +++ b/src/GitVersion.Core/VersionCalculation/VersionCalculators/ManualDeploymentVersionCalculator.cs @@ -14,12 +14,6 @@ public SemanticVersion Calculate(NextVersion nextVersion) { using (this.log.IndentLog("Using manual deployment workflow to calculate the incremented version.")) { - var preReleaseTag = nextVersion.IncrementedVersion.PreReleaseTag; - if (!preReleaseTag.HasTag() || !preReleaseTag.Number.HasValue) - { - throw new WarningException("Manual deployment requires a pre-release tag."); - } - return CalculateInternal(nextVersion); } } @@ -31,7 +25,7 @@ private SemanticVersion CalculateInternal(NextVersion nextVersion) return CalculateIncrementedVersion(nextVersion); } - return new SemanticVersion(nextVersion.BaseVersion.SemanticVersion) + return new SemanticVersion(nextVersion.BaseVersion.GetSemanticVersion()) { BuildMetaData = CreateVersionBuildMetaData(nextVersion.BaseVersion.BaseVersionSource) }; diff --git a/src/GitVersion.Core/VersionCalculation/VersionCalculators/NextVersionCalculator.cs b/src/GitVersion.Core/VersionCalculation/VersionCalculators/NextVersionCalculator.cs index fe05014562..bfb293b1e2 100644 --- a/src/GitVersion.Core/VersionCalculation/VersionCalculators/NextVersionCalculator.cs +++ b/src/GitVersion.Core/VersionCalculation/VersionCalculators/NextVersionCalculator.cs @@ -43,13 +43,14 @@ public virtual NextVersion FindVersion() var nextVersion = CalculateNextVersion(Context.CurrentBranch, Context.Configuration); var incrementedVersion = CalculateIncrementedVersion(nextVersion.Configuration.VersioningMode, nextVersion); - return CreateNextVersion(nextVersion.BaseVersion, incrementedVersion, nextVersion.BranchConfiguration); + return new NextVersion(incrementedVersion, nextVersion.BaseVersion, nextVersion.BranchConfiguration); } private SemanticVersion CalculateIncrementedVersion(VersioningMode versioningMode, NextVersion nextVersion) { IVersionModeCalculator calculator = versioningMode switch { + VersioningMode.ManualDeployment => this.versionModeCalculators.SingleOfType(), VersioningMode.ContinuousDelivery => this.versionModeCalculators.SingleOfType(), VersioningMode.ContinuousDeployment => nextVersion.Configuration is { IsMainline: true, Label: null } ? this.versionModeCalculators.SingleOfType() @@ -87,7 +88,7 @@ private NextVersion CalculateNextVersion(IBranch branch, IGitVersionConfiguratio { // If the maximal version has no pre-release tag defined than we want to determine just the latest previous // base source which are not coming from pre-release tag. - filteredVersions = filteredVersions.Where(v => !v.BaseVersion.SemanticVersion.PreReleaseTag.HasTag()); + filteredVersions = filteredVersions.Where(v => !v.BaseVersion.GetSemanticVersion().PreReleaseTag.HasTag()); } var versions = filteredVersions as NextVersion[] ?? filteredVersions.ToArray(); @@ -106,22 +107,15 @@ private NextVersion CalculateNextVersion(IBranch branch, IGitVersionConfiguratio var calculatedBase = new BaseVersion( maxVersion.BaseVersion.Source, maxVersion.BaseVersion.ShouldIncrement, - maxVersion.BaseVersion.SemanticVersion, + maxVersion.BaseVersion.GetSemanticVersion(), latestBaseVersionSource, maxVersion.BaseVersion.BranchNameOverride ); log.Info($"Base version used: {calculatedBase}"); log.Separator(); - return CreateNextVersion(calculatedBase, maxVersion.IncrementedVersion, maxVersion.BranchConfiguration); - } - - private static NextVersion CreateNextVersion(BaseVersion baseVersion, SemanticVersion incrementedVersion, EffectiveBranchConfiguration effectiveBranchConfiguration) - { - incrementedVersion.NotNull(); - baseVersion.NotNull(); - return new(incrementedVersion, baseVersion, effectiveBranchConfiguration); + return new NextVersion(maxVersion.IncrementedVersion, calculatedBase, maxVersion.BranchConfiguration); } private static NextVersion CompareVersions(NextVersion versions1, NextVersion version2) @@ -200,7 +194,7 @@ private bool TryGetNextVersion([NotNullWhen(true)] out NextVersion? result, var incrementedVersion = GetIncrementedVersion(effectiveConfiguration, baseVersion, label); if (incrementedVersion.IsMatchForBranchSpecificLabel(label)) { - result = CreateNextVersion(baseVersion, incrementedVersion, effectiveConfiguration); + result = new NextVersion(incrementedVersion, baseVersion, effectiveConfiguration); } return result is not null; @@ -208,12 +202,39 @@ private bool TryGetNextVersion([NotNullWhen(true)] out NextVersion? result, private SemanticVersion GetIncrementedVersion(EffectiveBranchConfiguration configuration, BaseVersion baseVersion, string? label) { - var incrementStrategy = incrementStrategyFinder.DetermineIncrementedField( - currentCommit: Context.CurrentCommit, - baseVersion: baseVersion, - configuration: configuration.Value - ); - return baseVersion.SemanticVersion.IncrementVersion(incrementStrategy, label); + if (baseVersion is BaseVersionV2 baseVersionV2) + { + if (baseVersion.ShouldIncrement) + { + SemanticVersion result = baseVersionV2.GetSemanticVersion().Increment( + baseVersionV2.Increment, baseVersionV2.Label, baseVersionV2.ForceIncrement + ); + + if (result.IsLessThan(baseVersionV2.AlternativeSemanticVersion, includePreRelease: false)) + { + result = new SemanticVersion(result) + { + Major = baseVersionV2.AlternativeSemanticVersion!.Major, + Minor = baseVersionV2.AlternativeSemanticVersion.Minor, + Patch = baseVersionV2.AlternativeSemanticVersion.Patch + }; + } + return result; + } + else + { + return baseVersion.GetSemanticVersion(); + } + } + else + { + var incrementStrategy = incrementStrategyFinder.DetermineIncrementedField( + currentCommit: Context.CurrentCommit, + baseVersion: baseVersion, + configuration: configuration.Value + ); + return baseVersion.GetSemanticVersion().Increment(incrementStrategy, label); + } } private bool IncludeVersion(BaseVersion baseVersion, IIgnoreConfiguration ignoreConfiguration) diff --git a/src/GitVersion.Core/VersionCalculation/VersionCalculators/NonTrunkBasedVersionCalculatorBase.cs b/src/GitVersion.Core/VersionCalculation/VersionCalculators/NonTrunkBasedVersionCalculatorBase.cs index 9194ecaafb..dbed1dbbbf 100644 --- a/src/GitVersion.Core/VersionCalculation/VersionCalculators/NonTrunkBasedVersionCalculatorBase.cs +++ b/src/GitVersion.Core/VersionCalculation/VersionCalculators/NonTrunkBasedVersionCalculatorBase.cs @@ -1,5 +1,4 @@ using GitVersion.Common; -using GitVersion.Configuration; using GitVersion.Extensions; using GitVersion.Logging; @@ -22,15 +21,12 @@ public NonTrunkBasedVersionCalculatorBase(ILog log, IRepositoryStore repositoryS protected bool ShouldTakeIncrementedVersion(NextVersion nextVersion) { - var label = nextVersion.Configuration.GetBranchSpecificLabel( - Context.CurrentBranch.Name, nextVersion.BaseVersion.BranchNameOverride - ); + nextVersion.NotNull(); - //// // TODO: We need to decide whether or not to calculate the upcoming semantic version or the previous one because of tagging. Actually this should be part of the branch configuration system. - return Context.CurrentCommit?.Sha != nextVersion.BaseVersion.BaseVersionSource?.Sha - || Context.CurrentCommitTaggedVersion == null - || !Context.CurrentCommitTaggedVersion.IsMatchForBranchSpecificLabel(label); + return Context.CurrentCommit.Sha != nextVersion.BaseVersion.BaseVersionSource?.Sha + || Context.CurrentCommitTaggedVersion is null + || nextVersion.BaseVersion.SemanticVersion != Context.CurrentCommitTaggedVersion; // } diff --git a/src/GitVersion.Core/VersionCalculation/VersionCalculators/TrunkBasedVersionCalculator.cs b/src/GitVersion.Core/VersionCalculation/VersionCalculators/TrunkBasedVersionCalculator.cs deleted file mode 100644 index 43669a17fa..0000000000 --- a/src/GitVersion.Core/VersionCalculation/VersionCalculators/TrunkBasedVersionCalculator.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace GitVersion.VersionCalculation; - -internal sealed class TrunkBasedVersionCalculator : IVersionModeCalculator -{ - // TODO: Please implement trunk based version here and remove MainlineVersionCalculator. - public SemanticVersion Calculate(NextVersion nextVersion) => - throw new NotImplementedException("Trunk based version calculation is not yet implemented. Use Mainline mode instead."); -} diff --git a/src/GitVersion.Core/VersionCalculation/VersionSearchStrategies/BaseVersion.cs b/src/GitVersion.Core/VersionCalculation/VersionSearchStrategies/BaseVersion.cs index 5f28bbab65..71279ff18b 100644 --- a/src/GitVersion.Core/VersionCalculation/VersionSearchStrategies/BaseVersion.cs +++ b/src/GitVersion.Core/VersionCalculation/VersionSearchStrategies/BaseVersion.cs @@ -4,6 +4,12 @@ namespace GitVersion.VersionCalculation; public class BaseVersion { + public BaseVersion(string source, bool shouldIncrement) + { + Source = source.NotNullOrEmpty(); + ShouldIncrement = shouldIncrement; + } + public BaseVersion(string source, bool shouldIncrement, SemanticVersion semanticVersion, ICommit? baseVersionSource, string? branchNameOverride) { Source = source; @@ -28,7 +34,9 @@ public BaseVersion(BaseVersion baseVersion) public bool ShouldIncrement { get; init; } - public SemanticVersion SemanticVersion { get; init; } + public SemanticVersion? SemanticVersion { get; init; } + + public SemanticVersion GetSemanticVersion() => SemanticVersion ?? SemanticVersion.Empty; public ICommit? BaseVersionSource { get; init; } @@ -37,6 +45,6 @@ public BaseVersion(BaseVersion baseVersion) public override string ToString() { var externalSource = BaseVersionSource == null ? "External Source" : BaseVersionSource.Sha; - return $"{Source}: {SemanticVersion:f} with commit source '{externalSource}'"; + return $"{Source}: {GetSemanticVersion():f} with commit source '{externalSource}'"; } } diff --git a/src/GitVersion.Core/VersionCalculation/VersionSearchStrategies/BaseVersionV2.cs b/src/GitVersion.Core/VersionCalculation/VersionSearchStrategies/BaseVersionV2.cs new file mode 100644 index 0000000000..f948fea0b6 --- /dev/null +++ b/src/GitVersion.Core/VersionCalculation/VersionSearchStrategies/BaseVersionV2.cs @@ -0,0 +1,88 @@ +namespace GitVersion.VersionCalculation; + +// TODO: The fact that BaseVersionV2 is extending BaseVersion is a temporary construct because we want to have a clear focus on the new functionality of the TrunkBased strategy. In long term we need to consolidate this two types in one type. +internal class BaseVersionV2 : BaseVersion +{ + internal static BaseVersionV2 ShouldIncrementFalse(string source, ICommit? baseVersionSource, string? label, SemanticVersion? alternativeSemanticVersion = null) => new(source, false) + { + BaseVersionSource = baseVersionSource, + Increment = VersionField.None, + SemanticVersion = null, + Label = label, + AlternativeSemanticVersion = alternativeSemanticVersion + }; + + internal static BaseVersionV2 ShouldIncrementFalse(string source, ICommit? baseVersionSource, SemanticVersion semanticVersion) => new(source, false) + { + BaseVersionSource = baseVersionSource, + Increment = VersionField.None, + SemanticVersion = semanticVersion + }; + + internal static BaseVersionV2 ShouldIncrementTrue(string source, ICommit? baseVersionSource, VersionField increment, string? label, bool forceIncrement, SemanticVersion? alternativeSemanticVersion = null) => new(source, true) + { + BaseVersionSource = baseVersionSource, + Increment = increment, + Label = label, + ForceIncrement = forceIncrement, + AlternativeSemanticVersion = alternativeSemanticVersion + }; + + public BaseVersionV2(string source, bool shouldIncrement) : base(source, shouldIncrement) + { + } + + public BaseVersionV2(string source, bool shouldIncrement, SemanticVersion semanticVersion, ICommit? baseVersionSource, string? branchNameOverride) + : base(source, shouldIncrement, semanticVersion, baseVersionSource, branchNameOverride) + { + } + + public bool ForceIncrement { get; init; } + + public VersionField Increment { get; init; } + + public string? Label { get; init; } + + internal SemanticVersion? AlternativeSemanticVersion { get; init; } + + public override string ToString() + { + var commitSource = BaseVersionSource?.Id.ToString(7) ?? "External"; + + StringBuilder stringBuilder = new(); + if (ShouldIncrement) + { + stringBuilder.Append($"{Source}: "); + if (ForceIncrement) + stringBuilder.Append("Force version increment "); + else + { + stringBuilder.Append("Version increment "); + } + + if (SemanticVersion is not null) + stringBuilder.Append($"'{SemanticVersion:f}' "); + + stringBuilder.Append($"+semver '{Increment}'"); + + if (Label is null) + stringBuilder.Append(" with no label"); + else + { + stringBuilder.Append($" with label '{Label}'"); + } + } + else if (SemanticVersion is null) + { + stringBuilder.Append($"{Source}: Label as '{Label}'"); + } + else + { + stringBuilder.Append($"{Source}: Take '{GetSemanticVersion():f}'"); + } + + if (BaseVersionSource is not null) + stringBuilder.Append($" based on commit '{commitSource}'."); + return stringBuilder.ToString(); + } +} diff --git a/src/GitVersion.Core/VersionCalculation/VersionSearchStrategies/MergeMessageVersionStrategy.cs b/src/GitVersion.Core/VersionCalculation/VersionSearchStrategies/MergeMessageVersionStrategy.cs index 6d3c83dc16..53f4bb0aae 100644 --- a/src/GitVersion.Core/VersionCalculation/VersionSearchStrategies/MergeMessageVersionStrategy.cs +++ b/src/GitVersion.Core/VersionCalculation/VersionSearchStrategies/MergeMessageVersionStrategy.cs @@ -24,7 +24,7 @@ public MergeMessageVersionStrategy(ILog log, Lazy versionCont public override IEnumerable GetBaseVersions(EffectiveBranchConfiguration configuration) { - if (Context.CurrentBranch.Commits == null || Context.CurrentCommit == null || !configuration.Value.TrackMergeMessage) + if (!configuration.Value.TrackMergeMessage || Context.Configuration.VersioningMode == VersioningMode.TrunkBased) return Enumerable.Empty(); var commitsPriorToThan = Context.CurrentBranch.Commits.GetCommitsPriorTo(Context.CurrentCommit.When); diff --git a/src/GitVersion.Core/VersionCalculation/VersionSearchStrategies/TaggedCommitVersionStrategy.cs b/src/GitVersion.Core/VersionCalculation/VersionSearchStrategies/TaggedCommitVersionStrategy.cs index 48cc0b89f0..13a4be0e4b 100644 --- a/src/GitVersion.Core/VersionCalculation/VersionSearchStrategies/TaggedCommitVersionStrategy.cs +++ b/src/GitVersion.Core/VersionCalculation/VersionSearchStrategies/TaggedCommitVersionStrategy.cs @@ -1,5 +1,5 @@ -using GitVersion.Common; using GitVersion.Configuration; +using GitVersion.Core; using GitVersion.Extensions; namespace GitVersion.VersionCalculation; @@ -11,72 +11,26 @@ namespace GitVersion.VersionCalculation; /// internal sealed class TaggedCommitVersionStrategy : VersionStrategyBase { - private readonly IRepositoryStore repositoryStore; + private readonly ITaggedSemanticVersionRepository taggedSemanticVersionRepository; - public TaggedCommitVersionStrategy(IRepositoryStore repositoryStore, Lazy versionContext) - : base(versionContext) => this.repositoryStore = repositoryStore.NotNull(); + public TaggedCommitVersionStrategy(ITaggedSemanticVersionRepository taggedSemanticVersionRepository, Lazy versionContext) + : base(versionContext) => this.taggedSemanticVersionRepository = taggedSemanticVersionRepository.NotNull(); public override IEnumerable GetBaseVersions(EffectiveBranchConfiguration configuration) - => GetSemanticVersions(configuration).Select(CreateBaseVersion); + => Context.Configuration.VersioningMode == VersioningMode.TrunkBased ? Enumerable.Empty() + : GetTaggedSemanticVersions(configuration).Select(CreateBaseVersion); - private IEnumerable GetSemanticVersions(EffectiveBranchConfiguration configuration) + private IEnumerable GetTaggedSemanticVersions(EffectiveBranchConfiguration configuration) { - var alreadyReturnedValues = new HashSet(); - - var olderThan = Context.CurrentCommit?.When; + configuration.NotNull(); var label = configuration.Value.GetBranchSpecificLabel(Context.CurrentBranch.Name, null); - - var semanticVersions = this.repositoryStore.GetTaggedSemanticVersions( - Context.Configuration.TagPrefix, Context.Configuration.SemanticVersionFormat - ).ToList(); - ILookup semanticVersionsByCommit = semanticVersions.ToLookup(element => element.Tag.Commit.Id.Sha); - - var commitsOnCurrentBranch = Context.CurrentBranch.Commits?.ToArray() ?? Array.Empty(); - if (commitsOnCurrentBranch.Any()) - { - foreach (var commit in commitsOnCurrentBranch) - { - foreach (var semanticVersion in semanticVersionsByCommit[commit.Id.Sha]) - { - if (commit.When <= olderThan && semanticVersion.Value.IsMatchForBranchSpecificLabel(label)) - { - if (alreadyReturnedValues.Add(semanticVersion)) yield return semanticVersion; - } - } - } - - if (configuration.Value.TrackMergeTarget) - { - var commitsOnCurrentBranchByCommit = commitsOnCurrentBranch.ToLookup(commit => commit.Id.Sha); - foreach (var semanticVersion in semanticVersions) - { - if (semanticVersion.Tag.Commit.When > olderThan) continue; - - var parentCommits = semanticVersion.Tag.Commit.Parents ?? Array.Empty(); - if (parentCommits.Any(element => commitsOnCurrentBranchByCommit.Contains(element.Id.Sha)) - && semanticVersion.Value.IsMatchForBranchSpecificLabel(label)) - { - if (alreadyReturnedValues.Add(semanticVersion)) yield return semanticVersion; - } - } - } - } - - if (configuration.Value.TracksReleaseBranches) + foreach (var semanticVersion in taggedSemanticVersionRepository + .GetTaggedSemanticVersions(Context.CurrentBranch, configuration.Value).SelectMany(element => element)) { - foreach (var mainBranch in this.repositoryStore.FindMainlineBranches(Context.Configuration)) + if (semanticVersion.Value.IsMatchForBranchSpecificLabel(label)) { - foreach (var commit in mainBranch.Commits?.ToArray() ?? Array.Empty()) - { - foreach (var semanticVersion in semanticVersionsByCommit[commit.Id.Sha]) - { - if (semanticVersion.Value.IsMatchForBranchSpecificLabel(label)) - { - if (alreadyReturnedValues.Add(semanticVersion)) yield return semanticVersion; - } - } - } + yield return semanticVersion; } } } diff --git a/src/GitVersion.Core/VersionCalculation/VersionSearchStrategies/TrackReleaseBranchesVersionStrategy.cs b/src/GitVersion.Core/VersionCalculation/VersionSearchStrategies/TrackReleaseBranchesVersionStrategy.cs index 2c6cd59e99..fe3b9563ee 100644 --- a/src/GitVersion.Core/VersionCalculation/VersionSearchStrategies/TrackReleaseBranchesVersionStrategy.cs +++ b/src/GitVersion.Core/VersionCalculation/VersionSearchStrategies/TrackReleaseBranchesVersionStrategy.cs @@ -33,8 +33,12 @@ public TrackReleaseBranchesVersionStrategy(IRepositoryStore repositoryStore, Laz this.releaseVersionStrategy = new VersionInBranchNameVersionStrategy(repositoryStore, versionContext); } - public override IEnumerable GetBaseVersions(EffectiveBranchConfiguration configuration) => - configuration.Value.TracksReleaseBranches ? ReleaseBranchBaseVersions() : Array.Empty(); + public override IEnumerable GetBaseVersions(EffectiveBranchConfiguration configuration) + { + if (Context.Configuration.VersioningMode == VersioningMode.TrunkBased) return Enumerable.Empty(); + + return configuration.Value.TracksReleaseBranches ? ReleaseBranchBaseVersions() : Array.Empty(); + } private IEnumerable ReleaseBranchBaseVersions() { @@ -53,7 +57,7 @@ private IEnumerable ReleaseBranchBaseVersions() var source1 = "Release branch exists -> " + baseVersion.Source; return new BaseVersion(source1, baseVersion.ShouldIncrement, - baseVersion.SemanticVersion, + baseVersion.GetSemanticVersion(), baseVersion.BaseVersionSource, null); }) @@ -67,6 +71,6 @@ private IEnumerable GetReleaseVersion(IBranch releaseBranch) var effectiveBranchConfiguration = Context.Configuration.GetEffectiveBranchConfiguration(releaseBranch); return this.releaseVersionStrategy .GetBaseVersions(effectiveBranchConfiguration) - .Select(b => new BaseVersion(b.Source, true, b.SemanticVersion, baseSource, b.BranchNameOverride)); + .Select(b => new BaseVersion(b.Source, true, b.GetSemanticVersion(), baseSource, b.BranchNameOverride)); } } diff --git a/src/GitVersion.Core/VersionCalculation/VersionSearchStrategies/VersionInBranchNameVersionStrategy.cs b/src/GitVersion.Core/VersionCalculation/VersionSearchStrategies/VersionInBranchNameVersionStrategy.cs index d5e0997ad5..934388323e 100644 --- a/src/GitVersion.Core/VersionCalculation/VersionSearchStrategies/VersionInBranchNameVersionStrategy.cs +++ b/src/GitVersion.Core/VersionCalculation/VersionSearchStrategies/VersionInBranchNameVersionStrategy.cs @@ -19,6 +19,8 @@ public VersionInBranchNameVersionStrategy(IRepositoryStore repositoryStore, Lazy public override IEnumerable GetBaseVersions(EffectiveBranchConfiguration configuration) { + if (Context.Configuration.VersioningMode == VersioningMode.TrunkBased) yield break; + if (configuration.Value.IsReleaseBranch && TryGetBaseVersion(out var baseVersion, configuration)) { yield return baseVersion; diff --git a/src/GitVersion.Core/VersionCalculation/VersioningMode.cs b/src/GitVersion.Core/VersionCalculation/VersioningMode.cs index d4f5b4d9fe..b26d7804ef 100644 --- a/src/GitVersion.Core/VersionCalculation/VersioningMode.cs +++ b/src/GitVersion.Core/VersionCalculation/VersioningMode.cs @@ -2,7 +2,9 @@ namespace GitVersion.VersionCalculation; public enum VersioningMode { + ManualDeployment, ContinuousDelivery, ContinuousDeployment, - Mainline + Mainline, + TrunkBased } diff --git a/src/GitVersion.LibGit2Sharp/Git/Branch.cs b/src/GitVersion.LibGit2Sharp/Git/Branch.cs index 389f6d696b..8bd1a8e361 100644 --- a/src/GitVersion.LibGit2Sharp/Git/Branch.cs +++ b/src/GitVersion.LibGit2Sharp/Git/Branch.cs @@ -19,12 +19,12 @@ internal Branch(LibGit2Sharp.Branch branch) Tip = commit is null ? null : new Commit(commit); var commits = this.innerBranch.Commits; - Commits = commits is null ? null : new CommitCollection(commits); + Commits = new CommitCollection(commits); } public ReferenceName Name { get; } public ICommit? Tip { get; } - public ICommitCollection? Commits { get; } + public ICommitCollection Commits { get; } public int CompareTo(IBranch? other) => comparerHelper.Compare(this, other); public bool Equals(IBranch? other) => equalityHelper.Equals(this, other); public bool IsDetachedHead => Name.Canonical.Equals("(no branch)", StringComparison.OrdinalIgnoreCase); diff --git a/src/GitVersion.LibGit2Sharp/Git/Tag.cs b/src/GitVersion.LibGit2Sharp/Git/Tag.cs index 01d9225bb1..1a602de843 100644 --- a/src/GitVersion.LibGit2Sharp/Git/Tag.cs +++ b/src/GitVersion.LibGit2Sharp/Git/Tag.cs @@ -21,7 +21,7 @@ internal Tag(LibGit2Sharp.Tag tag) public ReferenceName Name { get; } public int CompareTo(ITag? other) => comparerHelper.Compare(this, other); public bool Equals(ITag? other) => equalityHelper.Equals(this, other); - public string? TargetSha => this.innerTag.Target.Sha; + public string TargetSha => this.innerTag.Target.Sha; public ICommit Commit => _commitLazy.Value.NotNull(); private ICommit? PeeledTargetCommit() diff --git a/src/GitVersion.Testing/Fixtures/RepositoryFixtureBase.cs b/src/GitVersion.Testing/Fixtures/RepositoryFixtureBase.cs index 68fc960499..f0df4c0107 100644 --- a/src/GitVersion.Testing/Fixtures/RepositoryFixtureBase.cs +++ b/src/GitVersion.Testing/Fixtures/RepositoryFixtureBase.cs @@ -118,6 +118,17 @@ public void MergeNoFF(string mergeSource) Repository.MergeNoFF(mergeSource, Generate.SignatureNow()); } + public void MergeTo(string branchName, bool removeBranchAfterMerging = false) + { + string mergeSource = Repository.Head.FriendlyName; + Checkout(branchName); + MergeNoFF(mergeSource); + if (removeBranchAfterMerging) + { + Remove(mergeSource); + } + } + /// /// Clones the repository managed by this fixture into another LocalRepositoryFixture ///