diff --git a/src/GitVersionCore.Tests/IntegrationTests/BranchWithoutCommitScenarios.cs b/src/GitVersionCore.Tests/IntegrationTests/BranchWithoutCommitScenarios.cs index 095a634ca0..7dd5ad5ed7 100644 --- a/src/GitVersionCore.Tests/IntegrationTests/BranchWithoutCommitScenarios.cs +++ b/src/GitVersionCore.Tests/IntegrationTests/BranchWithoutCommitScenarios.cs @@ -1,7 +1,8 @@ using GitTools.Testing; +using GitVersion.Model.Configuration; +using NUnit.Framework; using GitVersionCore.Tests.Helpers; using LibGit2Sharp; -using NUnit.Framework; namespace GitVersionCore.Tests.IntegrationTests { @@ -36,5 +37,34 @@ public void BranchVersionHavePrecedenceOverTagVersionIfVersionGreaterThanTag() fixture.AssertFullSemver("1.0.0-beta.1+0"); } + + [Test] + public void BetaBranchCreatedButStillOnTaggedAlphaCommitShouldCreateBetaVersion() + { + // Arrange + var config = new Config + { + Branches = + { + { "release", new BranchConfig { Tag = "beta" } }, + { "develop", new BranchConfig { Tag = "alpha" } } + } + }; + + // Act + using var fixture = new BaseGitFlowRepositoryFixture("1.0.0"); + fixture.Checkout("develop"); + fixture.MakeATaggedCommit("1.1.0-alpha.1"); // assuming this has been build as 1.1.0-alpha.1 + + fixture.BranchTo("release/1.1.0"); // about to be released, no additional empty commit in this scenario! + fixture.Checkout("release/1.1.0"); // still on the same commit, but another branch, choosing to build same code as beta now + + // Assert + fixture.AssertFullSemver("1.1.0-beta.1", config); //Tag is an "alpha" tag from develop branch, only "beta" tags should count when on release branch. If no beta tag found, build new beta version on release branch. + + fixture.Checkout("develop"); // back to develop + fixture.AssertFullSemver("1.1.0-alpha.1", config); //will be 1.1.0-alpha.1 based on tag (as before) + + } } } diff --git a/src/GitVersionCore.Tests/IntegrationTests/FeatureBranchScenarios.cs b/src/GitVersionCore.Tests/IntegrationTests/FeatureBranchScenarios.cs index b9129d88ff..415006de74 100644 --- a/src/GitVersionCore.Tests/IntegrationTests/FeatureBranchScenarios.cs +++ b/src/GitVersionCore.Tests/IntegrationTests/FeatureBranchScenarios.cs @@ -92,6 +92,11 @@ public void ShouldNotUseNumberInFeatureBranchAsPreReleaseNumberOffDevelop() fixture.Repository.MakeCommits(5); fixture.AssertFullSemver("1.1.0-JIRA-123.1+5"); + + Commands.Checkout(fixture.Repository, "develop"); + fixture.Repository.MergeNoFF("feature/JIRA-123"); + + fixture.AssertFullSemver("1.1.0-alpha.6"); } [Test] @@ -104,6 +109,11 @@ public void ShouldNotUseNumberInFeatureBranchAsPreReleaseNumberOffMaster() fixture.Repository.MakeCommits(5); fixture.AssertFullSemver("1.0.1-JIRA-123.1+5"); + + Commands.Checkout(fixture.Repository, "master"); + fixture.Repository.MergeNoFF("feature/JIRA-123"); + + fixture.AssertFullSemver("1.0.1+6"); } [Test] diff --git a/src/GitVersionCore.Tests/IntegrationTests/ReleaseBranchScenarios.cs b/src/GitVersionCore.Tests/IntegrationTests/ReleaseBranchScenarios.cs index c20f8f01b9..b797226e5d 100644 --- a/src/GitVersionCore.Tests/IntegrationTests/ReleaseBranchScenarios.cs +++ b/src/GitVersionCore.Tests/IntegrationTests/ReleaseBranchScenarios.cs @@ -168,6 +168,61 @@ public void WhenReleaseBranchOffDevelopIsMergedIntoMasterAndDevelopVersionIsTake fixture.AssertFullSemver("2.0.0+2"); } + [Test] + public void WhenReleaseBranchOffDevelopIsMergedFFIntoMasterAndDevelopVersionIsTakenWithIt() + { + var config = new Config + { + Branches = + { + { "release", new BranchConfig { Tag = "beta" } }, + { "develop", new BranchConfig { Tag = "alpha" } } + } + }; + + using var fixture = new EmptyRepositoryFixture(); + fixture.Repository.MakeATaggedCommit("1.0.3"); + fixture.Repository.CreateBranch("develop"); + fixture.Repository.MakeCommits(1); + + fixture.Repository.CreateBranch("release-2.0.0"); + fixture.Checkout("release-2.0.0"); + fixture.Repository.MakeCommits(4); + fixture.Checkout("master"); + fixture.Repository.Merge("release-2.0.0", Generate.SignatureNow()); + + fixture.AssertFullSemver("2.0.0+0", config); + } + + [Test] + public void WhenTaggedReleaseBranchOffDevelopIsMergedFFIntoMasterAndDevelopVersionIsTakenWithIt() + { + var config = new Config + { + Branches = + { + { "release", new BranchConfig { Tag = "beta" } }, + { "develop", new BranchConfig { Tag = "alpha" } } + } + }; + + using var fixture = new EmptyRepositoryFixture(); + fixture.Repository.MakeATaggedCommit("1.0.3"); + fixture.Repository.CreateBranch("develop"); + fixture.Repository.MakeCommits(1); + + fixture.Repository.CreateBranch("release-2.0.0"); + fixture.Checkout("release-2.0.0"); + fixture.Repository.MakeCommits(4); + fixture.Repository.MakeATaggedCommit("2.0.0-beta.1+4"); + fixture.AssertFullSemver("2.0.0-beta.1+4", config); + fixture.Checkout("master"); + fixture.Repository.Merge("release-2.0.0", Generate.SignatureNow()); + + // Do not take tag into account since tag is a "beta" tag on the "release" branch but now "master" is checked out + fixture.AssertFullSemver("2.0.0+0", config); + } + [Test] public void WhenReleaseBranchOffMasterIsMergedIntoMasterVersionIsTakenWithIt() { diff --git a/src/GitVersionCore.Tests/VersionCalculation/SemanticVersionTests.cs b/src/GitVersionCore.Tests/VersionCalculation/SemanticVersionTests.cs index 5053aa3423..24623548b5 100644 --- a/src/GitVersionCore.Tests/VersionCalculation/SemanticVersionTests.cs +++ b/src/GitVersionCore.Tests/VersionCalculation/SemanticVersionTests.cs @@ -41,7 +41,7 @@ public void ValidateVersionParsing( { fullFormattedVersionString ??= versionString; - SemanticVersion.TryParse(versionString, tagPrefixRegex, out var version).ShouldBe(true, versionString); + SemanticVersion.TryParse(versionString, tagPrefixRegex, tag, out var version).ShouldBe(true, versionString); Assert.AreEqual(major, version.Major); Assert.AreEqual(minor, version.Minor); Assert.AreEqual(patch, version.Patch); @@ -58,7 +58,7 @@ public void ValidateVersionParsing( [TestCase("some-T-ext")] public void ValidateInvalidVersionParsing(string versionString) { - Assert.IsFalse(SemanticVersion.TryParse(versionString, null, out _), "TryParse Result"); + Assert.IsFalse(SemanticVersion.TryParse(versionString, null, null, out _), "TryParse Result"); } [Test] @@ -74,16 +74,16 @@ public void LegacySemVerTest() [Test] public void VersionSorting() { - SemanticVersion.Parse("1.0.0", null).ShouldBeGreaterThan(SemanticVersion.Parse("1.0.0-beta", null)); - SemanticVersion.Parse("1.0.0-beta.2", null).ShouldBeGreaterThan(SemanticVersion.Parse("1.0.0-beta.1", null)); - SemanticVersion.Parse("1.0.0-beta.1", null).ShouldBeLessThan(SemanticVersion.Parse("1.0.0-beta.2", null)); + SemanticVersion.Parse("1.0.0", null, null).ShouldBeGreaterThan(SemanticVersion.Parse("1.0.0-beta", null, null)); + SemanticVersion.Parse("1.0.0-beta.2", null, null).ShouldBeGreaterThan(SemanticVersion.Parse("1.0.0-beta.1", null, null)); + SemanticVersion.Parse("1.0.0-beta.1", null, null).ShouldBeLessThan(SemanticVersion.Parse("1.0.0-beta.2", null, null)); } [Test] public void ToStringJTests() { - Assert.AreEqual("1.2.3", SemanticVersion.Parse("1.2.3", null).ToString("j")); - Assert.AreEqual("1.2.3", SemanticVersion.Parse("1.2.3-beta.4", null).ToString("j")); + Assert.AreEqual("1.2.3", SemanticVersion.Parse("1.2.3", null, null).ToString("j")); + Assert.AreEqual("1.2.3", SemanticVersion.Parse("1.2.3-beta.4", null, "beta").ToString("j")); var fullSemVer = new SemanticVersion { Major = 1, @@ -103,8 +103,8 @@ public void ToStringJTests() [Test] public void ToStringSTests() { - Assert.AreEqual("1.2.3", SemanticVersion.Parse("1.2.3", null).ToString("s")); - Assert.AreEqual("1.2.3-beta.4", SemanticVersion.Parse("1.2.3-beta.4", null).ToString("s")); + Assert.AreEqual("1.2.3", SemanticVersion.Parse("1.2.3", null, null).ToString("s")); + Assert.AreEqual("1.2.3-beta.4", SemanticVersion.Parse("1.2.3-beta.4", null, null).ToString("s")); var fullSemVer = new SemanticVersion { Major = 1, @@ -139,8 +139,8 @@ public void ToStringSTests() [Test] public void ToStringLTests() { - Assert.AreEqual("1.2.3", SemanticVersion.Parse("1.2.3", null).ToString("l")); - Assert.AreEqual("1.2.3-beta4", SemanticVersion.Parse("1.2.3-beta.4", null).ToString("l")); + Assert.AreEqual("1.2.3", SemanticVersion.Parse("1.2.3", null, null).ToString("l")); + Assert.AreEqual("1.2.3-beta4", SemanticVersion.Parse("1.2.3-beta.4", null, null).ToString("l")); var fullSemVer = new SemanticVersion { Major = 1, @@ -160,8 +160,8 @@ public void ToStringLTests() [Test] public void ToStringLpTests() { - Assert.AreEqual("1.2.3", SemanticVersion.Parse("1.2.3", null).ToString("lp")); - Assert.AreEqual("1.2.3-beta0004", SemanticVersion.Parse("1.2.3-beta.4", null).ToString("lp")); + Assert.AreEqual("1.2.3", SemanticVersion.Parse("1.2.3", null, null).ToString("lp")); + Assert.AreEqual("1.2.3-beta0004", SemanticVersion.Parse("1.2.3-beta.4", null, null).ToString("lp")); var fullSemVer = new SemanticVersion { Major = 1, @@ -181,9 +181,9 @@ public void ToStringLpTests() [Test] public void ToStringTests() { - Assert.AreEqual("1.2.3", SemanticVersion.Parse("1.2.3", null).ToString()); - Assert.AreEqual("1.2.3-beta.4", SemanticVersion.Parse("1.2.3-beta.4", null).ToString()); - Assert.AreEqual("1.2.3-beta.4", SemanticVersion.Parse("1.2.3-beta.4+5", null).ToString()); + Assert.AreEqual("1.2.3", SemanticVersion.Parse("1.2.3", null, null).ToString()); + Assert.AreEqual("1.2.3-beta.4", SemanticVersion.Parse("1.2.3-beta.4", null, null).ToString()); + Assert.AreEqual("1.2.3-beta.4", SemanticVersion.Parse("1.2.3-beta.4+5", null, null).ToString()); var fullSemVer = new SemanticVersion { Major = 1, @@ -218,9 +218,9 @@ public void ToStringTests() [Test] public void ToStringFTests() { - Assert.AreEqual("1.2.3", SemanticVersion.Parse("1.2.3", null).ToString("f")); - Assert.AreEqual("1.2.3-beta.4", SemanticVersion.Parse("1.2.3-beta.4", null).ToString("f")); - Assert.AreEqual("1.2.3-beta.4+5", SemanticVersion.Parse("1.2.3-beta.4+5", null).ToString("f")); + Assert.AreEqual("1.2.3", SemanticVersion.Parse("1.2.3", null, null).ToString("f")); + Assert.AreEqual("1.2.3-beta.4", SemanticVersion.Parse("1.2.3-beta.4", null, null).ToString("f")); + Assert.AreEqual("1.2.3-beta.4+5", SemanticVersion.Parse("1.2.3-beta.4+5", null, null).ToString("f")); var fullSemVer = new SemanticVersion { Major = 1, @@ -240,9 +240,9 @@ public void ToStringFTests() [Test] public void ToStringITests() { - Assert.AreEqual("1.2.3-beta.4", SemanticVersion.Parse("1.2.3-beta.4", null).ToString("i")); - Assert.AreEqual("1.2.3", SemanticVersion.Parse("1.2.3", null).ToString("i")); - Assert.AreEqual("1.2.3-beta.4+5", SemanticVersion.Parse("1.2.3-beta.4+5", null).ToString("i")); + Assert.AreEqual("1.2.3-beta.4", SemanticVersion.Parse("1.2.3-beta.4", null, null).ToString("i")); + Assert.AreEqual("1.2.3", SemanticVersion.Parse("1.2.3", null, null).ToString("i")); + Assert.AreEqual("1.2.3-beta.4+5", SemanticVersion.Parse("1.2.3-beta.4+5", null, null).ToString("i")); var fullSemVer = new SemanticVersion { Major = 1, diff --git a/src/GitVersionCore.Tests/VersionConverters/AssemblyInfoFileUpdaterTests.cs b/src/GitVersionCore.Tests/VersionConverters/AssemblyInfoFileUpdaterTests.cs index 2638443d2c..6a102b2052 100644 --- a/src/GitVersionCore.Tests/VersionConverters/AssemblyInfoFileUpdaterTests.cs +++ b/src/GitVersionCore.Tests/VersionConverters/AssemblyInfoFileUpdaterTests.cs @@ -46,7 +46,7 @@ public void ShouldCreateAssemblyInfoFileWhenNotExistsAndEnsureAssemblyInfo(strin var workingDir = Path.GetTempPath(); var assemblyInfoFile = "VersionAssemblyInfo." + fileExtension; var fullPath = Path.Combine(workingDir, assemblyInfoFile); - var variables = variableProvider.GetVariablesFor(SemanticVersion.Parse("1.0.0", "v"), new TestEffectiveConfiguration(), false); + var variables = variableProvider.GetVariablesFor(SemanticVersion.Parse("1.0.0", "v", null), new TestEffectiveConfiguration(), false); using var assemblyInfoFileUpdater = new AssemblyInfoFileUpdater(log, fileSystem); assemblyInfoFileUpdater.Execute(variables, new AssemblyInfoContext(workingDir, true, assemblyInfoFile)); @@ -64,7 +64,7 @@ public void ShouldCreateAssemblyInfoFileAtPathWhenNotExistsAndEnsureAssemblyInfo var workingDir = Path.GetTempPath(); var assemblyInfoFile = Path.Combine("src", "Project", "Properties", "VersionAssemblyInfo." + fileExtension); var fullPath = Path.Combine(workingDir, assemblyInfoFile); - var variables = variableProvider.GetVariablesFor(SemanticVersion.Parse("1.0.0", "v"), new TestEffectiveConfiguration(), false); + var variables = variableProvider.GetVariablesFor(SemanticVersion.Parse("1.0.0", "v", null), new TestEffectiveConfiguration(), false); using var assemblyInfoFileUpdater = new AssemblyInfoFileUpdater(log, fileSystem); assemblyInfoFileUpdater.Execute(variables, new AssemblyInfoContext(workingDir, true, assemblyInfoFile)); @@ -85,7 +85,7 @@ public void ShouldCreateAssemblyInfoFilesAtPathWhenNotExistsAndEnsureAssemblyInf "AssemblyInfo." + fileExtension, Path.Combine("src", "Project", "Properties", "VersionAssemblyInfo." + fileExtension) }; - var variables = variableProvider.GetVariablesFor(SemanticVersion.Parse("1.0.0", "v"), new TestEffectiveConfiguration(), false); + var variables = variableProvider.GetVariablesFor(SemanticVersion.Parse("1.0.0", "v", null), new TestEffectiveConfiguration(), false); using var assemblyInfoFileUpdater = new AssemblyInfoFileUpdater(log, fileSystem); assemblyInfoFileUpdater.Execute(variables, new AssemblyInfoContext(workingDir, true, assemblyInfoFiles.ToArray())); @@ -105,7 +105,7 @@ public void ShouldNotCreateAssemblyInfoFileWhenNotExistsAndNotEnsureAssemblyInfo var workingDir = Path.GetTempPath(); var assemblyInfoFile = "VersionAssemblyInfo." + fileExtension; var fullPath = Path.Combine(workingDir, assemblyInfoFile); - var variables = variableProvider.GetVariablesFor(SemanticVersion.Parse("1.0.0", "v"), new TestEffectiveConfiguration(), false); + var variables = variableProvider.GetVariablesFor(SemanticVersion.Parse("1.0.0", "v", null), new TestEffectiveConfiguration(), false); using var assemblyInfoFileUpdater = new AssemblyInfoFileUpdater(log, fileSystem); assemblyInfoFileUpdater.Execute(variables, new AssemblyInfoContext(workingDir, false, assemblyInfoFile)); @@ -120,7 +120,7 @@ public void ShouldNotCreateAssemblyInfoFileForUnknownSourceCodeAndEnsureAssembly var workingDir = Path.GetTempPath(); var assemblyInfoFile = "VersionAssemblyInfo.js"; var fullPath = Path.Combine(workingDir, assemblyInfoFile); - var variables = variableProvider.GetVariablesFor(SemanticVersion.Parse("1.0.0", "v"), new TestEffectiveConfiguration(), false); + var variables = variableProvider.GetVariablesFor(SemanticVersion.Parse("1.0.0", "v", null), new TestEffectiveConfiguration(), false); using var assemblyInfoFileUpdater = new AssemblyInfoFileUpdater(log, fileSystem); assemblyInfoFileUpdater.Execute(variables, new AssemblyInfoContext(workingDir, true, assemblyInfoFile)); @@ -134,7 +134,7 @@ public void ShouldStartSearchFromWorkingDirectory() fileSystem = Substitute.For(); var workingDir = Path.GetTempPath(); var assemblyInfoFiles = Array.Empty(); - var variables = variableProvider.GetVariablesFor(SemanticVersion.Parse("1.0.0", "v"), new TestEffectiveConfiguration(), false); + var variables = variableProvider.GetVariablesFor(SemanticVersion.Parse("1.0.0", "v", null), new TestEffectiveConfiguration(), false); using var assemblyInfoFileUpdater = new AssemblyInfoFileUpdater(log, fileSystem); assemblyInfoFileUpdater.Execute(variables, new AssemblyInfoContext(workingDir, false, assemblyInfoFiles.ToArray())); diff --git a/src/GitVersionCore.Tests/VersionConverters/ProjectFileUpdaterTests.cs b/src/GitVersionCore.Tests/VersionConverters/ProjectFileUpdaterTests.cs index 3ce9a59b3f..2fe8f38fa6 100644 --- a/src/GitVersionCore.Tests/VersionConverters/ProjectFileUpdaterTests.cs +++ b/src/GitVersionCore.Tests/VersionConverters/ProjectFileUpdaterTests.cs @@ -177,7 +177,7 @@ public void UpdateProjectXmlVersionElementWithStandardXmlInsertsElement(string x { using var projectFileUpdater = new ProjectFileUpdater(log, fileSystem); - var variables = variableProvider.GetVariablesFor(SemanticVersion.Parse("2.0.0", "v"), new TestEffectiveConfiguration(), false); + var variables = variableProvider.GetVariablesFor(SemanticVersion.Parse("2.0.0", "v", null), new TestEffectiveConfiguration(), false); var xmlRoot = XElement.Parse(xml); projectFileUpdater.UpdateProjectVersionElement(xmlRoot, ProjectFileUpdater.AssemblyVersionElement, variables.AssemblySemVer); @@ -207,7 +207,7 @@ public void UpdateProjectXmlVersionElementWithStandardXmlModifiesElement(string { using var projectFileUpdater = new ProjectFileUpdater(log, fileSystem); - var variables = variableProvider.GetVariablesFor(SemanticVersion.Parse("2.0.0", "v"), new TestEffectiveConfiguration(), false); + var variables = variableProvider.GetVariablesFor(SemanticVersion.Parse("2.0.0", "v", null), new TestEffectiveConfiguration(), false); var xmlRoot = XElement.Parse(xml); projectFileUpdater.UpdateProjectVersionElement(xmlRoot, ProjectFileUpdater.AssemblyVersionElement, variables.AssemblySemVer); @@ -240,7 +240,7 @@ public void UpdateProjectXmlVersionElementWithDuplicatePropertyGroupsModifiesLas { using var projectFileUpdater = new ProjectFileUpdater(log, fileSystem); - var variables = variableProvider.GetVariablesFor(SemanticVersion.Parse("2.0.0", "v"), new TestEffectiveConfiguration(), false); + var variables = variableProvider.GetVariablesFor(SemanticVersion.Parse("2.0.0", "v", null), new TestEffectiveConfiguration(), false); var xmlRoot = XElement.Parse(xml); projectFileUpdater.UpdateProjectVersionElement(xmlRoot, ProjectFileUpdater.AssemblyVersionElement, variables.AssemblySemVer); @@ -275,7 +275,7 @@ public void UpdateProjectXmlVersionElementWithMultipleVersionElementsLastOneIsMo { using var projectFileUpdater = new ProjectFileUpdater(log, fileSystem); - var variables = variableProvider.GetVariablesFor(SemanticVersion.Parse("2.0.0", "v"), new TestEffectiveConfiguration(), false); + var variables = variableProvider.GetVariablesFor(SemanticVersion.Parse("2.0.0", "v", null), new TestEffectiveConfiguration(), false); var xmlRoot = XElement.Parse(xml); projectFileUpdater.UpdateProjectVersionElement(xmlRoot, ProjectFileUpdater.AssemblyVersionElement, variables.AssemblySemVer); diff --git a/src/GitVersionCore/Configuration/ConfigExtensions.cs b/src/GitVersionCore/Configuration/ConfigExtensions.cs index 987795e27d..7249086fee 100644 --- a/src/GitVersionCore/Configuration/ConfigExtensions.cs +++ b/src/GitVersionCore/Configuration/ConfigExtensions.cs @@ -126,7 +126,10 @@ public static string GetBranchSpecificTag(this EffectiveConfiguration configurat } if (tagToUse.Contains("{BranchName}")) { - log.Info("Using branch name to calculate version tag"); + if (log != null) + { + log.Info("Using branch name to calculate version tag"); + } var branchName = branchNameOverride ?? branchFriendlyName; if (!string.IsNullOrWhiteSpace(configuration.BranchPrefixToTrim)) diff --git a/src/GitVersionCore/Configuration/Init/SetNextVersion.cs b/src/GitVersionCore/Configuration/Init/SetNextVersion.cs index 7155e3c239..8379de8977 100644 --- a/src/GitVersionCore/Configuration/Init/SetNextVersion.cs +++ b/src/GitVersionCore/Configuration/Init/SetNextVersion.cs @@ -20,7 +20,7 @@ protected override StepResult HandleResult(string result, Queue BranchCommit FindCommitBranchWasBranchedFrom(Branch branch, Config configuration, params Branch[] excludedBranches); - SemanticVersion GetCurrentCommitTaggedVersion(GitObject commit, EffectiveConfiguration config); + SemanticVersion GetCurrentCommitTaggedVersion(Branch branch, GitObject commit, EffectiveConfiguration config); SemanticVersion MaybeIncrement(BaseVersion baseVersion, GitVersionContext context); - IEnumerable GetVersionTagsOnBranch(Branch branch, string tagPrefixRegex); - IEnumerable> GetValidVersionTags(string tagPrefixRegex, DateTimeOffset? olderThan = null); + IEnumerable GetVersionTagsOnBranch(Branch branch, string tagPrefixRegex, string tagSuffix); + IEnumerable> GetValidVersionTags(string tagPrefixRegex, string tagSuffix, DateTimeOffset? olderThan = null); ICommitLog GetCommitLog(Commit baseVersionSource, Commit currentCommit); bool GetMatchingCommitBranch(Commit baseVersionSource, Branch branch, Commit firstMatchingCommit); diff --git a/src/GitVersionCore/Core/GitVersionContextFactory.cs b/src/GitVersionCore/Core/GitVersionContextFactory.cs index 8a8bd515f1..c856b75944 100644 --- a/src/GitVersionCore/Core/GitVersionContextFactory.cs +++ b/src/GitVersionCore/Core/GitVersionContextFactory.cs @@ -45,7 +45,7 @@ private GitVersionContext Init(Branch currentBranch, string commitId = null, boo var currentBranchConfig = branchConfigurationCalculator.GetBranchConfiguration(currentBranch, currentCommit, configuration); var effectiveConfiguration = configuration.CalculateEffectiveConfiguration(currentBranchConfig); - var currentCommitTaggedVersion = repositoryMetadataProvider.GetCurrentCommitTaggedVersion(currentCommit, effectiveConfiguration); + var currentCommitTaggedVersion = repositoryMetadataProvider.GetCurrentCommitTaggedVersion(currentBranch, currentCommit, effectiveConfiguration); var numberOfUncommittedChanges = repositoryMetadataProvider.GetNumberOfUncommittedChanges(); return new GitVersionContext(currentBranch, currentCommit, configuration, effectiveConfiguration, currentCommitTaggedVersion, numberOfUncommittedChanges); diff --git a/src/GitVersionCore/Core/RepositoryMetadataProvider.cs b/src/GitVersionCore/Core/RepositoryMetadataProvider.cs index 81fde19f3e..b2f4c8bbcc 100644 --- a/src/GitVersionCore/Core/RepositoryMetadataProvider.cs +++ b/src/GitVersionCore/Core/RepositoryMetadataProvider.cs @@ -348,12 +348,13 @@ public BranchCommit FindCommitBranchWasBranchedFrom(Branch branch, Config config } - public SemanticVersion GetCurrentCommitTaggedVersion(GitObject commit, EffectiveConfiguration config) + public SemanticVersion GetCurrentCommitTaggedVersion(Branch branch, GitObject commit, EffectiveConfiguration config) { return repository.Tags .SelectMany(t => { - if (t.PeeledTarget() == commit && SemanticVersion.TryParse(t.FriendlyName, config.GitTagPrefix, out var version)) + var tag = config.GetBranchSpecificTag(null, branch.FriendlyName, null); + if (t.PeeledTarget() == commit && SemanticVersion.TryParse(t.FriendlyName, config.GitTagPrefix, tag, out var version)) return new[] { version }; @@ -368,7 +369,7 @@ public SemanticVersion MaybeIncrement(BaseVersion baseVersion, GitVersionContext return increment != null ? baseVersion.SemanticVersion.IncrementVersion(increment.Value) : baseVersion.SemanticVersion; } - public IEnumerable GetVersionTagsOnBranch(Branch branch, string tagPrefixRegex) + public IEnumerable GetVersionTagsOnBranch(Branch branch, string tagPrefixRegex, string tagSuffix) { if (semanticVersionTagsOnBranchCache.ContainsKey(branch)) { @@ -378,7 +379,7 @@ public IEnumerable GetVersionTagsOnBranch(Branch branch, string using (log.IndentLog($"Getting version tags from branch '{branch.CanonicalName}'.")) { - var tags = GetValidVersionTags(tagPrefixRegex); + var tags = GetValidVersionTags(tagPrefixRegex, tagSuffix); var versionTags = branch.Commits.SelectMany(c => tags.Where(t => c.Sha == t.Item1.Target.Sha).Select(t => t.Item2)).ToList(); @@ -387,7 +388,7 @@ public IEnumerable GetVersionTagsOnBranch(Branch branch, string } } - public IEnumerable> GetValidVersionTags(string tagPrefixRegex, DateTimeOffset? olderThan = null) + public IEnumerable> GetValidVersionTags(string tagPrefixRegex, string tagSuffix, DateTimeOffset? olderThan = null) { var tags = new List>(); @@ -396,7 +397,7 @@ public IEnumerable> GetValidVersionTags(string tagPr if (!(tag.PeeledTarget() is Commit commit) || (olderThan.HasValue && commit.When() > olderThan.Value)) continue; - if (SemanticVersion.TryParse(tag.FriendlyName, tagPrefixRegex, out var semver)) + if (SemanticVersion.TryParse(tag.FriendlyName, tagPrefixRegex, tagSuffix, out var semver)) { tags.Add(Tuple.Create(tag, semver)); } diff --git a/src/GitVersionCore/Model/MergeMessage.cs b/src/GitVersionCore/Model/MergeMessage.cs index d5ebdf787f..5e9c9c62a8 100644 --- a/src/GitVersionCore/Model/MergeMessage.cs +++ b/src/GitVersionCore/Model/MergeMessage.cs @@ -47,7 +47,7 @@ public MergeMessage(string mergeMessage, Config config) PullRequestNumber = pullNumber; } - Version = ParseVersion(config.TagPrefix); + Version = ParseVersion(config.TagPrefix, null); break; } @@ -61,7 +61,7 @@ public MergeMessage(string mergeMessage, Config config) public int? PullRequestNumber { get; } public SemanticVersion Version { get; } - private SemanticVersion ParseVersion(string tagPrefix) + private SemanticVersion ParseVersion(string tagPrefix, string tagSuffix) { // Remove remotes and branch prefixes like release/ feature/ hotfix/ etc var toMatch = Regex.Replace(MergedBranch, @"^(\w+[-/])*", "", RegexOptions.IgnoreCase); @@ -70,7 +70,7 @@ private SemanticVersion ParseVersion(string tagPrefix) var versionMatch = new Regex(@"^(? GetVersions() { if (string.IsNullOrEmpty(Context.Configuration.NextVersion) || Context.IsCurrentCommitTagged) yield break; - var semanticVersion = SemanticVersion.Parse(Context.Configuration.NextVersion, Context.Configuration.GitTagPrefix); + var semanticVersion = SemanticVersion.Parse(Context.Configuration.NextVersion, Context.Configuration.GitTagPrefix, null); yield return new BaseVersion("NextVersion in GitVersion configuration file", false, semanticVersion, null, null); } } diff --git a/src/GitVersionCore/VersionCalculation/BaseVersionCalculators/TaggedCommitVersionStrategy.cs b/src/GitVersionCore/VersionCalculation/BaseVersionCalculators/TaggedCommitVersionStrategy.cs index 4b87a9418d..84c060392a 100644 --- a/src/GitVersionCore/VersionCalculation/BaseVersionCalculators/TaggedCommitVersionStrategy.cs +++ b/src/GitVersionCore/VersionCalculation/BaseVersionCalculators/TaggedCommitVersionStrategy.cs @@ -28,7 +28,9 @@ public override IEnumerable GetVersions() internal IEnumerable GetTaggedVersions(Branch currentBranch, DateTimeOffset? olderThan) { - var allTags = repositoryMetadataProvider.GetValidVersionTags(Context.Configuration.GitTagPrefix, olderThan); + var tagToUse = "";//Context.Configuration.GetBranchSpecificTag(null, currentBranch.FriendlyName, null); + var allTags = repositoryMetadataProvider.GetValidVersionTags(Context.Configuration.GitTagPrefix, tagToUse, olderThan); + var taggedVersions = currentBranch .Commits diff --git a/src/GitVersionCore/VersionCalculation/BaseVersionCalculators/TrackReleaseBranchesVersionStrategy.cs b/src/GitVersionCore/VersionCalculation/BaseVersionCalculators/TrackReleaseBranchesVersionStrategy.cs index c587d3931a..c130e66eb2 100644 --- a/src/GitVersionCore/VersionCalculation/BaseVersionCalculators/TrackReleaseBranchesVersionStrategy.cs +++ b/src/GitVersionCore/VersionCalculation/BaseVersionCalculators/TrackReleaseBranchesVersionStrategy.cs @@ -84,6 +84,7 @@ private IEnumerable ReleaseBranchBaseVersions() private IEnumerable GetReleaseVersion(GitVersionContext context, Branch releaseBranch) { var tagPrefixRegex = context.Configuration.GitTagPrefix; + var tagSuffix = Context.Configuration.Tag; // Find the commit where the child branch was created. var baseSource = repositoryMetadataProvider.FindMergeBase(releaseBranch, context.CurrentBranch); @@ -94,7 +95,7 @@ private IEnumerable GetReleaseVersion(GitVersionContext context, Br } return releaseVersionStrategy - .GetVersions(tagPrefixRegex, releaseBranch) + .GetVersions(tagPrefixRegex, tagSuffix, releaseBranch) .Select(b => new BaseVersion(b.Source, true, b.SemanticVersion, baseSource, b.BranchNameOverride)); } } diff --git a/src/GitVersionCore/VersionCalculation/BaseVersionCalculators/VersionInBranchNameVersionStrategy.cs b/src/GitVersionCore/VersionCalculation/BaseVersionCalculators/VersionInBranchNameVersionStrategy.cs index 494bef8e52..04bbc0f848 100644 --- a/src/GitVersionCore/VersionCalculation/BaseVersionCalculators/VersionInBranchNameVersionStrategy.cs +++ b/src/GitVersionCore/VersionCalculation/BaseVersionCalculators/VersionInBranchNameVersionStrategy.cs @@ -25,10 +25,11 @@ public override IEnumerable GetVersions() { var currentBranch = Context.CurrentBranch; var tagPrefixRegex = Context.Configuration.GitTagPrefix; - return GetVersions(tagPrefixRegex, currentBranch); + var tagSuffix = Context.Configuration.GetBranchSpecificTag(null, currentBranch.FriendlyName, null); + return GetVersions(tagPrefixRegex, tagSuffix, currentBranch); } - internal IEnumerable GetVersions(string tagPrefixRegex, Branch currentBranch) + internal IEnumerable GetVersions(string tagPrefixRegex, string tagSuffix, Branch currentBranch) { if (!Context.FullConfiguration.IsReleaseBranch(currentBranch.NameWithoutOrigin())) { @@ -36,7 +37,7 @@ internal IEnumerable GetVersions(string tagPrefixRegex, Branch curr } var branchName = currentBranch.FriendlyName; - var versionInBranch = GetVersionInBranch(branchName, tagPrefixRegex); + var versionInBranch = GetVersionInBranch(branchName, tagPrefixRegex, tagSuffix); if (versionInBranch != null) { var commitBranchWasBranchedFrom = repositoryMetadataProvider.FindCommitBranchWasBranchedFrom(currentBranch, Context.FullConfiguration); @@ -45,12 +46,12 @@ internal IEnumerable GetVersions(string tagPrefixRegex, Branch curr } } - private Tuple GetVersionInBranch(string branchName, string tagPrefixRegex) + private Tuple GetVersionInBranch(string branchName, string tagPrefixRegex, string tagSuffix) { var branchParts = branchName.Split('/', '-'); foreach (var part in branchParts) { - if (SemanticVersion.TryParse(part, tagPrefixRegex, out var semanticVersion)) + if (SemanticVersion.TryParse(part, tagPrefixRegex, tagSuffix, out var semanticVersion)) { return Tuple.Create(part, semanticVersion); } diff --git a/src/GitVersionCore/VersionCalculation/NextVersionCalculator.cs b/src/GitVersionCore/VersionCalculation/NextVersionCalculator.cs index 15dbbbbb1c..6f49ee2d9d 100644 --- a/src/GitVersionCore/VersionCalculation/NextVersionCalculator.cs +++ b/src/GitVersionCore/VersionCalculation/NextVersionCalculator.cs @@ -111,7 +111,7 @@ private void UpdatePreReleaseTag(SemanticVersion semanticVersion, string branchN int? number = null; var lastTag = repositoryMetadataProvider - .GetVersionTagsOnBranch(context.CurrentBranch, context.Configuration.GitTagPrefix) + .GetVersionTagsOnBranch(context.CurrentBranch, context.Configuration.GitTagPrefix, tagToUse) .FirstOrDefault(v => v.PreReleaseTag.Name.IsEquivalentTo(tagToUse)); if (lastTag != null && diff --git a/src/GitVersionCore/VersionCalculation/SemanticVersioning/SemanticVersion.cs b/src/GitVersionCore/VersionCalculation/SemanticVersioning/SemanticVersion.cs index a016ce6c06..c1a3c7ac5c 100644 --- a/src/GitVersionCore/VersionCalculation/SemanticVersioning/SemanticVersion.cs +++ b/src/GitVersionCore/VersionCalculation/SemanticVersioning/SemanticVersion.cs @@ -136,17 +136,21 @@ public override int GetHashCode() return v1.CompareTo(v2) < 0; } - public static SemanticVersion Parse(string version, string tagPrefixRegex) + public static SemanticVersion Parse(string version, string tagPrefixRegex, string tagSuffix) { - if (!TryParse(version, tagPrefixRegex, out var semanticVersion)) + if (!TryParse(version, tagPrefixRegex, tagSuffix, out var semanticVersion)) throw new WarningException($"Failed to parse {version} into a Semantic Version"); return semanticVersion; } - public static bool TryParse(string version, string tagPrefixRegex, out SemanticVersion semanticVersion) + public static bool TryParse(string version, string tagPrefixRegex, string tagSuffix, out SemanticVersion semanticVersion) { - var match = Regex.Match(version, $"^({tagPrefixRegex})?(?.*)$"); + if (tagSuffix == null) + { + tagSuffix = ".*"; + } + var match = Regex.Match(version, $"^({tagPrefixRegex})?(?[0-9.]+-?{tagSuffix}[.]?\\d*)$"); if (!match.Success) { diff --git a/src/GitVersionCore/VersionCalculation/SemanticVersioning/SemanticVersionExtensions.cs b/src/GitVersionCore/VersionCalculation/SemanticVersioning/SemanticVersionExtensions.cs index 36248df663..87ef1a18e6 100644 --- a/src/GitVersionCore/VersionCalculation/SemanticVersioning/SemanticVersionExtensions.cs +++ b/src/GitVersionCore/VersionCalculation/SemanticVersioning/SemanticVersionExtensions.cs @@ -6,7 +6,7 @@ public static class SemanticVersionExtensions { public static void OverrideVersionManuallyIfNeeded(this SemanticVersion version, EffectiveConfiguration configuration) { - if (!string.IsNullOrEmpty(configuration.NextVersion) && SemanticVersion.TryParse(configuration.NextVersion, configuration.GitTagPrefix, out var manualNextVersion)) + if (!string.IsNullOrEmpty(configuration.NextVersion) && SemanticVersion.TryParse(configuration.NextVersion, configuration.GitTagPrefix, null, out var manualNextVersion)) { if (manualNextVersion > version) {