Skip to content

Commit f696177

Browse files
ruhullahshahRuh Ullah Shah
authored and
Ruh Ullah Shah
committed
Problem: Tagged commits end up having a zero WeightedPreReleaseNumber, especially
in GitFlow branching scenarios. This could lead to an emission of AssemblyFileSemVer that is not strictly increasing. Solution: Introduce a new configuration parameter, tag-pre-release-weight, that could overrwrite the WeightedPreReleaseNumber if it turns out to be 0.
1 parent b264fff commit f696177

16 files changed

+147
-55
lines changed

docs/input/docs/configuration.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,10 @@ The number of characters to pad `CommitsSinceVersionSource` to in the
199199
set to `4`, which will pad the `CommitsSinceVersionSource` value of `1` to
200200
`0001`.
201201

202+
### tag-pre-release-weight
203+
204+
The pre-release weight in case of tagged commits. If the value is not set in the configuration, a default weight of 0 is used instead. If the `WeightedPreReleaseNumber` [variable](./more-info/variables) is 0 and this parameter is set, its value is used. This helps if your branching model is GitFlow and the last release build, which is often tagged, can utilise this parameter to produce a monotonically increasing build number.
205+
202206
### commit-message-incrementing
203207

204208
Sets whether it should be possible to increment the version with special syntax

src/GitVersionCore.Tests/Configuration/ConfigProviderTests.CanWriteOutEffectiveConfiguration.approved.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ no-bump-message: '\+semver:\s?(none|skip)'
1010
legacy-semver-padding: 4
1111
build-metadata-padding: 4
1212
commits-since-version-source-padding: 4
13+
tag-pre-release-weight: 0
1314
commit-message-incrementing: Enabled
1415
branches:
1516
develop:

src/GitVersionCore.Tests/Helpers/TestEffectiveConfiguration.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ public TestEffectiveConfiguration(
4343
majorMessage, minorMessage, patchMessage, noBumpMessage,
4444
commitMessageMode, legacySemVerPadding, buildMetaDataPadding, commitsSinceVersionSourcePadding,
4545
versionFilters ?? Enumerable.Empty<IVersionFilter>(),
46-
tracksReleaseBranches, isRelease, commitDateFormat, updateBuildNumber, 0)
46+
tracksReleaseBranches, isRelease, commitDateFormat, updateBuildNumber, 0, 0, 0)
4747
{
4848
}
4949
}
Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
using GitTools.Testing;
2+
using GitVersion.Configuration;
3+
using GitVersion.Model.Configuration;
4+
using GitVersion.VersionCalculation;
5+
using NUnit.Framework;
6+
using Shouldly;
7+
8+
namespace GitVersionCore.Tests.IntegrationTests
9+
{
10+
[TestFixture]
11+
class VersionInTagScenarios
12+
{
13+
[Test]
14+
public void TagPreReleaseWeightIsNotConfigured_HeadIsATaggedCommit_WeightedPreReleaseNumberShouldBeZero()
15+
{
16+
// Arrange
17+
var config = new Config()
18+
{
19+
AssemblyFileVersioningFormat = "{Major}.{Minor}.{Patch}.{WeightedPreReleaseNumber}",
20+
};
21+
config.ApplyDefaults();
22+
23+
// Act
24+
using var fixture = new BaseGitFlowRepositoryFixture("1.0.0");
25+
fixture.MakeATaggedCommit("1.1.0");
26+
var version = fixture.GetVersion(config);
27+
28+
// Assert
29+
version.AssemblySemFileVer.ShouldBe("1.1.0.0");
30+
}
31+
32+
[Test]
33+
public void TagPreReleaseWeightIsConfigured_HeadIsATaggedCommit_WeightedPreReleaseNumberShouldBeTheSameAsTheTagPreReleaseWeight()
34+
{
35+
// Arrange
36+
var config = new Config()
37+
{
38+
AssemblyFileVersioningFormat = "{Major}.{Minor}.{Patch}.{WeightedPreReleaseNumber}",
39+
TagPreReleaseWeight = 60000
40+
};
41+
config.ApplyDefaults();
42+
43+
// Act
44+
using var fixture = new BaseGitFlowRepositoryFixture("1.0.0");
45+
fixture.MakeATaggedCommit("1.1.0");
46+
var version = fixture.GetVersion(config);
47+
48+
// Assert
49+
version.AssemblySemFileVer.ShouldBe("1.1.0.60000");
50+
}
51+
52+
[Test]
53+
public void TagPreReleaseWeightIsConfigured_GitFlowReleaseIsFinished_WeightedPreReleaseNumberShouldBeTheSameAsTheTagPreReleaseWeight()
54+
{
55+
// Arrange
56+
var config = new Config()
57+
{
58+
AssemblyFileVersioningFormat = "{Major}.{Minor}.{Patch}.{WeightedPreReleaseNumber}",
59+
TagPreReleaseWeight = 60000,
60+
VersioningMode = VersioningMode.ContinuousDeployment
61+
};
62+
config.ApplyDefaults();
63+
64+
// Act
65+
using var fixture = new BaseGitFlowRepositoryFixture("1.0.0");
66+
fixture.Checkout("master");
67+
fixture.MergeNoFF("develop");
68+
fixture.Checkout("develop");
69+
fixture.MakeACommit("Feature commit 1");
70+
fixture.BranchTo("release/1.1.0");
71+
fixture.MakeACommit("Release commit 1");
72+
fixture.AssertFullSemver("1.1.0-beta.1", config);
73+
fixture.ApplyTag("1.1.0");
74+
var version = fixture.GetVersion(config);
75+
76+
// Assert
77+
version.AssemblySemFileVer.ShouldBe("1.1.0.60000");
78+
}
79+
80+
[Test]
81+
public void TagPreReleaseWeightIsNotConfigured_GitFlowReleaseIsFinished_WeightedPreReleaseNumberShouldBeZero()
82+
{
83+
// Arrange
84+
var config = new Config()
85+
{
86+
AssemblyFileVersioningFormat = "{Major}.{Minor}.{Patch}.{WeightedPreReleaseNumber}",
87+
VersioningMode = VersioningMode.ContinuousDeployment
88+
};
89+
config.ApplyDefaults();
90+
91+
// Act
92+
using var fixture = new BaseGitFlowRepositoryFixture("1.0.0");
93+
fixture.Checkout("master");
94+
fixture.MergeNoFF("develop");
95+
fixture.Checkout("develop");
96+
fixture.MakeACommit("Feature commit 1");
97+
fixture.BranchTo("release/1.1.0");
98+
fixture.MakeACommit("Release commit 1");
99+
fixture.AssertFullSemver("1.1.0-beta.1", config);
100+
fixture.ApplyTag("1.1.0");
101+
var version = fixture.GetVersion(config);
102+
103+
// Assert
104+
version.AssemblySemFileVer.ShouldBe("1.1.0.0");
105+
}
106+
}
107+
}

src/GitVersionCore.Tests/Model/CommitDateTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ public void CommitDateFormatTest(string format, string expectedOutcome)
2929
},
3030
new EffectiveConfiguration(
3131
AssemblyVersioningScheme.MajorMinorPatch, AssemblyFileVersioningScheme.MajorMinorPatch, "", "", "", VersioningMode.ContinuousDelivery, "", "", "", IncrementStrategy.Inherit,
32-
"", true, "", "", false, "", "", "", "", CommitMessageIncrementMode.Enabled, 4, 4, 4, Enumerable.Empty<IVersionFilter>(), false, true, format, false, 0)
32+
"", true, "", "", false, "", "", "", "", CommitMessageIncrementMode.Enabled, 4, 4, 4, Enumerable.Empty<IVersionFilter>(), false, true, format, false, 0, 0)
3333
);
3434

3535
Assert.That(formatValues.CommitDate, Is.EqualTo(expectedOutcome));

src/GitVersionCore.Tests/VersionCalculation/Approved/VariableProviderTests.ProvidesVariablesInContinuousDeliveryModeForFeatureBranch.approved.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
"PreReleaseTagWithDash":"",
77
"PreReleaseLabel":"",
88
"PreReleaseNumber":"",
9-
"WeightedPreReleaseNumber":"",
9+
"WeightedPreReleaseNumber":0,
1010
"BuildMetaData":5,
1111
"BuildMetaDataPadded":"0005",
1212
"FullBuildMetaData":"5.Branch.feature-123.Sha.commitSha",

src/GitVersionCore.Tests/VersionCalculation/Approved/VariableProviderTests.ProvidesVariablesInContinuousDeliveryModeForFeatureBranchWithCustomAssemblyInfoFormat.approved.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
"PreReleaseTagWithDash":"",
77
"PreReleaseLabel":"",
88
"PreReleaseNumber":"",
9-
"WeightedPreReleaseNumber":"",
9+
"WeightedPreReleaseNumber":0,
1010
"BuildMetaData":5,
1111
"BuildMetaDataPadded":"0005",
1212
"FullBuildMetaData":"5.Branch.feature-123.Sha.commitSha",

src/GitVersionCore.Tests/VersionCalculation/Approved/VariableProviderTests.ProvidesVariablesInContinuousDeliveryModeForStable.approved.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
"PreReleaseTagWithDash":"",
77
"PreReleaseLabel":"",
88
"PreReleaseNumber":"",
9-
"WeightedPreReleaseNumber":"",
9+
"WeightedPreReleaseNumber":0,
1010
"BuildMetaData":5,
1111
"BuildMetaDataPadded":"0005",
1212
"FullBuildMetaData":"5.Branch.develop.Sha.commitSha",

src/GitVersionCore.Tests/VersionCalculation/Approved/VariableProviderTests.ProvidesVariablesInContinuousDeploymentModeForStableWhenCurrentCommitIsTagged.approved.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
"PreReleaseTagWithDash":"",
77
"PreReleaseLabel":"",
88
"PreReleaseNumber":"",
9-
"WeightedPreReleaseNumber":"",
9+
"WeightedPreReleaseNumber":0,
1010
"BuildMetaData":5,
1111
"BuildMetaDataPadded":"0005",
1212
"FullBuildMetaData":"5.Sha.commitSha",

src/GitVersionCore.Tests/VersionCalculation/Strategies/TaggedCommitVersionStrategyTests.cs

Lines changed: 0 additions & 43 deletions
This file was deleted.

src/GitVersionCore.Tests/VersionConverters/Approved/WixFileTests.UpdateWixVersionFile.approved.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,5 +30,5 @@
3030
<?define Sha="commitSha"?>
3131
<?define ShortSha="commitShortSha"?>
3232
<?define VersionSourceSha="versionSourceSha"?>
33-
<?define WeightedPreReleaseNumber=""?>
33+
<?define WeightedPreReleaseNumber="0"?>
3434
</Include>

src/GitVersionCore.Tests/VersionConverters/Approved/WixFileTests.UpdateWixVersionFileWhenFileAlreadyExists.approved.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,5 +30,5 @@
3030
<?define Sha="commitSha"?>
3131
<?define ShortSha="commitShortSha"?>
3232
<?define VersionSourceSha="versionSourceSha"?>
33-
<?define WeightedPreReleaseNumber=""?>
33+
<?define WeightedPreReleaseNumber="0"?>
3434
</Include>

src/GitVersionCore/Configuration/ConfigExtensions.cs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ public static void Reset(this Config config)
3737
config.CommitsSinceVersionSourcePadding ??= 4;
3838
config.CommitDateFormat ??= "yyyy-MM-dd";
3939
config.UpdateBuildNumber ??= true;
40+
config.TagPreReleaseWeight ??= 0;
4041

4142
var configBranches = config.Branches.ToList();
4243

@@ -182,6 +183,7 @@ public static void ApplyOverridesTo(this Config config, Config overrideConfig)
182183
config.VersioningMode = overrideConfig.VersioningMode;
183184
config.AssemblyFileVersioningFormat = overrideConfig.AssemblyFileVersioningFormat;
184185
config.TagPrefix = string.IsNullOrWhiteSpace(overrideConfig.TagPrefix) ? config.TagPrefix : overrideConfig.TagPrefix;
186+
config.TagPreReleaseWeight = overrideConfig.TagPreReleaseWeight;
185187
}
186188

187189
public static BranchConfig GetConfigForBranch(this Config config, string branchName)
@@ -265,9 +267,10 @@ public static EffectiveConfiguration CalculateEffectiveConfiguration(this Config
265267
var noBumpMessage = configuration.NoBumpMessage;
266268
var commitDateFormat = configuration.CommitDateFormat;
267269
var updateBuildNumber = configuration.UpdateBuildNumber ?? true;
270+
var tagPreReleaseWeight = configuration.TagPreReleaseWeight;
268271

269272
var commitMessageVersionBump = currentBranchConfig.CommitMessageIncrementing ?? configuration.CommitMessageIncrementing.Value;
270-
273+
271274
return new EffectiveConfiguration(
272275
assemblyVersioningScheme, assemblyFileVersioningScheme, assemblyInformationalFormat, assemblyVersioningFormat, assemblyFileVersioningFormat, versioningMode, gitTagPrefix,
273276
tag, nextVersion, incrementStrategy,
@@ -285,7 +288,8 @@ public static EffectiveConfiguration CalculateEffectiveConfiguration(this Config
285288
currentBranchConfig.IsReleaseBranch.Value,
286289
commitDateFormat,
287290
updateBuildNumber,
288-
preReleaseWeight);
291+
preReleaseWeight,
292+
tagPreReleaseWeight.HasValue ? tagPreReleaseWeight.Value : 0);
289293
}
290294

291295
public static string GetBranchSpecificTag(this EffectiveConfiguration configuration, ILog log, string branchFriendlyName, string branchNameOverride)

src/GitVersionCore/Model/Configuration/Config.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,9 @@ public string NextVersion
7676
[YamlMember(Alias = "commits-since-version-source-padding")]
7777
public int? CommitsSinceVersionSourcePadding { get; set; }
7878

79+
[YamlMember(Alias = "tag-pre-release-weight")]
80+
public int? TagPreReleaseWeight { get; set; }
81+
7982
[YamlMember(Alias = "commit-message-incrementing")]
8083
public CommitMessageIncrementMode? CommitMessageIncrementing { get; set; }
8184

src/GitVersionCore/Model/Configuration/EffectiveConfiguration.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,8 @@ public EffectiveConfiguration(
3535
bool isCurrentBranchRelease,
3636
string commitDateFormat,
3737
bool updateBuildNumber,
38-
int preReleaseWeight)
38+
int preReleaseWeight,
39+
int tagPreReleaseWeight)
3940
{
4041
AssemblyVersioningScheme = assemblyVersioningScheme;
4142
AssemblyFileVersioningScheme = assemblyFileVersioningScheme;
@@ -66,6 +67,7 @@ public EffectiveConfiguration(
6667
CommitDateFormat = commitDateFormat;
6768
UpdateBuildNumber = updateBuildNumber;
6869
PreReleaseWeight = preReleaseWeight;
70+
TagPreReleaseWeight = tagPreReleaseWeight;
6971
}
7072

7173
public bool TracksReleaseBranches { get; private set; }
@@ -124,5 +126,7 @@ public EffectiveConfiguration(
124126
public bool UpdateBuildNumber { get; private set; }
125127

126128
public int PreReleaseWeight { get; private set; }
129+
130+
public int TagPreReleaseWeight { get; private set; }
127131
}
128132
}

src/GitVersionCore/VersionCalculation/SemanticVersioning/SemanticVersionFormatValues.cs

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ public SemanticVersionFormatValues(SemanticVersion semver, EffectiveConfiguratio
3030

3131
public string PreReleaseNumber => semver.PreReleaseTag.HasTag() ? semver.PreReleaseTag.Number.ToString() : null;
3232

33-
public string WeightedPreReleaseNumber => semver.PreReleaseTag.HasTag() ? (semver.PreReleaseTag.Number + config.PreReleaseWeight).ToString() : null;
33+
public string WeightedPreReleaseNumber => GetWeightedPreReleaseNumber();
3434

3535
public string BuildMetaData => semver.BuildMetaData;
3636

@@ -82,5 +82,17 @@ public SemanticVersionFormatValues(SemanticVersion semver, EffectiveConfiguratio
8282
public string CommitsSinceVersionSource => semver.BuildMetaData.CommitsSinceVersionSource.ToString(CultureInfo.InvariantCulture);
8383

8484
public string CommitsSinceVersionSourcePadded => semver.BuildMetaData.CommitsSinceVersionSource.ToString(CultureInfo.InvariantCulture).PadLeft(config.CommitsSinceVersionSourcePadding, '0');
85+
86+
private String GetWeightedPreReleaseNumber()
87+
{
88+
var weightedPreReleaseNumber =
89+
semver.PreReleaseTag.HasTag() ? (semver.PreReleaseTag.Number + config.PreReleaseWeight).ToString() : null;
90+
if (string.IsNullOrEmpty(weightedPreReleaseNumber))
91+
{
92+
weightedPreReleaseNumber = $"{config.TagPreReleaseWeight}";
93+
}
94+
95+
return weightedPreReleaseNumber;
96+
}
8597
}
8698
}

0 commit comments

Comments
 (0)