diff --git a/src/GitVersion.Core.Tests/IntegrationTests/OtherScenarios.cs b/src/GitVersion.Core.Tests/IntegrationTests/OtherScenarios.cs
index e4f7104485..4433d469d2 100644
--- a/src/GitVersion.Core.Tests/IntegrationTests/OtherScenarios.cs
+++ b/src/GitVersion.Core.Tests/IntegrationTests/OtherScenarios.cs
@@ -131,7 +131,7 @@ public void NoDirtyFlagInCleanRepository()
[TestCase(false, "1.1.0-alpha.2")]
[TestCase(true, "1.2.0-alpha.1")]
- public void EnusreTrackMergeTargetStrategyWhichWillLookForTaggedMergecommits(bool trackMergeTarget, string expectedVersion)
+ public void EnsureTrackMergeTargetStrategyWhichWillLookForTaggedMergecommits(bool trackMergeTarget, string expectedVersion)
{
// * 9daa6ea 53 minutes ago (HEAD -> develop)
// | * 85536f2 55 minutes ago (tag: 1.1.0, main)
@@ -162,4 +162,69 @@ public void EnusreTrackMergeTargetStrategyWhichWillLookForTaggedMergecommits(boo
fixture.Repository.DumpGraph();
}
+
+ [TestCase(1)]
+ [TestCase(2)]
+ public void EnsurePreReleaseTagLabelWillBeConsideredIfNoLabelIsDefined(long patchNumber)
+ {
+ var configuration = GitHubFlowConfigurationBuilder.New
+ .WithLabel(null)
+ .WithBranch("main", branchBuilder => branchBuilder
+ .WithLabel(null).WithIncrement(IncrementStrategy.Patch)
+ ).Build();
+
+ using var fixture = new EmptyRepositoryFixture("main");
+
+ fixture.MakeACommit();
+
+ // ✅ succeeds as expected
+ fixture.AssertFullSemver("0.0.1+1", configuration);
+
+ fixture.ApplyTag($"0.0.{patchNumber}-alpha.1");
+
+ // ✅ succeeds as expected
+ fixture.AssertFullSemver($"0.0.{patchNumber}-alpha.1", configuration);
+
+ fixture.MakeACommit();
+
+ // ✅ succeeds as expected
+ fixture.AssertFullSemver($"0.0.{patchNumber}-alpha.2+1", configuration);
+
+ fixture.MakeACommit();
+
+ // ✅ succeeds as expected
+ fixture.AssertFullSemver($"0.0.{patchNumber}-alpha.2+2", configuration);
+
+ fixture.MakeATaggedCommit($"0.0.{patchNumber}-beta.1");
+
+ // ✅ succeeds as expected
+ fixture.AssertFullSemver($"0.0.{patchNumber}-beta.1", configuration);
+
+ fixture.MakeACommit();
+
+ // ✅ succeeds as expected
+ fixture.AssertFullSemver($"0.0.{patchNumber}-beta.2+1", configuration);
+
+ fixture.MakeATaggedCommit($"0.0.{patchNumber}-beta.2");
+
+ // ✅ succeeds as expected
+ fixture.AssertFullSemver($"0.0.{patchNumber}-beta.2", configuration);
+
+ fixture.MakeACommit();
+
+ // ✅ succeeds as expected
+ fixture.AssertFullSemver($"0.0.{patchNumber}-beta.3+1", configuration);
+
+ fixture.ApplyTag($"0.0.{patchNumber}");
+
+ // ✅ succeeds as expected
+ fixture.AssertFullSemver($"0.0.{patchNumber}", configuration);
+
+ fixture.MakeACommit();
+
+ // ✅ succeeds as expected
+ fixture.AssertFullSemver($"0.0.{patchNumber + 1}+1", configuration);
+
+ fixture.Repository.DumpGraph();
+ }
}
diff --git a/src/GitVersion.Core.Tests/IntegrationTests/SupportBranchScenarios.cs b/src/GitVersion.Core.Tests/IntegrationTests/SupportBranchScenarios.cs
index c6931af075..c7a34df067 100644
--- a/src/GitVersion.Core.Tests/IntegrationTests/SupportBranchScenarios.cs
+++ b/src/GitVersion.Core.Tests/IntegrationTests/SupportBranchScenarios.cs
@@ -1,3 +1,4 @@
+using GitVersion.Configuration;
using GitVersion.Core.Tests.Helpers;
using LibGit2Sharp;
@@ -73,27 +74,33 @@ public void WhenSupportIsBranchedAndTaggedFromAnotherSupportEnsureNewMinorIsUsed
[Test]
public void WhenSupportIsBranchedFromMainWithSpecificTag()
{
+ var configuration = GitFlowConfigurationBuilder.New.Build();
+
using var fixture = new EmptyRepositoryFixture();
- fixture.Repository.MakeACommit();
+
+ fixture.MakeACommit();
fixture.AssertFullSemver("0.0.1+1");
- fixture.Repository.ApplyTag("1.4.0-rc");
- fixture.Repository.MakeACommit();
- fixture.Repository.CreateBranch("support/1");
- Commands.Checkout(fixture.Repository, "support/1");
- fixture.AssertFullSemver("1.4.0+1");
+ fixture.ApplyTag("1.4.0-rc");
+ fixture.MakeACommit();
+ fixture.BranchTo("support/1");
+
+ fixture.AssertFullSemver("1.4.0+1", configuration);
}
[Test]
public void WhenSupportIsBranchedFromMainWithSpecificTagOnCommit()
{
+ var configuration = GitFlowConfigurationBuilder.New.Build();
+
using var fixture = new EmptyRepositoryFixture();
- fixture.Repository.MakeACommit();
- fixture.AssertFullSemver("0.0.1+1");
- fixture.Repository.ApplyTag("1.4.0-rc");
- fixture.Repository.CreateBranch("support/1");
- Commands.Checkout(fixture.Repository, "support/1");
- fixture.AssertFullSemver("1.4.0");
+ fixture.MakeACommit();
+ fixture.AssertFullSemver("0.0.1+1", configuration);
+
+ fixture.ApplyTag("1.4.0-rc");
+ fixture.BranchTo("support/1");
+
+ fixture.AssertFullSemver("1.4.0+0", configuration);
}
}
diff --git a/src/GitVersion.Core.Tests/VersionCalculation/SemanticVersionTests.cs b/src/GitVersion.Core.Tests/VersionCalculation/SemanticVersionTests.cs
index b32d188730..7bb53cc423 100644
--- a/src/GitVersion.Core.Tests/VersionCalculation/SemanticVersionTests.cs
+++ b/src/GitVersion.Core.Tests/VersionCalculation/SemanticVersionTests.cs
@@ -6,7 +6,7 @@ namespace GitVersion.Core.Tests;
[TestFixture]
public class SemanticVersionTests : TestBase
{
- [TestCase("1.2.3", 1, 2, 3, null, null, null, null, null, null, null, null, SemanticVersionFormat.Strict)]
+ [TestCase("1.2.3", 1, 2, 3, "", null, null, null, null, null, null, null, SemanticVersionFormat.Strict)]
[TestCase("1.2.3-beta", 1, 2, 3, "beta", null, null, null, null, null, null, null, SemanticVersionFormat.Strict)]
[TestCase("1.2.3-beta3", 1, 2, 3, "beta", 3, null, null, null, null, "1.2.3-beta.3", null, SemanticVersionFormat.Strict)]
[TestCase("1.2.3-beta.3", 1, 2, 3, "beta", 3, null, null, null, null, "1.2.3-beta.3", null, SemanticVersionFormat.Strict)]
@@ -19,25 +19,24 @@ public class SemanticVersionTests : TestBase
[TestCase("1.2.3-rc3.1", 1, 2, 3, "rc3", 1, null, null, null, null, "1.2.3-rc3.1", null, SemanticVersionFormat.Strict)]
[TestCase("1.2.3-beta3f", 1, 2, 3, "beta3f", null, null, null, null, null, null, null, SemanticVersionFormat.Strict)]
[TestCase("1.2.3-notAStability1", 1, 2, 3, "notAStability", 1, null, null, null, null, "1.2.3-notAStability.1", null, SemanticVersionFormat.Strict)]
- [TestCase("1.2.3+4", 1, 2, 3, null, null, 4, null, null, null, null, null, SemanticVersionFormat.Strict)]
- [TestCase("1.2.3+4.Branch.Foo", 1, 2, 3, null, null, 4, "Foo", null, null, null, null, SemanticVersionFormat.Strict)]
- [TestCase("1.2.3+randomMetaData", 1, 2, 3, null, null, null, null, null, "randomMetaData", null, null, SemanticVersionFormat.Strict)]
+ [TestCase("1.2.3+4", 1, 2, 3, "", null, 4, null, null, null, null, null, SemanticVersionFormat.Strict)]
+ [TestCase("1.2.3+4.Branch.Foo", 1, 2, 3, "", null, 4, "Foo", null, null, null, null, SemanticVersionFormat.Strict)]
+ [TestCase("1.2.3+randomMetaData", 1, 2, 3, "", null, null, null, null, "randomMetaData", null, null, SemanticVersionFormat.Strict)]
[TestCase("1.2.3-beta.1+4.Sha.12234.Othershiz", 1, 2, 3, "beta", 1, 4, null, "12234", "Othershiz", null, null, SemanticVersionFormat.Strict)]
- [TestCase("1.2.3", 1, 2, 3, null, null, null, null, null, null, null, ConfigurationConstants.DefaultLabelPrefix, SemanticVersionFormat.Strict)]
- [TestCase("v1.2.3", 1, 2, 3, null, null, null, null, null, null, "1.2.3", ConfigurationConstants.DefaultLabelPrefix, SemanticVersionFormat.Strict)]
- [TestCase("V1.2.3", 1, 2, 3, null, null, null, null, null, null, "1.2.3", ConfigurationConstants.DefaultLabelPrefix, SemanticVersionFormat.Strict)]
- [TestCase("version-1.2.3", 1, 2, 3, null, null, null, null, null, null, "1.2.3", "version-", SemanticVersionFormat.Strict)]
+ [TestCase("1.2.3", 1, 2, 3, "", null, null, null, null, null, null, ConfigurationConstants.DefaultLabelPrefix, SemanticVersionFormat.Strict)]
+ [TestCase("v1.2.3", 1, 2, 3, "", null, null, null, null, null, "1.2.3", ConfigurationConstants.DefaultLabelPrefix, SemanticVersionFormat.Strict)]
+ [TestCase("V1.2.3", 1, 2, 3, "", null, null, null, null, null, "1.2.3", ConfigurationConstants.DefaultLabelPrefix, SemanticVersionFormat.Strict)]
+ [TestCase("version-1.2.3", 1, 2, 3, "", null, null, null, null, null, "1.2.3", "version-", SemanticVersionFormat.Strict)]
[TestCase("1.0.0-develop-20201007113711", 1, 0, 0, "develop-20201007113711", null, null, null, null, null, "1.0.0-develop-20201007113711", null, SemanticVersionFormat.Strict)]
[TestCase("20201007113711.658165168461351.64136516984163213-develop-20201007113711.98848747823+65416321321", 20201007113711, 658165168461351, 64136516984163213, "develop-20201007113711", 98848747823, 65416321321, null, null, null, "20201007113711.658165168461351.64136516984163213-develop-20201007113711.98848747823+65416321321", null, SemanticVersionFormat.Strict)]
-
- [TestCase("1.2", 1, 2, 0, null, null, null, null, null, null, "1.2.0", null, SemanticVersionFormat.Loose)]
+ [TestCase("1.2", 1, 2, 0, "", null, null, null, null, null, "1.2.0", null, SemanticVersionFormat.Loose)]
[TestCase("1.2-alpha4", 1, 2, 0, "alpha", 4, null, null, null, null, "1.2.0-alpha.4", null, SemanticVersionFormat.Loose)]
[TestCase("01.02.03-rc03", 1, 2, 3, "rc", 3, null, null, null, null, "1.2.3-rc.3", null, SemanticVersionFormat.Loose)]
- [TestCase("1.2.3.4", 1, 2, 3, null, null, 4, null, null, null, "1.2.3+4", null, SemanticVersionFormat.Loose)]
- [TestCase("1", 1, 0, 0, null, null, null, null, null, null, "1.0.0", null, SemanticVersionFormat.Loose)]
- [TestCase("1.1", 1, 1, 0, null, null, null, null, null, null, "1.1.0", null, SemanticVersionFormat.Loose)]
+ [TestCase("1.2.3.4", 1, 2, 3, "", null, 4, null, null, null, "1.2.3+4", null, SemanticVersionFormat.Loose)]
+ [TestCase("1", 1, 0, 0, "", null, null, null, null, null, "1.0.0", null, SemanticVersionFormat.Loose)]
+ [TestCase("1.1", 1, 1, 0, "", null, null, null, null, null, "1.1.0", null, SemanticVersionFormat.Loose)]
public void ValidateVersionParsing(
- string? versionString, long major, long minor, long patch, string? tag, long? tagNumber, long? numberOfBuilds,
+ string? versionString, long major, long minor, long patch, string label, long? tagNumber, long? numberOfBuilds,
string? branchName, string? sha, string? otherMetaData, string? fullFormattedVersionString, string? tagPrefixRegex, SemanticVersionFormat format = SemanticVersionFormat.Strict)
{
fullFormattedVersionString ??= versionString;
@@ -51,7 +50,7 @@ public void ValidateVersionParsing(
Assert.That(version.Major, Is.EqualTo(major));
Assert.That(version.Minor, Is.EqualTo(minor));
Assert.That(version.Patch, Is.EqualTo(patch));
- Assert.That(version.PreReleaseTag.Name, Is.EqualTo(tag));
+ Assert.That(version.PreReleaseTag.Name, Is.EqualTo(label));
Assert.That(version.PreReleaseTag.Number, Is.EqualTo(tagNumber));
Assert.That(version.BuildMetaData.CommitsSinceTag, Is.EqualTo(numberOfBuilds));
diff --git a/src/GitVersion.Core/Configuration/ConfigurationExtensions.cs b/src/GitVersion.Core/Configuration/ConfigurationExtensions.cs
index 4213f88f7e..cd57a02bc1 100644
--- a/src/GitVersion.Core/Configuration/ConfigurationExtensions.cs
+++ b/src/GitVersion.Core/Configuration/ConfigurationExtensions.cs
@@ -59,32 +59,41 @@ public static bool IsReleaseBranch(this IGitVersionConfiguration configuration,
public static bool IsReleaseBranch(this IGitVersionConfiguration configuration, ReferenceName branchName)
=> configuration.GetBranchConfiguration(branchName).IsReleaseBranch ?? false;
- public static string GetBranchSpecificTag(this EffectiveConfiguration configuration, ILog log, string? branchFriendlyName,
- string? branchNameOverride)
+ public static string? GetBranchSpecificLabel(
+ this EffectiveConfiguration configuration, ILog log, ReferenceName branchName, string? branchNameOverride)
+ => GetBranchSpecificLabel(configuration, log, branchName.WithoutOrigin, branchNameOverride);
+
+ public static string? GetBranchSpecificLabel(
+ this EffectiveConfiguration configuration, ILog log, string? branchName, string? branchNameOverride)
{
- var tagToUse = configuration.Label;
- if (tagToUse == "useBranchName")
+ configuration.NotNull();
+
+ var label = configuration.Label;
+ if (label == "useBranchName")
{
- tagToUse = ConfigurationConstants.BranchNamePlaceholder;
+ label = ConfigurationConstants.BranchNamePlaceholder;
}
- if (tagToUse.Contains(ConfigurationConstants.BranchNamePlaceholder))
+ if (label?.Contains(ConfigurationConstants.BranchNamePlaceholder) == true)
{
log.Info("Using branch name to calculate version tag");
- var branchName = branchNameOverride ?? branchFriendlyName;
+ var value = branchNameOverride ?? branchName;
+
if (!configuration.BranchPrefixToTrim.IsNullOrWhiteSpace())
{
- var branchNameTrimmed = branchName?.RegexReplace(configuration.BranchPrefixToTrim, string.Empty, RegexOptions.IgnoreCase);
- branchName = branchNameTrimmed.IsNullOrEmpty() ? branchName : branchNameTrimmed;
+ var branchNameTrimmed = value?.RegexReplace(
+ configuration.BranchPrefixToTrim, string.Empty, RegexOptions.IgnoreCase
+ );
+ value = branchNameTrimmed.IsNullOrEmpty() ? value : branchNameTrimmed;
}
- branchName = branchName?.RegexReplace("[^a-zA-Z0-9-]", "-");
+ value = value?.RegexReplace("[^a-zA-Z0-9-]", "-");
- tagToUse = tagToUse.Replace(ConfigurationConstants.BranchNamePlaceholder, branchName);
+ label = label.Replace(ConfigurationConstants.BranchNamePlaceholder, value);
}
- return tagToUse;
+ return label;
}
public static (string GitDirectory, string WorkingTreeDirectory)? FindGitDir(this string path)
diff --git a/src/GitVersion.Core/Configuration/EffectiveConfiguration.cs b/src/GitVersion.Core/Configuration/EffectiveConfiguration.cs
index 341785d2ab..20962004bc 100644
--- a/src/GitVersion.Core/Configuration/EffectiveConfiguration.cs
+++ b/src/GitVersion.Core/Configuration/EffectiveConfiguration.cs
@@ -39,7 +39,7 @@ public EffectiveConfiguration(IGitVersionConfiguration configuration, IBranchCon
AssemblyFileVersioningFormat = configuration.AssemblyFileVersioningFormat;
VersioningMode = branchConfiguration.VersioningMode.Value;
LabelPrefix = configuration.LabelPrefix;
- Label = branchConfiguration.Label ?? string.Empty;
+ Label = branchConfiguration.Label;
NextVersion = configuration.NextVersion;
Increment = branchConfiguration.Increment;
BranchPrefixToTrim = branchConfiguration.RegularExpression;
@@ -140,7 +140,7 @@ protected EffectiveConfiguration(AssemblyVersioningScheme assemblyVersioningSche
///
/// Label to use when calculating SemVer
///
- public string Label { get; }
+ public string? Label { get; }
public string? NextVersion { get; }
diff --git a/src/GitVersion.Core/PublicAPI.Unshipped.txt b/src/GitVersion.Core/PublicAPI.Unshipped.txt
index f03b30a432..67659f8d81 100644
--- a/src/GitVersion.Core/PublicAPI.Unshipped.txt
+++ b/src/GitVersion.Core/PublicAPI.Unshipped.txt
@@ -151,7 +151,7 @@ GitVersion.Configuration.EffectiveConfiguration.EffectiveConfiguration(GitVersio
GitVersion.Configuration.EffectiveConfiguration.Increment.get -> GitVersion.IncrementStrategy
GitVersion.Configuration.EffectiveConfiguration.IsMainline.get -> bool
GitVersion.Configuration.EffectiveConfiguration.IsReleaseBranch.get -> bool
-GitVersion.Configuration.EffectiveConfiguration.Label.get -> string!
+GitVersion.Configuration.EffectiveConfiguration.Label.get -> string?
GitVersion.Configuration.EffectiveConfiguration.LabelNumberPattern.get -> string?
GitVersion.Configuration.EffectiveConfiguration.LabelPreReleaseWeight.get -> int
GitVersion.Configuration.EffectiveConfiguration.LabelPrefix.get -> string?
@@ -769,7 +769,7 @@ GitVersion.SemanticVersion.Major -> long
GitVersion.SemanticVersion.Minor -> long
GitVersion.SemanticVersion.Patch -> long
GitVersion.SemanticVersion.PreReleaseTag -> GitVersion.SemanticVersionPreReleaseTag!
-GitVersion.SemanticVersion.SemanticVersion(GitVersion.SemanticVersion? semanticVersion) -> void
+GitVersion.SemanticVersion.SemanticVersion(GitVersion.SemanticVersion! semanticVersion) -> void
GitVersion.SemanticVersion.SemanticVersion(long major = 0, long minor = 0, long patch = 0) -> void
GitVersion.SemanticVersion.ToString(string! format) -> string!
GitVersion.SemanticVersion.ToString(string? format, System.IFormatProvider? formatProvider) -> string!
@@ -823,15 +823,15 @@ GitVersion.SemanticVersionPreReleaseTag
GitVersion.SemanticVersionPreReleaseTag.CompareTo(GitVersion.SemanticVersionPreReleaseTag? other) -> int
GitVersion.SemanticVersionPreReleaseTag.Equals(GitVersion.SemanticVersionPreReleaseTag? other) -> bool
GitVersion.SemanticVersionPreReleaseTag.HasTag() -> bool
-GitVersion.SemanticVersionPreReleaseTag.Name.get -> string?
+GitVersion.SemanticVersionPreReleaseTag.Name.get -> string!
GitVersion.SemanticVersionPreReleaseTag.Name.set -> void
GitVersion.SemanticVersionPreReleaseTag.Number.get -> long?
GitVersion.SemanticVersionPreReleaseTag.Number.set -> void
GitVersion.SemanticVersionPreReleaseTag.PromotedFromCommits.get -> bool?
GitVersion.SemanticVersionPreReleaseTag.PromotedFromCommits.set -> void
GitVersion.SemanticVersionPreReleaseTag.SemanticVersionPreReleaseTag() -> void
-GitVersion.SemanticVersionPreReleaseTag.SemanticVersionPreReleaseTag(GitVersion.SemanticVersionPreReleaseTag? preReleaseTag) -> void
-GitVersion.SemanticVersionPreReleaseTag.SemanticVersionPreReleaseTag(string? name, long? number) -> void
+GitVersion.SemanticVersionPreReleaseTag.SemanticVersionPreReleaseTag(GitVersion.SemanticVersionPreReleaseTag! preReleaseTag) -> void
+GitVersion.SemanticVersionPreReleaseTag.SemanticVersionPreReleaseTag(string! name, long? number) -> void
GitVersion.SemanticVersionPreReleaseTag.ToString(string! format) -> string!
GitVersion.SemanticVersionPreReleaseTag.ToString(string? format, System.IFormatProvider? formatProvider) -> string!
GitVersion.SemanticVersionWithTag
@@ -878,8 +878,6 @@ GitVersion.VersionCalculation.ConfigNextVersionVersionStrategy
GitVersion.VersionCalculation.ConfigNextVersionVersionStrategy.ConfigNextVersionVersionStrategy(System.Lazy! versionContext) -> void
GitVersion.VersionCalculation.EffectiveBranchConfigurationFinder
GitVersion.VersionCalculation.EffectiveBranchConfigurationFinder.EffectiveBranchConfigurationFinder(GitVersion.Logging.ILog! log, GitVersion.Common.IRepositoryStore! repositoryStore) -> void
-GitVersion.VersionCalculation.FallbackVersionStrategy
-GitVersion.VersionCalculation.FallbackVersionStrategy.FallbackVersionStrategy() -> void
GitVersion.VersionCalculation.IEffectiveBranchConfigurationFinder
GitVersion.VersionCalculation.IEffectiveBranchConfigurationFinder.GetConfigurations(GitVersion.IBranch! branch, GitVersion.Configuration.IGitVersionConfiguration! configuration) -> System.Collections.Generic.IEnumerable!
GitVersion.VersionCalculation.IIncrementStrategyFinder
@@ -1078,7 +1076,8 @@ static GitVersion.Configuration.BranchConfigurationBuilder.New.get -> GitVersion
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.GetBranchSpecificTag(this GitVersion.Configuration.EffectiveConfiguration! configuration, GitVersion.Logging.ILog! log, string? branchFriendlyName, string? branchNameOverride) -> string!
+static GitVersion.Configuration.ConfigurationExtensions.GetBranchSpecificLabel(this GitVersion.Configuration.EffectiveConfiguration! configuration, GitVersion.Logging.ILog! log, GitVersion.ReferenceName! branchName, string? branchNameOverride) -> string?
+static GitVersion.Configuration.ConfigurationExtensions.GetBranchSpecificLabel(this GitVersion.Configuration.EffectiveConfiguration! configuration, GitVersion.Logging.ILog! log, string? branchName, string? branchNameOverride) -> string?
static GitVersion.Configuration.ConfigurationExtensions.GetEffectiveConfiguration(this GitVersion.Configuration.IGitVersionConfiguration! configuration, GitVersion.IBranch! branch) -> GitVersion.Configuration.EffectiveConfiguration!
static GitVersion.Configuration.ConfigurationExtensions.GetFallbackBranchConfiguration(this GitVersion.Configuration.IGitVersionConfiguration! configuration) -> GitVersion.Configuration.IBranchConfiguration!
static GitVersion.Configuration.ConfigurationExtensions.GetReleaseBranchConfiguration(this GitVersion.Configuration.IGitVersionConfiguration! configuration) -> System.Collections.Generic.List>!
@@ -1226,6 +1225,5 @@ virtual GitVersion.Configuration.BranchConfigurationBuilder.WithTrackMergeTarget
virtual GitVersion.Configuration.BranchConfigurationBuilder.WithTracksReleaseBranches(bool? value) -> GitVersion.Configuration.BranchConfigurationBuilder!
virtual GitVersion.Configuration.BranchConfigurationBuilder.WithVersioningMode(GitVersion.VersionCalculation.VersioningMode? value) -> GitVersion.Configuration.BranchConfigurationBuilder!
virtual GitVersion.VersionCalculation.EffectiveBranchConfigurationFinder.GetConfigurations(GitVersion.IBranch! branch, GitVersion.Configuration.IGitVersionConfiguration! configuration) -> System.Collections.Generic.IEnumerable!
-virtual GitVersion.VersionCalculation.FallbackVersionStrategy.GetBaseVersions(GitVersion.Configuration.EffectiveBranchConfiguration! configuration) -> System.Collections.Generic.IEnumerable!
virtual GitVersion.VersionCalculation.NextVersionCalculator.FindVersion() -> GitVersion.VersionCalculation.NextVersion!
virtual GitVersion.VersionCalculation.TaggedCommitVersionStrategy.FormatSource(GitVersion.SemanticVersionWithTag! semanticVersion) -> string!
diff --git a/src/GitVersion.Core/VersionCalculation/BaseVersionCalculators/FallbackVersionStrategy.cs b/src/GitVersion.Core/VersionCalculation/BaseVersionCalculators/FallbackVersionStrategy.cs
deleted file mode 100644
index 8d1915c41b..0000000000
--- a/src/GitVersion.Core/VersionCalculation/BaseVersionCalculators/FallbackVersionStrategy.cs
+++ /dev/null
@@ -1,16 +0,0 @@
-using GitVersion.Configuration;
-
-namespace GitVersion.VersionCalculation;
-
-///
-/// Version is 0.1.0.
-/// BaseVersionSource is the "root" commit reachable from the current commit.
-/// Does not increment.
-///
-public class FallbackVersionStrategy : IVersionStrategy
-{
- public virtual IEnumerable GetBaseVersions(EffectiveBranchConfiguration configuration)
- {
- yield return new BaseVersion("Fallback base version", true, new SemanticVersion(), null, null);
- }
-}
diff --git a/src/GitVersion.Core/VersionCalculation/NextVersionCalculator.cs b/src/GitVersion.Core/VersionCalculation/NextVersionCalculator.cs
index 5a30cc64bf..0411eda268 100644
--- a/src/GitVersion.Core/VersionCalculation/NextVersionCalculator.cs
+++ b/src/GitVersion.Core/VersionCalculation/NextVersionCalculator.cs
@@ -45,8 +45,8 @@ public virtual NextVersion FindVersion()
var nextVersion = Calculate(Context.CurrentBranch, Context.Configuration);
var baseVersion = nextVersion.BaseVersion;
- var preReleaseTagName = nextVersion.Configuration.GetBranchSpecificTag(
- this.log, Context.CurrentBranch.Name.WithoutOrigin, baseVersion.BranchNameOverride
+ var preReleaseTagName = nextVersion.Configuration.GetBranchSpecificLabel(
+ this.log, Context.CurrentBranch.Name, baseVersion.BranchNameOverride
);
SemanticVersion semver;
@@ -58,21 +58,16 @@ public virtual NextVersion FindVersion()
{
var baseVersionBuildMetaData = this.mainlineVersionCalculator.CreateVersionBuildMetaData(baseVersion.BaseVersionSource);
- if (baseVersionBuildMetaData.Sha != nextVersion.IncrementedVersion.BuildMetaData.Sha)
- {
- semver = nextVersion.IncrementedVersion;
- }
- else
- {
- semver = baseVersion.SemanticVersion;
- }
+ semver = baseVersionBuildMetaData.Sha != nextVersion.IncrementedVersion.BuildMetaData.Sha
+ ? nextVersion.IncrementedVersion
+ : baseVersion.SemanticVersion;
semver.BuildMetaData = baseVersionBuildMetaData;
var lastPrefixedSemver = this.repositoryStore
.GetVersionTagsOnBranch(Context.CurrentBranch, Context.Configuration.LabelPrefix, Context.Configuration.SemanticVersionFormat)
.Where(v => MajorMinorPatchEqual(v, semver) && v.PreReleaseTag.HasTag())
- .FirstOrDefault(v => v.PreReleaseTag.Name?.IsEquivalentTo(preReleaseTagName) == true);
+ .FirstOrDefault(v => v.PreReleaseTag.Name.IsEquivalentTo(preReleaseTagName));
if (lastPrefixedSemver != null)
{
@@ -80,30 +75,36 @@ public virtual NextVersion FindVersion()
}
}
- if (semver.CompareTo(Context.CurrentCommitTaggedVersion) == 0)
+ if (Context.CurrentCommitTaggedVersion is null || Context.CurrentCommitTaggedVersion?.HasPreReleaseTagWithLabel == true)
{
- // Will always be 0, don't bother with the +0 on tags
- semver.BuildMetaData.CommitsSinceTag = null;
- }
- else
- {
- long? number;
-
- if (semver.PreReleaseTag.Name == preReleaseTagName)
+ if (!string.IsNullOrEmpty(preReleaseTagName)
+ && Context.CurrentCommitTaggedVersion?.PreReleaseTag.Name == preReleaseTagName)
{
- number = semver.PreReleaseTag.Number + 1;
+ semver.PreReleaseTag = Context.CurrentCommitTaggedVersion.PreReleaseTag;
}
- else
+ else if (preReleaseTagName == string.Empty)
{
- number = 1;
+ semver.PreReleaseTag = new SemanticVersionPreReleaseTag();
+ }
+ else if (preReleaseTagName != null)
+ {
+ long? number;
+ if (semver.PreReleaseTag.Name == preReleaseTagName)
+ {
+ number = semver.PreReleaseTag.Number + 1;
+ }
+ else
+ {
+ number = 1;
+ }
+ semver.PreReleaseTag = new SemanticVersionPreReleaseTag(preReleaseTagName, number);
}
-
- semver.PreReleaseTag = new SemanticVersionPreReleaseTag(preReleaseTagName, number);
}
- if (string.IsNullOrEmpty(preReleaseTagName))
+ if (semver.CompareTo(Context.CurrentCommitTaggedVersion) == 0)
{
- semver.PreReleaseTag = new SemanticVersionPreReleaseTag();
+ // Will always be 0, don't bother with the +0 on tags
+ semver.BuildMetaData.CommitsSinceTag = null;
}
return new(semver, baseVersion, new(nextVersion.Branch, nextVersion.Configuration));
@@ -183,9 +184,7 @@ static NextVersion CompareVersions(
log.Info($"Base version used: {calculatedBase}");
- var nextVersion = new NextVersion(maxVersion.IncrementedVersion, calculatedBase, maxVersion.Branch, maxVersion.Configuration);
-
- return nextVersion;
+ return new NextVersion(maxVersion.IncrementedVersion, calculatedBase, maxVersion.Branch, maxVersion.Configuration);
}
}
@@ -194,9 +193,9 @@ private IEnumerable GetNextVersions(IBranch branch, IGitVersionConf
if (branch.Tip == null)
throw new GitVersionException("No commits found on the current branch.");
- return GetNextVersions();
+ return GetNextVersionsInternal();
- IEnumerable GetNextVersions()
+ IEnumerable GetNextVersionsInternal()
{
var atLeastOneBaseVersionReturned = false;
@@ -209,21 +208,11 @@ IEnumerable GetNextVersions()
log.Info(baseVersion.ToString());
if (IncludeVersion(baseVersion, configuration.Ignore))
{
- var incrementStrategy = incrementStrategyFinder.DetermineIncrementedField(
- context: Context,
- baseVersion: baseVersion,
- configuration: effectiveBranchConfiguration.Value
- );
- var incrementedVersion = incrementStrategy == VersionField.None
- ? baseVersion.SemanticVersion
- : baseVersion.SemanticVersion.IncrementVersion(incrementStrategy);
-
- if (effectiveBranchConfiguration.Value.VersioningMode == VersioningMode.Mainline)
+ var incrementedVersion = GetIncrementedVersion(effectiveBranchConfiguration, baseVersion);
+ if (effectiveBranchConfiguration.Value.VersioningMode == VersioningMode.Mainline
+ && incrementedVersion.PreReleaseTag.HasTag())
{
- if (incrementedVersion.PreReleaseTag.HasTag())
- {
- continue;
- }
+ continue;
}
yield return effectiveBranchConfiguration.CreateNextVersion(baseVersion, incrementedVersion);
@@ -235,11 +224,28 @@ IEnumerable GetNextVersions()
if (!atLeastOneBaseVersionReturned)
{
- throw new GitVersionException("No base versions determined on the current branch.");
+ foreach (var effectiveBranchConfiguration in effectiveBranchConfigurationFinder.GetConfigurations(branch, configuration))
+ {
+ var baseVersion = new BaseVersion("Fallback base version", true, new SemanticVersion(), null, null);
+ var incrementedVersion = GetIncrementedVersion(effectiveBranchConfiguration, baseVersion);
+ yield return effectiveBranchConfiguration.CreateNextVersion(baseVersion, incrementedVersion);
+ }
}
}
}
+ private SemanticVersion GetIncrementedVersion(EffectiveBranchConfiguration effectiveBranchConfiguration, BaseVersion baseVersion)
+ {
+ var incrementStrategy = incrementStrategyFinder.DetermineIncrementedField(
+ context: Context,
+ baseVersion: baseVersion,
+ configuration: effectiveBranchConfiguration.Value
+ );
+ return incrementStrategy == VersionField.None
+ ? baseVersion.SemanticVersion
+ : baseVersion.SemanticVersion.IncrementVersion(incrementStrategy);
+ }
+
private bool IncludeVersion(BaseVersion baseVersion, IIgnoreConfiguration ignoreConfiguration)
{
foreach (var versionFilter in ignoreConfiguration.ToFilters())
diff --git a/src/GitVersion.Core/VersionCalculation/SemanticVersioning/SemanticVersion.cs b/src/GitVersion.Core/VersionCalculation/SemanticVersioning/SemanticVersion.cs
index 7081bc6a5f..90a8fa60e8 100644
--- a/src/GitVersion.Core/VersionCalculation/SemanticVersioning/SemanticVersion.cs
+++ b/src/GitVersion.Core/VersionCalculation/SemanticVersioning/SemanticVersion.cs
@@ -35,14 +35,16 @@ public SemanticVersion(long major = 0, long minor = 0, long patch = 0)
this.BuildMetaData = new SemanticVersionBuildMetaData();
}
- public SemanticVersion(SemanticVersion? semanticVersion)
+ public SemanticVersion(SemanticVersion semanticVersion)
{
- this.Major = semanticVersion?.Major ?? 0;
- this.Minor = semanticVersion?.Minor ?? 0;
- this.Patch = semanticVersion?.Patch ?? 0;
+ semanticVersion.NotNull();
- this.PreReleaseTag = new SemanticVersionPreReleaseTag(semanticVersion?.PreReleaseTag);
- this.BuildMetaData = new SemanticVersionBuildMetaData(semanticVersion?.BuildMetaData);
+ this.Major = semanticVersion.Major;
+ this.Minor = semanticVersion.Minor;
+ this.Patch = semanticVersion.Patch;
+
+ this.PreReleaseTag = new SemanticVersionPreReleaseTag(semanticVersion.PreReleaseTag);
+ this.BuildMetaData = new SemanticVersionBuildMetaData(semanticVersion.BuildMetaData);
}
public bool Equals(SemanticVersion? obj)
diff --git a/src/GitVersion.Core/VersionCalculation/SemanticVersioning/SemanticVersionPreReleaseTag.cs b/src/GitVersion.Core/VersionCalculation/SemanticVersioning/SemanticVersionPreReleaseTag.cs
index b199f683db..e96e6b09e5 100644
--- a/src/GitVersion.Core/VersionCalculation/SemanticVersioning/SemanticVersionPreReleaseTag.cs
+++ b/src/GitVersion.Core/VersionCalculation/SemanticVersioning/SemanticVersionPreReleaseTag.cs
@@ -5,7 +5,7 @@
namespace GitVersion;
-public class SemanticVersionPreReleaseTag :
+public sealed class SemanticVersionPreReleaseTag :
IFormattable, IComparable, IEquatable
{
private static readonly Regex ParseRegex = new(
@@ -15,24 +15,24 @@ public class SemanticVersionPreReleaseTag :
private static readonly LambdaEqualityHelper EqualityHelper =
new(x => x.Name, x => x.Number);
- public SemanticVersionPreReleaseTag()
- {
- }
+ public SemanticVersionPreReleaseTag() => Name = string.Empty;
- public SemanticVersionPreReleaseTag(string? name, long? number)
+ public SemanticVersionPreReleaseTag(string name, long? number)
{
- Name = name;
+ Name = name.NotNull();
Number = number;
}
- public SemanticVersionPreReleaseTag(SemanticVersionPreReleaseTag? preReleaseTag)
+ public SemanticVersionPreReleaseTag(SemanticVersionPreReleaseTag preReleaseTag)
{
- Name = preReleaseTag?.Name;
- Number = preReleaseTag?.Number;
- PromotedFromCommits = preReleaseTag?.PromotedFromCommits;
+ preReleaseTag.NotNull();
+
+ Name = preReleaseTag.Name;
+ Number = preReleaseTag.Number;
+ PromotedFromCommits = preReleaseTag.PromotedFromCommits;
}
- public string? Name { get; set; }
+ public string Name { get; set; }
public long? Number { get; set; }
diff --git a/src/GitVersion.Core/VersionCalculation/VariableProvider.cs b/src/GitVersion.Core/VersionCalculation/VariableProvider.cs
index 52b592c447..4fc6d1319c 100644
--- a/src/GitVersion.Core/VersionCalculation/VariableProvider.cs
+++ b/src/GitVersion.Core/VersionCalculation/VariableProvider.cs
@@ -27,12 +27,13 @@ public VersionVariables GetVariablesFor(SemanticVersion semanticVersion, Effecti
// Continuous Deployment always requires a pre-release tag unless the commit is tagged
if (!semanticVersion.PreReleaseTag.HasTag())
{
- semanticVersion.PreReleaseTag.Name = configuration.GetBranchSpecificTag(this.log, semanticVersion.BuildMetaData.Branch, null);
+ var label = configuration.GetBranchSpecificLabel(this.log, semanticVersion.BuildMetaData.Branch, null);
+ semanticVersion.PreReleaseTag.Name = label ?? string.Empty;
if (semanticVersion.PreReleaseTag.Name.IsNullOrEmpty())
{
// TODO: Why do we manipulating the semantic version here in the VariableProvider? The method name is GET not MANIPULATE.
// What is about the separation of concern and single-responsibility principle?
- semanticVersion.PreReleaseTag.Name = configuration.Label;
+ semanticVersion.PreReleaseTag.Name = configuration.Label ?? string.Empty;
}
}
}