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; } } }