Skip to content

Commit ed45376

Browse files
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 ebc7419 commit ed45376

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
@@ -42,7 +42,7 @@ public TestEffectiveConfiguration(
4242
majorMessage, minorMessage, patchMessage, noBumpMessage,
4343
commitMessageMode, legacySemVerPadding, buildMetaDataPadding, commitsSinceVersionSourcePadding,
4444
versionFilters ?? Enumerable.Empty<IVersionFilter>(),
45-
tracksReleaseBranches, isRelease, commitDateFormat, 0)
45+
tracksReleaseBranches, isRelease, commitDateFormat, 0, 0)
4646
{
4747
}
4848
}
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, 0)
32+
"", true, "", "", false, "", "", "", "", CommitMessageIncrementMode.Enabled, 4, 4, 4, Enumerable.Empty<IVersionFilter>(), false, true, format, 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
@@ -36,6 +36,7 @@ public static void Reset(this Config config)
3636
config.BuildMetaDataPadding ??= 4;
3737
config.CommitsSinceVersionSourcePadding ??= 4;
3838
config.CommitDateFormat ??= "yyyy-MM-dd";
39+
config.TagPreReleaseWeight ??= 0;
3940

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

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

186188
public static BranchConfig GetConfigForBranch(this Config config, string branchName)
@@ -263,9 +265,10 @@ public static EffectiveConfiguration CalculateEffectiveConfiguration(this Config
263265
var patchMessage = configuration.PatchVersionBumpMessage;
264266
var noBumpMessage = configuration.NoBumpMessage;
265267
var commitDateFormat = configuration.CommitDateFormat;
268+
var tagPreReleaseWeight = configuration.TagPreReleaseWeight;
266269

267270
var commitMessageVersionBump = currentBranchConfig.CommitMessageIncrementing ?? configuration.CommitMessageIncrementing.Value;
268-
271+
269272
return new EffectiveConfiguration(
270273
assemblyVersioningScheme, assemblyFileVersioningScheme, assemblyInformationalFormat, assemblyVersioningFormat, assemblyFileVersioningFormat, versioningMode, gitTagPrefix,
271274
tag, nextVersion, incrementStrategy,
@@ -282,7 +285,8 @@ public static EffectiveConfiguration CalculateEffectiveConfiguration(this Config
282285
currentBranchConfig.TracksReleaseBranches.Value,
283286
currentBranchConfig.IsReleaseBranch.Value,
284287
commitDateFormat,
285-
preReleaseWeight);
288+
preReleaseWeight,
289+
tagPreReleaseWeight.HasValue ? tagPreReleaseWeight.Value : 0);
286290
}
287291

288292
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
@@ -34,7 +34,8 @@ public EffectiveConfiguration(
3434
bool tracksReleaseBranches,
3535
bool isCurrentBranchRelease,
3636
string commitDateFormat,
37-
int preReleaseWeight)
37+
int preReleaseWeight,
38+
int tagPreReleaseWeight)
3839
{
3940
AssemblyVersioningScheme = assemblyVersioningScheme;
4041
AssemblyFileVersioningScheme = assemblyFileVersioningScheme;
@@ -64,6 +65,7 @@ public EffectiveConfiguration(
6465
IsCurrentBranchRelease = isCurrentBranchRelease;
6566
CommitDateFormat = commitDateFormat;
6667
PreReleaseWeight = preReleaseWeight;
68+
TagPreReleaseWeight = tagPreReleaseWeight;
6769
}
6870

6971
public bool TracksReleaseBranches { get; private set; }
@@ -120,5 +122,7 @@ public EffectiveConfiguration(
120122
public string CommitDateFormat { get; private set; }
121123

122124
public int PreReleaseWeight { get; private set; }
125+
126+
public int TagPreReleaseWeight { get; private set; }
123127
}
124128
}

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)