Skip to content

Commit 28fbd89

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

File tree

5 files changed

+93
-36
lines changed

5 files changed

+93
-36
lines changed

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

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -228,11 +228,11 @@ public void CommitsSinceVersionSourceShouldNotGoDownUponGitFlowReleaseFinish()
228228
fixture.Checkout("develop");
229229
fixture.MergeNoFF("release/1.2.0");
230230
fixture.MakeACommit("commit in develop - 6");
231-
fixture.AssertFullSemver("1.3.0-alpha.9");
231+
fixture.AssertFullSemver("1.3.0-alpha.6");
232232
fixture.SequenceDiagram.Destroy("release/1.2.0");
233233
fixture.Repository.Branches.Remove("release/1.2.0");
234234

235-
const string expectedFullSemVer = "1.3.0-alpha.9";
235+
const string expectedFullSemVer = "1.3.0-alpha.6";
236236
fixture.AssertFullSemver(expectedFullSemVer, config);
237237
}
238238

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

267-
const string expectedFullSemVer = "1.3.0-alpha.5";
267+
const string expectedFullSemVer = "1.3.0-alpha.2";
268268
fixture.AssertFullSemver(expectedFullSemVer, config);
269269
}
270270

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

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

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

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

331331
config.Branches = new Dictionary<string, BranchConfig>
332332
{
@@ -374,7 +374,7 @@ public void WhenPreventIncrementOfMergedBranchVersionIsSetToFalseForDevelopCommi
374374
fixture.Repository.MakeCommits(2);
375375
fixture.MergeNoFF(ReleaseBranch);
376376
fixture.Repository.Branches.Remove(ReleaseBranch);
377-
fixture.AssertFullSemver("1.2.0-alpha.6", config);
377+
fixture.AssertFullSemver("1.2.0-alpha.3", config);
378378

379379
// Create hotfix for defects found in release/1.1.0
380380
const string HotfixBranch = "hotfix/1.1.1";
@@ -391,11 +391,11 @@ public void WhenPreventIncrementOfMergedBranchVersionIsSetToFalseForDevelopCommi
391391
fixture.Checkout("develop");
392392
// Simulate some work done on develop while the hotfix branch was open.
393393
fixture.Repository.MakeCommits(3);
394-
fixture.AssertFullSemver("1.2.0-alpha.9", config);
394+
fixture.AssertFullSemver("1.2.0-alpha.6", config);
395395
fixture.Repository.MergeNoFF(HotfixBranch);
396-
fixture.AssertFullSemver("1.2.0-alpha.19", config);
396+
fixture.AssertFullSemver("1.2.0-alpha.10", config);
397397

398398
fixture.Repository.Branches.Remove(HotfixBranch);
399-
fixture.AssertFullSemver("1.2.0-alpha.19", config);
399+
fixture.AssertFullSemver("1.2.0-alpha.10", config);
400400
}
401401
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@ public void GitFlowMinorRelease()
155155

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

@@ -211,7 +211,7 @@ public void GitFlowMajorRelease()
211211

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

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

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -41,16 +41,16 @@ public void GitflowComplexExample()
4141
fixture.Checkout(developBranch);
4242
fixture.MergeNoFF(release1Branch);
4343
fixture.Repository.Branches.Remove(fixture.Repository.Branches[release1Branch]);
44-
fixture.AssertFullSemver("1.2.0-alpha.2");
44+
fixture.AssertFullSemver("1.2.0-alpha.1");
4545

4646
// Feature 2
4747
fixture.BranchTo(feature2Branch);
4848
fixture.MakeACommit("added feature 2");
49-
fixture.AssertFullSemver("1.2.0-f2.1+3");
49+
fixture.AssertFullSemver("1.2.0-f2.1+2");
5050
fixture.Checkout(developBranch);
5151
fixture.MergeNoFF(feature2Branch);
5252
fixture.Repository.Branches.Remove(fixture.Repository.Branches[feature2Branch]);
53-
fixture.AssertFullSemver("1.2.0-alpha.4");
53+
fixture.AssertFullSemver("1.2.0-alpha.3");
5454

5555
// Release 1.2.0
5656
fixture.BranchTo(release2Branch);
@@ -64,13 +64,13 @@ public void GitflowComplexExample()
6464
fixture.Checkout(developBranch);
6565
fixture.MergeNoFF(release2Branch);
6666
fixture.Repository.Branches.Remove(fixture.Repository.Branches[release2Branch]);
67-
fixture.AssertFullSemver("1.3.0-alpha.2");
67+
fixture.AssertFullSemver("1.3.0-alpha.1");
6868

6969
// Hotfix
7070
fixture.Checkout(MainBranch);
7171
fixture.BranchTo(hotfixBranch);
7272
fixture.MakeACommit("added hotfix");
73-
fixture.AssertFullSemver("1.2.1-beta.1+7");
73+
fixture.AssertFullSemver("1.2.1-beta.1+1");
7474
fixture.Checkout(MainBranch);
7575
fixture.MergeNoFF(hotfixBranch);
7676
fixture.AssertFullSemver("1.2.1+2");
@@ -79,7 +79,7 @@ public void GitflowComplexExample()
7979
fixture.Checkout(developBranch);
8080
fixture.MergeNoFF(hotfixBranch);
8181
fixture.Repository.Branches.Remove(fixture.Repository.Branches[hotfixBranch]);
82-
fixture.AssertFullSemver("1.3.0-alpha.9");
82+
fixture.AssertFullSemver("1.3.0-alpha.3");
8383
}
8484
}
8585
}

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

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -48,12 +48,12 @@ 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();
5454
fixture.Repository.Branches.Remove("release/1.0.0");
5555

56-
fixture.AssertFullSemver("1.1.0-alpha.3");
56+
fixture.AssertFullSemver("1.1.0-alpha.2");
5757
}
5858

5959
[Test]
@@ -184,7 +184,7 @@ public void WhenReleaseBranchOffMainIsMergedIntoMainVersionIsTakenWithIt()
184184
}
185185

186186
[Test]
187-
public void MainVersioningContinuousCorrectlyAfterMergingReleaseBranch()
187+
public void MainVersioningContinuesCorrectlyAfterMergingReleaseBranch()
188188
{
189189
using var fixture = new EmptyRepositoryFixture();
190190
fixture.Repository.MakeATaggedCommit("1.0.3");
@@ -201,6 +201,30 @@ public void MainVersioningContinuousCorrectlyAfterMergingReleaseBranch()
201201
fixture.AssertFullSemver("2.0.1+1");
202202
}
203203

204+
[Test]
205+
public void MainVersioningContinuesCountingAfterMergingTheSameReleaseBranchMultipleTimes()
206+
{
207+
using var fixture = new EmptyRepositoryFixture();
208+
fixture.Repository.MakeATaggedCommit("1.0.3");
209+
fixture.Repository.MakeCommits(1);
210+
fixture.Repository.CreateBranch("release/2.0.0");
211+
fixture.Checkout("release/2.0.0");
212+
fixture.Repository.MakeCommits(4);
213+
fixture.Checkout(MainBranch);
214+
fixture.Repository.MergeNoFF("release/2.0.0", Generate.SignatureNow());
215+
216+
fixture.AssertFullSemver("2.0.0+0");
217+
218+
fixture.Checkout("release/2.0.0");
219+
fixture.Repository.MakeCommits(3);
220+
fixture.Checkout(MainBranch);
221+
fixture.Repository.MergeNoFF("release/2.0.0", Generate.SignatureNow());
222+
223+
fixture.AssertFullSemver("2.0.0+4");
224+
fixture.Repository.MakeCommits(1);
225+
fixture.AssertFullSemver("2.0.0+5");
226+
}
227+
204228
[Test]
205229
public void WhenReleaseBranchIsMergedIntoDevelopHighestVersionIsTakenWithIt()
206230
{
@@ -434,7 +458,7 @@ public void CommitOnDevelopAfterReleaseBranchMergeToDevelopShouldNotResetCount()
434458
}
435459

436460
[Test]
437-
public void CommitBeetweenMergeReleaseToDevelopShouldNotResetCount()
461+
public void CommitBetweenMergeReleaseToDevelopShouldNotResetCount()
438462
{
439463
var config = new Config
440464
{

src/GitVersion.Core/VersionCalculation/BaseVersionCalculator.cs

Lines changed: 45 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -53,24 +53,53 @@ public BaseVersion GetBaseVersion()
5353

5454
if (matchingVersionsOnceIncremented.Any())
5555
{
56-
static Versions CompareVersions(Versions versions1, Versions version2)
56+
if (matchingVersionsOnceIncremented.Count > 1)
5757
{
58-
if (versions1.Version.BaseVersionSource == null)
58+
static Versions CompareVersions(Versions versions1, Versions version2)
5959
{
60-
return version2;
60+
if (versions1.Version.BaseVersionSource == null)
61+
{
62+
return version2;
63+
}
64+
if (version2.Version.BaseVersionSource == null)
65+
{
66+
return versions1;
67+
}
68+
69+
return versions1.Version.BaseVersionSource.When < version2.Version.BaseVersionSource.When ? versions1 : version2;
6170
}
62-
if (version2.Version.BaseVersionSource == null)
71+
72+
log.Info($"Found multiple base versions which will produce the same SemVer ({maxVersion.IncrementedVersion})");
73+
log.Info($"Here are the different source candidate for commit counting : ");
74+
foreach (var baseVersion in matchingVersionsOnceIncremented.Select(b => b.Version))
6375
{
64-
return versions1;
76+
if (baseVersion != null)
77+
{
78+
log.Info($" - {BaseVersionToString(baseVersion)}");
79+
}
6580
}
6681

67-
return versions1.Version.BaseVersionSource.When < version2.Version.BaseVersionSource.When ? versions1 : version2;
68-
}
82+
var tagVersions = matchingVersionsOnceIncremented.FindAll(b => b.Version.Source.Contains("Git tag"));
83+
84+
if (tagVersions.Count > 0)
85+
{
86+
log.Info("As there are Git tags, the other sources will be discarded");
87+
matchingVersionsOnceIncremented = tagVersions;
88+
}
6989

70-
var oldest = matchingVersionsOnceIncremented.Aggregate(CompareVersions);
71-
baseVersionWithOldestSource = oldest.Version;
72-
maxVersion = oldest;
73-
this.log.Info($"Found multiple base versions which will produce the same SemVer ({maxVersion.IncrementedVersion}), taking oldest source for commit counting ({baseVersionWithOldestSource.Source})");
90+
maxVersion = matchingVersionsOnceIncremented.Aggregate(CompareVersions);
91+
baseVersionWithOldestSource = maxVersion.Version;
92+
log.Info($"Taking oldest source for commit counting : {BaseVersionToString(baseVersionWithOldestSource)}");
93+
}
94+
else
95+
{
96+
maxVersion = matchingVersionsOnceIncremented.First();
97+
baseVersionWithOldestSource = maxVersion.Version;
98+
log.Info(
99+
$"Found a base versions which will produce the following SemVer ({maxVersion.IncrementedVersion}), " +
100+
$"with the following source for commit counting : {BaseVersionToString(baseVersionWithOldestSource)}"
101+
);
102+
}
74103
}
75104
else
76105
{
@@ -92,11 +121,15 @@ static Versions CompareVersions(Versions versions1, Versions version2)
92121
baseVersionWithOldestSource.BaseVersionSource,
93122
maxVersion.Version.BranchNameOverride);
94123

95-
this.log.Info($"Base version used: {calculatedBase}");
124+
log.Info($"Base version used: {calculatedBase}");
96125

97126
return calculatedBase;
98127
}
99128
}
129+
130+
private static string BaseVersionToString(BaseVersion baseVersion) =>
131+
$"{baseVersion!.Source} ({baseVersion!.BaseVersionSource!.Sha})";
132+
100133
private IEnumerable<BaseVersion> GetBaseVersions(IVersionStrategy strategy)
101134
{
102135
foreach (var version in strategy.GetVersions())

0 commit comments

Comments
 (0)