diff --git a/docs/configuration.md b/docs/configuration.md index f96b6ea4ee..e0941eaa9d 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -206,6 +206,7 @@ branches: track-merge-target: false tracks-release-branches: false is-release-branch: true + pre-release-weight: 1000 feature: regex: ^features?[/-] mode: ContinuousDelivery @@ -385,3 +386,6 @@ Indicates this branch config represents a release branch in GitFlow. ### is-mainline When using Mainline mode, this indicates that this branch is a mainline. By default support/ and master are mainlines. + +### pre-release-weight +Provides a way to translate the `PreReleaseLabel` ([variables](/more-info/variables)) to a numeric value in order to avoid version collisions across different branches. For example, a release branch created after "1.2.3-alpha.55" results in "1.2.3-beta.1" and thus e.g. "1.2.3-alpha.4" and "1.2.3-beta.4" would have the same file version: "1.2.3.4". One of the ways to use this value is to set `assembly-file-versioning-format: {Major}.{Minor}.{Patch}.{WeightedPreReleaseNumber}`. If the `pre-release-weight` is set, it would be added to the `PreReleaseNumber` to get a final `AssemblySemFileVer`, otherwise a branch specific default for `pre-release-weight` will be used in the calculation. Related Issues [1145](https://github.com/GitTools/GitVersion/issues/1145), [1366](https://github.com/GitTools/GitVersion/issues/1366) \ No newline at end of file diff --git a/docs/more-info/variables.md b/docs/more-info/variables.md index 8fc170b963..c9f883244a 100644 --- a/docs/more-info/variables.md +++ b/docs/more-info/variables.md @@ -11,6 +11,7 @@ For the `release/3.0.0` branch of GitVersion it shows: "PreReleaseTagWithDash":"-beta.1", "PreReleaseLabel":"beta", "PreReleaseNumber":1, + "WeightedPreReleaseNumber":1001, "BuildMetaData":1, "BuildMetaDataPadded": "0001", "FullBuildMetaData":"1.Branch.release/3.0.0.Sha.28c853159a46b5a87e6cc9c4f6e940c59d6bc68a", @@ -40,3 +41,6 @@ For the `release/3.0.0` branch of GitVersion it shows: This is a common approach that gives you the ability to roll out hot fixes to your assembly without breaking existing applications that may be referencing it. You are still able to get the full version number if you need to by looking at its file version number. +#### What is WeightedPreReleaseNumber? + +It is a summation of branch specific `pre-release-weight` and the `PreReleaseNumber`. It can be used to obtain a monotonically increasing version number across the branches. \ No newline at end of file diff --git a/src/GitVersionCore.Tests/Approved/JsonVersionBuilderTests.Json.approved.txt b/src/GitVersionCore.Tests/Approved/JsonVersionBuilderTests.Json.approved.txt index 73d8519a48..b4eca77f3d 100644 --- a/src/GitVersionCore.Tests/Approved/JsonVersionBuilderTests.Json.approved.txt +++ b/src/GitVersionCore.Tests/Approved/JsonVersionBuilderTests.Json.approved.txt @@ -6,6 +6,7 @@ "PreReleaseTagWithDash":"-unstable.4", "PreReleaseLabel":"unstable", "PreReleaseNumber":4, + "WeightedPreReleaseNumber":4, "BuildMetaData":5, "BuildMetaDataPadded":"0005", "FullBuildMetaData":"5.Branch.feature1.Sha.commitSha", diff --git a/src/GitVersionCore.Tests/Approved/VariableProviderTests.ProvidesVariablesInContinuousDeliveryModeForPreRelease.approved.txt b/src/GitVersionCore.Tests/Approved/VariableProviderTests.ProvidesVariablesInContinuousDeliveryModeForPreRelease.approved.txt index 4b2a620248..6d232cdc87 100644 --- a/src/GitVersionCore.Tests/Approved/VariableProviderTests.ProvidesVariablesInContinuousDeliveryModeForPreRelease.approved.txt +++ b/src/GitVersionCore.Tests/Approved/VariableProviderTests.ProvidesVariablesInContinuousDeliveryModeForPreRelease.approved.txt @@ -6,6 +6,7 @@ "PreReleaseTagWithDash":"-unstable.4", "PreReleaseLabel":"unstable", "PreReleaseNumber":4, + "WeightedPreReleaseNumber":4, "BuildMetaData":5, "BuildMetaDataPadded":"0005", "FullBuildMetaData":"5.Branch.develop.Sha.commitSha", diff --git a/src/GitVersionCore.Tests/Approved/VariableProviderTests.ProvidesVariablesInContinuousDeliveryModeForPreReleaseWithPadding.approved.txt b/src/GitVersionCore.Tests/Approved/VariableProviderTests.ProvidesVariablesInContinuousDeliveryModeForPreReleaseWithPadding.approved.txt index c4b38bab2b..fde1b2c423 100644 --- a/src/GitVersionCore.Tests/Approved/VariableProviderTests.ProvidesVariablesInContinuousDeliveryModeForPreReleaseWithPadding.approved.txt +++ b/src/GitVersionCore.Tests/Approved/VariableProviderTests.ProvidesVariablesInContinuousDeliveryModeForPreReleaseWithPadding.approved.txt @@ -6,6 +6,7 @@ "PreReleaseTagWithDash":"-unstable.4", "PreReleaseLabel":"unstable", "PreReleaseNumber":4, + "WeightedPreReleaseNumber":4, "BuildMetaData":5, "BuildMetaDataPadded":"05", "FullBuildMetaData":"5.Branch.develop.Sha.commitSha", diff --git a/src/GitVersionCore.Tests/Approved/VariableProviderTests.ProvidesVariablesInContinuousDeliveryModeForStable.approved.txt b/src/GitVersionCore.Tests/Approved/VariableProviderTests.ProvidesVariablesInContinuousDeliveryModeForStable.approved.txt index 4c62ef7178..3f4b13ed31 100644 --- a/src/GitVersionCore.Tests/Approved/VariableProviderTests.ProvidesVariablesInContinuousDeliveryModeForStable.approved.txt +++ b/src/GitVersionCore.Tests/Approved/VariableProviderTests.ProvidesVariablesInContinuousDeliveryModeForStable.approved.txt @@ -6,6 +6,7 @@ "PreReleaseTagWithDash":"", "PreReleaseLabel":"", "PreReleaseNumber":"", + "WeightedPreReleaseNumber":"", "BuildMetaData":5, "BuildMetaDataPadded":"0005", "FullBuildMetaData":"5.Branch.develop.Sha.commitSha", diff --git a/src/GitVersionCore.Tests/Approved/VariableProviderTests.ProvidesVariablesInContinuousDeploymentModeForPreRelease.approved.txt b/src/GitVersionCore.Tests/Approved/VariableProviderTests.ProvidesVariablesInContinuousDeploymentModeForPreRelease.approved.txt index 34d620cdb0..9bcefac614 100644 --- a/src/GitVersionCore.Tests/Approved/VariableProviderTests.ProvidesVariablesInContinuousDeploymentModeForPreRelease.approved.txt +++ b/src/GitVersionCore.Tests/Approved/VariableProviderTests.ProvidesVariablesInContinuousDeploymentModeForPreRelease.approved.txt @@ -6,6 +6,7 @@ "PreReleaseTagWithDash":"-unstable.5", "PreReleaseLabel":"unstable", "PreReleaseNumber":5, + "WeightedPreReleaseNumber":5, "BuildMetaData":"", "BuildMetaDataPadded":"", "FullBuildMetaData":"Branch.develop.Sha.commitSha", diff --git a/src/GitVersionCore.Tests/Approved/VariableProviderTests.ProvidesVariablesInContinuousDeploymentModeForStable.approved.txt b/src/GitVersionCore.Tests/Approved/VariableProviderTests.ProvidesVariablesInContinuousDeploymentModeForStable.approved.txt index cdb12ad18b..a3f6376706 100644 --- a/src/GitVersionCore.Tests/Approved/VariableProviderTests.ProvidesVariablesInContinuousDeploymentModeForStable.approved.txt +++ b/src/GitVersionCore.Tests/Approved/VariableProviderTests.ProvidesVariablesInContinuousDeploymentModeForStable.approved.txt @@ -6,6 +6,7 @@ "PreReleaseTagWithDash":"-ci.5", "PreReleaseLabel":"ci", "PreReleaseNumber":5, + "WeightedPreReleaseNumber":5, "BuildMetaData":"", "BuildMetaDataPadded":"", "FullBuildMetaData":"Branch.develop.Sha.commitSha", diff --git a/src/GitVersionCore.Tests/Approved/VariableProviderTests.ProvidesVariablesInContinuousDeploymentModeForStableWhenCurrentCommitIsTagged.approved.txt b/src/GitVersionCore.Tests/Approved/VariableProviderTests.ProvidesVariablesInContinuousDeploymentModeForStableWhenCurrentCommitIsTagged.approved.txt index 9a514f337d..823905db5e 100644 --- a/src/GitVersionCore.Tests/Approved/VariableProviderTests.ProvidesVariablesInContinuousDeploymentModeForStableWhenCurrentCommitIsTagged.approved.txt +++ b/src/GitVersionCore.Tests/Approved/VariableProviderTests.ProvidesVariablesInContinuousDeploymentModeForStableWhenCurrentCommitIsTagged.approved.txt @@ -6,6 +6,7 @@ "PreReleaseTagWithDash":"", "PreReleaseLabel":"", "PreReleaseNumber":"", + "WeightedPreReleaseNumber":"", "BuildMetaData":5, "BuildMetaDataPadded":"0005", "FullBuildMetaData":"5.Sha.commitSha", diff --git a/src/GitVersionCore.Tests/Approved/WixFileTests.UpdateWixVersionFile.approved.txt b/src/GitVersionCore.Tests/Approved/WixFileTests.UpdateWixVersionFile.approved.txt index 7648bd1ef3..1a64c40973 100644 --- a/src/GitVersionCore.Tests/Approved/WixFileTests.UpdateWixVersionFile.approved.txt +++ b/src/GitVersionCore.Tests/Approved/WixFileTests.UpdateWixVersionFile.approved.txt @@ -28,4 +28,5 @@ + \ No newline at end of file diff --git a/src/GitVersionCore.Tests/Approved/cs/GitVersionInformationGeneratorTests.ShouldCreateFile.approved.txt b/src/GitVersionCore.Tests/Approved/cs/GitVersionInformationGeneratorTests.ShouldCreateFile.approved.txt index cf3225e48a..4c485502cd 100644 --- a/src/GitVersionCore.Tests/Approved/cs/GitVersionInformationGeneratorTests.ShouldCreateFile.approved.txt +++ b/src/GitVersionCore.Tests/Approved/cs/GitVersionInformationGeneratorTests.ShouldCreateFile.approved.txt @@ -18,6 +18,7 @@ static class GitVersionInformation public static string PreReleaseTagWithDash = "-unstable.4"; public static string PreReleaseLabel = "unstable"; public static string PreReleaseNumber = "4"; + public static string WeightedPreReleaseNumber = "4"; public static string BuildMetaData = "5"; public static string BuildMetaDataPadded = "0005"; public static string FullBuildMetaData = "5.Branch.feature1.Sha.commitSha"; diff --git a/src/GitVersionCore.Tests/Approved/fs/GitVersionInformationGeneratorTests.ShouldCreateFile.approved.txt b/src/GitVersionCore.Tests/Approved/fs/GitVersionInformationGeneratorTests.ShouldCreateFile.approved.txt index 12bf359b72..3b4b890510 100644 --- a/src/GitVersionCore.Tests/Approved/fs/GitVersionInformationGeneratorTests.ShouldCreateFile.approved.txt +++ b/src/GitVersionCore.Tests/Approved/fs/GitVersionInformationGeneratorTests.ShouldCreateFile.approved.txt @@ -18,6 +18,7 @@ module GitVersionInformation let PreReleaseTagWithDash = "-unstable.4" let PreReleaseLabel = "unstable" let PreReleaseNumber = "4" + let WeightedPreReleaseNumber = "4" let BuildMetaData = "5" let BuildMetaDataPadded = "0005" let FullBuildMetaData = "5.Branch.feature1.Sha.commitSha" diff --git a/src/GitVersionCore.Tests/Approved/vb/GitVersionInformationGeneratorTests.ShouldCreateFile.approved.txt b/src/GitVersionCore.Tests/Approved/vb/GitVersionInformationGeneratorTests.ShouldCreateFile.approved.txt index b628771a5d..429bcf29a9 100644 --- a/src/GitVersionCore.Tests/Approved/vb/GitVersionInformationGeneratorTests.ShouldCreateFile.approved.txt +++ b/src/GitVersionCore.Tests/Approved/vb/GitVersionInformationGeneratorTests.ShouldCreateFile.approved.txt @@ -19,6 +19,7 @@ NotInheritable Class GitVersionInformation Public Shared PreReleaseTagWithDash As String = "-unstable.4" Public Shared PreReleaseLabel As String = "unstable" Public Shared PreReleaseNumber As String = "4" + Public Shared WeightedPreReleaseNumber As String = "4" Public Shared BuildMetaData As String = "5" Public Shared BuildMetaDataPadded As String = "0005" Public Shared FullBuildMetaData As String = "5.Branch.feature1.Sha.commitSha" diff --git a/src/GitVersionCore.Tests/CommitDateTests.cs b/src/GitVersionCore.Tests/CommitDateTests.cs index 541b362903..0f6c51d800 100644 --- a/src/GitVersionCore.Tests/CommitDateTests.cs +++ b/src/GitVersionCore.Tests/CommitDateTests.cs @@ -26,7 +26,7 @@ public void CommitDateFormatTest(string format, string expectedOutcome) }, new EffectiveConfiguration( AssemblyVersioningScheme.MajorMinorPatch, AssemblyFileVersioningScheme.MajorMinorPatch, "", "", "", VersioningMode.ContinuousDelivery, "", "", "", IncrementStrategy.Inherit, - "", true, "", "", false, "", "", "", "", CommitMessageIncrementMode.Enabled, 4, 4, 4, Enumerable.Empty(), false, true, format) + "", true, "", "", false, "", "", "", "", CommitMessageIncrementMode.Enabled, 4, 4, 4, Enumerable.Empty(), false, true, format, 0) ); Assert.That(formatValues.CommitDate, Is.EqualTo(expectedOutcome)); diff --git a/src/GitVersionCore.Tests/ConfigProviderTests.CanWriteOutEffectiveConfiguration.approved.txt b/src/GitVersionCore.Tests/ConfigProviderTests.CanWriteOutEffectiveConfiguration.approved.txt index 7d0d4f02a6..a2918846a6 100644 --- a/src/GitVersionCore.Tests/ConfigProviderTests.CanWriteOutEffectiveConfiguration.approved.txt +++ b/src/GitVersionCore.Tests/ConfigProviderTests.CanWriteOutEffectiveConfiguration.approved.txt @@ -23,6 +23,7 @@ branches: tracks-release-branches: true is-release-branch: false is-mainline: false + pre-release-weight: 0 master: mode: ContinuousDelivery tag: '' @@ -36,6 +37,7 @@ branches: tracks-release-branches: false is-release-branch: false is-mainline: true + pre-release-weight: 55000 release: mode: ContinuousDelivery tag: beta @@ -51,6 +53,7 @@ branches: tracks-release-branches: false is-release-branch: true is-mainline: false + pre-release-weight: 30000 feature: mode: ContinuousDelivery tag: useBranchName @@ -68,6 +71,7 @@ branches: tracks-release-branches: false is-release-branch: false is-mainline: false + pre-release-weight: 30000 pull-request: mode: ContinuousDelivery tag: PullRequest @@ -86,6 +90,7 @@ branches: tracks-release-branches: false is-release-branch: false is-mainline: false + pre-release-weight: 30000 hotfix: mode: ContinuousDelivery tag: beta @@ -100,6 +105,7 @@ branches: tracks-release-branches: false is-release-branch: false is-mainline: false + pre-release-weight: 30000 support: mode: ContinuousDelivery tag: '' @@ -112,6 +118,7 @@ branches: tracks-release-branches: false is-release-branch: false is-mainline: true + pre-release-weight: 55000 ignore: sha: [] commit-date-format: yyyy-MM-dd diff --git a/src/GitVersionCore.Tests/ExecuteCoreTests.cs b/src/GitVersionCore.Tests/ExecuteCoreTests.cs index 376d00776f..997a2f9119 100644 --- a/src/GitVersionCore.Tests/ExecuteCoreTests.cs +++ b/src/GitVersionCore.Tests/ExecuteCoreTests.cs @@ -50,6 +50,7 @@ public void CacheFileExistsOnDisk() PreReleaseTagWithDash: -test.19 PreReleaseLabel: test PreReleaseNumber: 19 +WeightedPreReleaseNumber: 19 BuildMetaData: BuildMetaDataPadded: FullBuildMetaData: Branch.feature/test.Sha.dd2a29aff0c948e1bdf3dabbe13e1576e70d5f9f @@ -161,6 +162,7 @@ public void ConfigChangeInvalidatesCache() PreReleaseTagWithDash: -test.19 PreReleaseLabel: test PreReleaseNumber: 19 +WeightedPreReleaseNumber: 19 BuildMetaData: BuildMetaDataPadded: FullBuildMetaData: Branch.feature/test.Sha.dd2a29aff0c948e1bdf3dabbe13e1576e70d5f9f @@ -211,6 +213,7 @@ public void NoCacheBypassesCache() PreReleaseTagWithDash: -test.19 PreReleaseLabel: test PreReleaseNumber: 19 +WeightedPreReleaseNumber: 19 BuildMetaData: BuildMetaDataPadded: FullBuildMetaData: Branch.feature/test.Sha.dd2a29aff0c948e1bdf3dabbe13e1576e70d5f9f diff --git a/src/GitVersionCore.Tests/IntegrationTests/ReleaseBranchScenarios.cs b/src/GitVersionCore.Tests/IntegrationTests/ReleaseBranchScenarios.cs index f7a92bac01..8143f63e7a 100644 --- a/src/GitVersionCore.Tests/IntegrationTests/ReleaseBranchScenarios.cs +++ b/src/GitVersionCore.Tests/IntegrationTests/ReleaseBranchScenarios.cs @@ -1,4 +1,4 @@ -using GitTools.Testing; +using GitTools.Testing; using GitVersion; using GitVersionCore.Tests; using LibGit2Sharp; @@ -551,6 +551,52 @@ public void FeatureFromReleaseBranch_ShouldNotResetCount() } } + [Test] + public void AssemblySemFileVerShouldBeWeightedByPreReleaseWeight() + { + var config = new Config + { + AssemblyFileVersioningFormat = "{Major}.{Minor}.{Patch}.{WeightedPreReleaseNumber}", + Branches = + { + { "release", new BranchConfig + { + PreReleaseWeight = 1000 + } + } + } + }; + using (var fixture = new EmptyRepositoryFixture()) + { + fixture.Repository.MakeATaggedCommit("1.0.3"); + fixture.Repository.MakeCommits(5); + fixture.Repository.CreateBranch("release-2.0.0"); + fixture.Checkout("release-2.0.0"); + ConfigurationProvider.ApplyDefaultsTo(config); + var variables = fixture.GetVersion(config); + Assert.AreEqual(variables.AssemblySemFileVer, "2.0.0.1001"); + } + } + + [Test] + public void AssemblySemFileVerShouldBeWeightedByDefaultPreReleaseWeight() + { + var config = new Config + { + AssemblyFileVersioningFormat = "{Major}.{Minor}.{Patch}.{WeightedPreReleaseNumber}", + }; + using (var fixture = new EmptyRepositoryFixture()) + { + fixture.Repository.MakeATaggedCommit("1.0.3"); + fixture.Repository.MakeCommits(5); + fixture.Repository.CreateBranch("release-2.0.0"); + fixture.Checkout("release-2.0.0"); + ConfigurationProvider.ApplyDefaultsTo(config); + var variables = fixture.GetVersion(config); + Assert.AreEqual(variables.AssemblySemFileVer, "2.0.0.30001"); + } + } + /// /// Create a feature branch from a release branch, and merge back, then delete it /// @@ -623,4 +669,4 @@ public void FeatureOnRelease_FeatureBranchNotDeleted() fixture.AssertFullSemver(config, "4.5.0-beta.2"); } } -} \ No newline at end of file +} diff --git a/src/GitVersionCore.Tests/TestEffectiveConfiguration.cs b/src/GitVersionCore.Tests/TestEffectiveConfiguration.cs index 876de76ac1..fcbd7505f8 100644 --- a/src/GitVersionCore.Tests/TestEffectiveConfiguration.cs +++ b/src/GitVersionCore.Tests/TestEffectiveConfiguration.cs @@ -40,7 +40,7 @@ public TestEffectiveConfiguration( majorMessage, minorMessage, patchMessage, noBumpMessage, commitMessageMode, legacySemVerPadding, buildMetaDataPadding, commitsSinceVersionSourcePadding, versionFilters ?? Enumerable.Empty(), - tracksReleaseBranches, isRelease, commitDateFormat) + tracksReleaseBranches, isRelease, commitDateFormat, 0) { } } diff --git a/src/GitVersionCore.Tests/TestableVersionVariables.cs b/src/GitVersionCore.Tests/TestableVersionVariables.cs index 33fb8d330e..b1cb388c65 100644 --- a/src/GitVersionCore.Tests/TestableVersionVariables.cs +++ b/src/GitVersionCore.Tests/TestableVersionVariables.cs @@ -4,7 +4,22 @@ class TestableVersionVariables : VersionVariables { - public TestableVersionVariables(string major = "", string minor = "", string patch = "", string buildMetaData = "", string buildMetaDataPadded = "", string fullBuildMetaData = "", string branchName = "", string sha = "", string shortSha = "", string majorMinorPatch = "", string semVer = "", string legacySemVer = "", string legacySemVerPadded = "", string fullSemVer = "", string assemblySemVer = "", string assemblySemFileVer = "", string preReleaseTag = "", string preReleaseTagWithDash = "", string preReleaseLabel = "", string preReleaseNumber = "", string informationalVersion = "", string commitDate = "", string nugetVersion = "", string nugetVersionV2 = "", string nugetPreReleaseTag = "", string nugetPreReleaseTagV2 = "", string commitsSinceVersionSource = "", string commitsSinceVersionSourcePadded = "") : base(major, minor, patch, buildMetaData, buildMetaDataPadded, fullBuildMetaData, branchName, sha, shortSha, majorMinorPatch, semVer, legacySemVer, legacySemVerPadded, fullSemVer, assemblySemVer, assemblySemFileVer, preReleaseTag, preReleaseTagWithDash, preReleaseLabel, preReleaseNumber, informationalVersion, commitDate, nugetVersion, nugetVersionV2, nugetPreReleaseTag, nugetPreReleaseTagV2, commitsSinceVersionSource, commitsSinceVersionSourcePadded) + public TestableVersionVariables( + string major = "", string minor = "", string patch = "", string buildMetaData = "", + string buildMetaDataPadded = "", string fullBuildMetaData = "", string branchName = "", + string sha = "", string shortSha = "", string majorMinorPatch = "", string semVer = "", + string legacySemVer = "", string legacySemVerPadded = "", string fullSemVer = "", + string assemblySemVer = "", string assemblySemFileVer = "", string preReleaseTag = "", + string preReleaseTagWithDash = "", string preReleaseLabel = "", string preReleaseNumber = "", + string weightedPreReleaseNumber = "", string informationalVersion = "", string commitDate = "", + string nugetVersion = "", string nugetVersionV2 = "", string nugetPreReleaseTag = "", + string nugetPreReleaseTagV2 = "", string commitsSinceVersionSource = "", + string commitsSinceVersionSourcePadded = "") : base( + major, minor, patch, buildMetaData, buildMetaDataPadded, fullBuildMetaData, branchName, + sha, shortSha, majorMinorPatch, semVer, legacySemVer, legacySemVerPadded, fullSemVer, + assemblySemVer, assemblySemFileVer, preReleaseTag, weightedPreReleaseNumber, preReleaseTagWithDash, + preReleaseLabel, preReleaseNumber, informationalVersion, commitDate, nugetVersion, nugetVersionV2, + nugetPreReleaseTag, nugetPreReleaseTagV2, commitsSinceVersionSource, commitsSinceVersionSourcePadded) { } } diff --git a/src/GitVersionCore/Configuration/BranchConfig.cs b/src/GitVersionCore/Configuration/BranchConfig.cs index c0e717adae..3f8ac2504a 100644 --- a/src/GitVersionCore/Configuration/BranchConfig.cs +++ b/src/GitVersionCore/Configuration/BranchConfig.cs @@ -28,6 +28,7 @@ public BranchConfig(BranchConfig branchConfiguration) Name = branchConfiguration.Name; SourceBranches = branchConfiguration.SourceBranches; IsSourceBranchFor = branchConfiguration.IsSourceBranchFor; + PreReleaseWeight = branchConfiguration.PreReleaseWeight; } [YamlMember(Alias = "mode")] @@ -72,6 +73,9 @@ public BranchConfig(BranchConfig branchConfiguration) [YamlMember(Alias = "is-mainline")] public bool? IsMainline { get; set; } + [YamlMember(Alias = "pre-release-weight")] + public int? PreReleaseWeight { get; set; } + /// /// The name given to this configuration in the config file. /// diff --git a/src/GitVersionCore/Configuration/ConfigurationProvider.cs b/src/GitVersionCore/Configuration/ConfigurationProvider.cs index 74d586a538..498172faa6 100644 --- a/src/GitVersionCore/Configuration/ConfigurationProvider.cs +++ b/src/GitVersionCore/Configuration/ConfigurationProvider.cs @@ -28,6 +28,17 @@ public class ConfigurationProvider public const string HotfixBranchKey = "hotfix"; public const string SupportBranchKey = "support"; public const string DevelopBranchKey = "develop"; + public static Dictionary DefaultPreReleaseWeight = + new Dictionary + { + { DevelopBranchRegex, 0 }, + { HotfixBranchRegex, 30000 }, + { ReleaseBranchRegex, 30000 }, + { FeatureBranchRegex, 30000 }, + { PullRequestRegex, 30000 }, + { SupportBranchRegex, 55000 }, + { MasterBranchRegex, 55000 } + }; private const IncrementStrategy DefaultIncrementStrategy = IncrementStrategy.Inherit; @@ -231,6 +242,9 @@ public static void ApplyBranchDefaults(Config config, branchConfig.TracksReleaseBranches = branchConfig.TracksReleaseBranches ?? tracksReleaseBranches; branchConfig.IsReleaseBranch = branchConfig.IsReleaseBranch ?? isReleaseBranch; branchConfig.IsMainline = branchConfig.IsMainline ?? isMainline; + int defaultPreReleaseNumber = 0; + DefaultPreReleaseWeight.TryGetValue(branchRegex, out defaultPreReleaseNumber); + branchConfig.PreReleaseWeight = branchConfig.PreReleaseWeight ?? defaultPreReleaseNumber; } static Config ReadConfig(string workingDirectory, IFileSystem fileSystem) diff --git a/src/GitVersionCore/EffectiveConfiguration.cs b/src/GitVersionCore/EffectiveConfiguration.cs index abf2cd9aec..93b32823b8 100644 --- a/src/GitVersionCore/EffectiveConfiguration.cs +++ b/src/GitVersionCore/EffectiveConfiguration.cs @@ -32,7 +32,8 @@ public EffectiveConfiguration( IEnumerable versionFilters, bool tracksReleaseBranches, bool isCurrentBranchRelease, - string commitDateFormat) + string commitDateFormat, + int preReleaseWeight) { AssemblyVersioningScheme = assemblyVersioningScheme; AssemblyFileVersioningScheme = assemblyFileVersioningScheme; @@ -61,6 +62,7 @@ public EffectiveConfiguration( TracksReleaseBranches = tracksReleaseBranches; IsCurrentBranchRelease = isCurrentBranchRelease; CommitDateFormat = commitDateFormat; + PreReleaseWeight = preReleaseWeight; } public bool TracksReleaseBranches { get; private set; } @@ -115,5 +117,7 @@ public EffectiveConfiguration( public IEnumerable VersionFilters { get; private set; } public string CommitDateFormat { get; private set; } + + public int PreReleaseWeight { get; private set; } } } \ No newline at end of file diff --git a/src/GitVersionCore/GitVersionContext.cs b/src/GitVersionCore/GitVersionContext.cs index 4478d330b4..2b1602a094 100644 --- a/src/GitVersionCore/GitVersionContext.cs +++ b/src/GitVersionCore/GitVersionContext.cs @@ -117,6 +117,7 @@ void CalculateEffectiveConfiguration() var incrementStrategy = currentBranchConfig.Increment.Value; var preventIncrementForMergedBranchVersion = currentBranchConfig.PreventIncrementOfMergedBranchVersion.Value; var trackMergeTarget = currentBranchConfig.TrackMergeTarget.Value; + var preReleaseWeight = currentBranchConfig.PreReleaseWeight ?? 0; var nextVersion = FullConfiguration.NextVersion; var assemblyVersioningScheme = FullConfiguration.AssemblyVersioningScheme.Value; @@ -148,7 +149,8 @@ void CalculateEffectiveConfiguration() FullConfiguration.Ignore.ToFilters(), currentBranchConfig.TracksReleaseBranches.Value, currentBranchConfig.IsReleaseBranch.Value, - commitDateFormat); + commitDateFormat, + preReleaseWeight); } private static Branch GetTargetBranch(IRepository repository, string targetBranch) diff --git a/src/GitVersionCore/OutputVariables/VariableProvider.cs b/src/GitVersionCore/OutputVariables/VariableProvider.cs index 05a45a2a1e..ac19373912 100644 --- a/src/GitVersionCore/OutputVariables/VariableProvider.cs +++ b/src/GitVersionCore/OutputVariables/VariableProvider.cs @@ -72,6 +72,7 @@ public static VersionVariables GetVariablesFor(SemanticVersion semanticVersion, semverFormatValues.PreReleaseTagWithDash, semverFormatValues.PreReleaseLabel, semverFormatValues.PreReleaseNumber, + semverFormatValues.WeightedPreReleaseNumber, informationalVersion, semverFormatValues.CommitDate, semverFormatValues.NuGetVersion, diff --git a/src/GitVersionCore/OutputVariables/VersionVariables.cs b/src/GitVersionCore/OutputVariables/VersionVariables.cs index 3f528988d1..52fa6a7c5f 100644 --- a/src/GitVersionCore/OutputVariables/VersionVariables.cs +++ b/src/GitVersionCore/OutputVariables/VersionVariables.cs @@ -32,6 +32,7 @@ public VersionVariables(string major, string preReleaseTagWithDash, string preReleaseLabel, string preReleaseNumber, + string weightedPreReleaseNumber, string informationalVersion, string commitDate, string nugetVersion, @@ -61,6 +62,7 @@ public VersionVariables(string major, PreReleaseTagWithDash = preReleaseTagWithDash; PreReleaseLabel = preReleaseLabel; PreReleaseNumber = preReleaseNumber; + WeightedPreReleaseNumber = weightedPreReleaseNumber; InformationalVersion = informationalVersion; CommitDate = commitDate; NuGetVersion = nugetVersion; @@ -78,6 +80,7 @@ public VersionVariables(string major, public string PreReleaseTagWithDash { get; private set; } public string PreReleaseLabel { get; private set; } public string PreReleaseNumber { get; private set; } + public string WeightedPreReleaseNumber { get; private set; } public string BuildMetaData { get; private set; } public string BuildMetaDataPadded { get; private set; } public string FullBuildMetaData { get; private set; } diff --git a/src/GitVersionCore/SemanticVersionFormatValues.cs b/src/GitVersionCore/SemanticVersionFormatValues.cs index 2ebc9efe30..82679b8652 100644 --- a/src/GitVersionCore/SemanticVersionFormatValues.cs +++ b/src/GitVersionCore/SemanticVersionFormatValues.cs @@ -48,6 +48,11 @@ public string PreReleaseNumber get { return _semver.PreReleaseTag.HasTag() ? _semver.PreReleaseTag.Number.ToString() : null; } } + public string WeightedPreReleaseNumber + { + get { return _semver.PreReleaseTag.HasTag() ? (_semver.PreReleaseTag.Number + _config.PreReleaseWeight).ToString() : null; } + } + public string BuildMetaData { get { return _semver.BuildMetaData; } diff --git a/src/GitVersionExe.Tests/TestEffectiveConfiguration.cs b/src/GitVersionExe.Tests/TestEffectiveConfiguration.cs index 6b2d03ddfe..d0cea16a2f 100644 --- a/src/GitVersionExe.Tests/TestEffectiveConfiguration.cs +++ b/src/GitVersionExe.Tests/TestEffectiveConfiguration.cs @@ -40,7 +40,7 @@ public TestEffectiveConfiguration( majorMessage, minorMessage, patchMessage, noBumpMessage, commitMessageMode, legacySemVerPadding, buildMetaDataPadding, commitsSinceVersionSourcePadding, versionFilters ?? Enumerable.Empty(), - tracksReleaseBranches, isRelease, commitDateFormat) + tracksReleaseBranches, isRelease, commitDateFormat, 0) { } diff --git a/src/GitVersionTask.Tests/Helpers/TestEffectiveConfiguration.cs b/src/GitVersionTask.Tests/Helpers/TestEffectiveConfiguration.cs index 876de76ac1..fcbd7505f8 100644 --- a/src/GitVersionTask.Tests/Helpers/TestEffectiveConfiguration.cs +++ b/src/GitVersionTask.Tests/Helpers/TestEffectiveConfiguration.cs @@ -40,7 +40,7 @@ public TestEffectiveConfiguration( majorMessage, minorMessage, patchMessage, noBumpMessage, commitMessageMode, legacySemVerPadding, buildMetaDataPadding, commitsSinceVersionSourcePadding, versionFilters ?? Enumerable.Empty(), - tracksReleaseBranches, isRelease, commitDateFormat) + tracksReleaseBranches, isRelease, commitDateFormat, 0) { } } diff --git a/src/GitVersionTask/GetVersion.cs b/src/GitVersionTask/GetVersion.cs index 818f43eeed..31e4d6211b 100644 --- a/src/GitVersionTask/GetVersion.cs +++ b/src/GitVersionTask/GetVersion.cs @@ -41,6 +41,9 @@ public GetVersion() [Output] public string PreReleaseNumber { get; set; } + [Output] + public string WeightedPreReleaseNumber { get; set; } + [Output] public string BuildMetaData { get; set; }