Skip to content

Commit 2934668

Browse files
committed
The Calculation of BaseVersions should be based on tags first, then merge commits
1 parent ec10669 commit 2934668

File tree

5 files changed

+61
-24
lines changed

5 files changed

+61
-24
lines changed

src/GitVersion.Core.Tests/Core/DynamicRepositoryTests.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,8 @@ public void Cleanup()
5252

5353
// Note: use same name twice to see if changing commits works on same (cached) repository
5454
[NonParallelizable]
55-
[TestCase("GV_main", "https://github.com/GitTools/GitVersion", MainBranch, "4783d325521463cd6cf1b61074352da84451f25d", "4.0.0+1086")]
56-
[TestCase("GV_main", "https://github.com/GitTools/GitVersion", MainBranch, "3bdcd899530b4e9b37d13639f317da04a749e728", "4.0.0+1092")]
55+
[TestCase("GV_main", "https://github.com/GitTools/GitVersion", MainBranch, "4783d325521463cd6cf1b61074352da84451f25d", "4.0.0+862")]
56+
[TestCase("GV_main", "https://github.com/GitTools/GitVersion", MainBranch, "3bdcd899530b4e9b37d13639f317da04a749e728", "4.0.0+868")]
5757
public void FindsVersionInDynamicRepo(string name, string url, string targetBranch, string commitId, string expectedFullSemVer)
5858
{
5959
var root = Path.Combine(this.workDirectory, name);

src/GitVersion.Core.Tests/IntegrationTests/DevelopScenarios.cs

+13-12
Original file line numberDiff line numberDiff line change
@@ -229,11 +229,11 @@ public void CommitsSinceVersionSourceShouldNotGoDownUponGitFlowReleaseFinish()
229229
fixture.Checkout("develop");
230230
fixture.MergeNoFF("release/1.2.0");
231231
fixture.MakeACommit("commit in develop - 6");
232-
fixture.AssertFullSemver("1.3.0-alpha.9");
232+
fixture.AssertFullSemver("1.3.0-alpha.6");
233233
fixture.SequenceDiagram.Destroy("release/1.2.0");
234234
fixture.Repository.Branches.Remove("release/1.2.0");
235235

236-
var expectedFullSemVer = "1.3.0-alpha.9";
236+
var expectedFullSemVer = "1.3.0-alpha.6";
237237
fixture.AssertFullSemver(expectedFullSemVer, config);
238238
}
239239

@@ -261,11 +261,11 @@ public void CommitsSinceVersionSourceShouldNotGoDownUponMergingFeatureOnlyToDeve
261261
fixture.MakeACommit("commit in develop - 2");
262262
fixture.AssertFullSemver("1.3.0-alpha.1");
263263
fixture.MergeNoFF("release/1.2.0");
264-
fixture.AssertFullSemver("1.3.0-alpha.5");
264+
fixture.AssertFullSemver("1.3.0-alpha.2");
265265
fixture.SequenceDiagram.Destroy("release/1.2.0");
266266
fixture.Repository.Branches.Remove("release/1.2.0");
267267

268-
var expectedFullSemVer = "1.3.0-alpha.5";
268+
var expectedFullSemVer = "1.3.0-alpha.2";
269269
fixture.AssertFullSemver(expectedFullSemVer, config);
270270
}
271271

@@ -318,16 +318,16 @@ public void WhenPreventIncrementOfMergedBranchVersionIsSetToFalseForDevelopCommi
318318
fixture.MergeNoFF(ReleaseBranch);
319319

320320
// Version numbers will still be correct when the release branch is around.
321-
fixture.AssertFullSemver("1.2.0-alpha.6");
322-
fixture.AssertFullSemver("1.2.0-alpha.6", config);
321+
fixture.AssertFullSemver("1.2.0-alpha.3");
322+
fixture.AssertFullSemver("1.2.0-alpha.3", config);
323323

324324
var versionSourceBeforeReleaseBranchIsRemoved = fixture.GetVersion(config).Sha;
325325

326326
fixture.Repository.Branches.Remove(ReleaseBranch);
327327
var versionSourceAfterReleaseBranchIsRemoved = fixture.GetVersion(config).Sha;
328328
Assert.AreEqual(versionSourceBeforeReleaseBranchIsRemoved, versionSourceAfterReleaseBranchIsRemoved);
329-
fixture.AssertFullSemver("1.2.0-alpha.6");
330-
fixture.AssertFullSemver("1.2.0-alpha.6", config);
329+
fixture.AssertFullSemver("1.2.0-alpha.3");
330+
fixture.AssertFullSemver("1.2.0-alpha.3", config);
331331

332332
config.Branches = new Dictionary<string, BranchConfig>
333333
{
@@ -370,12 +370,13 @@ public void WhenPreventIncrementOfMergedBranchVersionIsSetToFalseForDevelopCommi
370370
fixture.MergeNoFF(ReleaseBranch);
371371
fixture.ApplyTag("v1.1.0");
372372
fixture.Checkout("develop");
373+
fixture.AssertFullSemver("1.2.0-alpha.0", config);
373374

374375
// Simulate some work done on develop while the release branch was open.
375376
fixture.Repository.MakeCommits(2);
376377
fixture.MergeNoFF(ReleaseBranch);
377378
fixture.Repository.Branches.Remove(ReleaseBranch);
378-
fixture.AssertFullSemver("1.2.0-alpha.6", config);
379+
fixture.AssertFullSemver("1.2.0-alpha.3", config);
379380

380381
// Create hotfix for defects found in release/1.1.0
381382
const string HotfixBranch = "hotfix/1.1.1";
@@ -392,12 +393,12 @@ public void WhenPreventIncrementOfMergedBranchVersionIsSetToFalseForDevelopCommi
392393
fixture.Checkout("develop");
393394
// Simulate some work done on develop while the hotfix branch was open.
394395
fixture.Repository.MakeCommits(3);
395-
fixture.AssertFullSemver("1.2.0-alpha.9", config);
396+
fixture.AssertFullSemver("1.2.0-alpha.6", config);
396397
fixture.Repository.MergeNoFF(HotfixBranch);
397-
fixture.AssertFullSemver("1.2.0-alpha.19", config);
398+
fixture.AssertFullSemver("1.2.0-alpha.10", config);
398399

399400
fixture.Repository.Branches.Remove(HotfixBranch);
400-
fixture.AssertFullSemver("1.2.0-alpha.19", config);
401+
fixture.AssertFullSemver("1.2.0-alpha.10", config);
401402
}
402403
}
403404
}

src/GitVersion.Core.Tests/IntegrationTests/DocumentationSamples.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@ public void GitFlowMinorRelease()
156156

157157
// Not 0 for commit count as we can't know the increment rules of the merged branch
158158
fixture.Checkout("develop");
159-
fixture.AssertFullSemver("1.4.0-alpha.4");
159+
fixture.AssertFullSemver("1.4.0-alpha.2");
160160
Console.WriteLine(fixture.SequenceDiagram.GetDiagram());
161161
}
162162

@@ -212,7 +212,7 @@ public void GitFlowMajorRelease()
212212

213213
// Not 0 for commit count as we can't know the increment rules of the merged branch
214214
fixture.Checkout("develop");
215-
fixture.AssertFullSemver("2.1.0-alpha.4");
215+
fixture.AssertFullSemver("2.1.0-alpha.2");
216216
Console.WriteLine(fixture.SequenceDiagram.GetDiagram());
217217
}
218218

src/GitVersion.Core.Tests/IntegrationTests/ReleaseBranchScenarios.cs

+3-2
Original file line numberDiff line numberDiff line change
@@ -48,12 +48,13 @@ public void NoMergeBacksToDevelopInCaseThereAreChangesInReleaseBranch()
4848
// Merge to develop
4949
fixture.Checkout("develop");
5050
fixture.Repository.MergeNoFF("release/1.0.0");
51-
fixture.AssertFullSemver("1.1.0-alpha.2");
51+
fixture.AssertFullSemver("1.1.0-alpha.1");
5252

5353
fixture.Repository.MakeACommit();
54+
fixture.AssertFullSemver("1.1.0-alpha.2");
5455
fixture.Repository.Branches.Remove("release/1.0.0");
5556

56-
fixture.AssertFullSemver("1.1.0-alpha.3");
57+
fixture.AssertFullSemver("1.1.0-alpha.2");
5758
}
5859

5960
[Test]

src/GitVersion.Core/VersionCalculation/BaseVersionCalculator.cs

+41-6
Original file line numberDiff line numberDiff line change
@@ -58,11 +58,40 @@ public BaseVersion GetBaseVersion()
5858
BaseVersion baseVersionWithOldestSource;
5959
if (matchingVersionsOnceIncremented.Any())
6060
{
61-
var oldest = matchingVersionsOnceIncremented.Aggregate((v1, v2) =>
62-
v1.Version!.BaseVersionSource!.When < v2.Version!.BaseVersionSource!.When ? v1 : v2);
63-
baseVersionWithOldestSource = oldest!.Version!;
64-
maxVersion = oldest;
65-
this.log.Info($"Found multiple base versions which will produce the same SemVer ({maxVersion.IncrementedVersion}), taking oldest source for commit counting ({baseVersionWithOldestSource!.Source})");
61+
if (matchingVersionsOnceIncremented.Count > 1)
62+
{
63+
log.Info($"Found multiple base versions which will produce the same SemVer ({maxVersion.IncrementedVersion})");
64+
log.Info($"Here are the different source candidate for commit counting : ");
65+
foreach (var baseVersion in matchingVersionsOnceIncremented.Select(b => b.Version))
66+
{
67+
if (baseVersion != null)
68+
{
69+
log.Info($" - {BaseVersionToString(baseVersion)}");
70+
}
71+
}
72+
73+
var tagVersions = matchingVersionsOnceIncremented.FindAll(b => b.Version != null && b.Version.Source.Contains("Git tag"));
74+
75+
if (tagVersions.Count > 0)
76+
{
77+
log.Info("As there are Git tags, the other sources will be discarded");
78+
matchingVersionsOnceIncremented = tagVersions;
79+
}
80+
81+
maxVersion = matchingVersionsOnceIncremented.Aggregate((v1, v2) =>
82+
v1.Version!.BaseVersionSource!.When < v2.Version!.BaseVersionSource!.When ? v1 : v2);
83+
baseVersionWithOldestSource = maxVersion!.Version!;
84+
log.Info($"Taking oldest source for commit counting : {BaseVersionToString(baseVersionWithOldestSource)}");
85+
}
86+
else
87+
{
88+
maxVersion = matchingVersionsOnceIncremented.First();
89+
baseVersionWithOldestSource = maxVersion!.Version!;
90+
log.Info(
91+
$"Found a base versions which will produce the following SemVer ({maxVersion.IncrementedVersion}), " +
92+
$"with the following source for commit counting : {BaseVersionToString(baseVersionWithOldestSource)}"
93+
);
94+
}
6695
}
6796
else
6897
{
@@ -81,11 +110,17 @@ public BaseVersion GetBaseVersion()
81110
maxVersion.Version!.Source, maxVersion.Version.ShouldIncrement, maxVersion.Version.SemanticVersion,
82111
baseVersionWithOldestSource.BaseVersionSource, maxVersion.Version.BranchNameOverride);
83112

84-
this.log.Info($"Base version used: {calculatedBase}");
113+
log.Info($"Base version used: {calculatedBase}");
85114

86115
return calculatedBase;
87116
}
88117
}
118+
119+
private string BaseVersionToString(BaseVersion baseVersion)
120+
{
121+
return $"{baseVersion!.Source} ({baseVersion!.BaseVersionSource!.Sha})";
122+
}
123+
89124
private IEnumerable<BaseVersion> GetBaseVersions(IVersionStrategy strategy)
90125
{
91126
foreach (var version in strategy.GetVersions())

0 commit comments

Comments
 (0)