Skip to content

Commit 775e59a

Browse files
committed
Merge pull request #523 from JakeGinnivan/VersionCalculationIssue
Fixes version calculation issue introduced when fixing #465
2 parents b71fed0 + 162c581 commit 775e59a

File tree

5 files changed

+54
-21
lines changed

5 files changed

+54
-21
lines changed

src/GitVersionCore.Tests/Fixtures/RepositoryFixtureBase.cs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,15 @@ public void AssertFullSemver(string fullSemver, IRepository repository = null, s
122122
Trace.WriteLine("---------");
123123

124124
var variables = GetVersion(repository, commitId);
125-
variables.FullSemVer.ShouldBe(fullSemver);
125+
try
126+
{
127+
variables.FullSemVer.ShouldBe(fullSemver);
128+
}
129+
catch (Exception)
130+
{
131+
if (repository != null)
132+
repository.DumpGraph();
133+
}
126134
if (commitId == null)
127135
diagramBuilder.AppendLineFormat("note over {0} #D3D3D3: {1}", GetParticipant(Repository.Head.Name), fullSemver);
128136
}

src/GitVersionCore.Tests/IntegrationTests/DocumentationSamples.cs

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

140140
// Make a commit after a tag should bump up the beta
141141
fixture.MakeACommit();
142-
fixture.AssertFullSemver("1.3.0-beta.2+2");
142+
fixture.AssertFullSemver("1.3.0-beta.2+1");
143143

144144
// Complete release
145145
fixture.Checkout("master");
@@ -195,7 +195,7 @@ public void GitFlowMajorRelease()
195195

196196
// Make a commit after a tag should bump up the beta
197197
fixture.MakeACommit();
198-
fixture.AssertFullSemver("2.0.0-beta.2+2");
198+
fixture.AssertFullSemver("2.0.0-beta.2+1");
199199

200200
// Complete release
201201
fixture.Checkout("master");

src/GitVersionCore.Tests/IntegrationTests/HotfixBranchScenarios.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
public class HotfixBranchScenarios
77
{
88
[Test]
9+
// This test actually validates #465 as well
910
public void PatchLatestReleaseExample()
1011
{
1112
using (var fixture = new BaseGitFlowRepositoryFixture("1.2.0"))

src/GitVersionCore.Tests/IntegrationTests/ReleaseBranchScenarios.cs

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,26 @@ public void WhenReleaseBranch_OffMaster_IsMergedIntoMaster_VersionIsTakenWithIt(
159159
}
160160
}
161161

162+
[Test]
163+
public void MasterVersioningContinuousCorrectlyAfterMergingReleaseBranch()
164+
{
165+
using (var fixture = new EmptyRepositoryFixture(new Config()))
166+
{
167+
fixture.Repository.MakeATaggedCommit("1.0.3");
168+
fixture.Repository.MakeCommits(1);
169+
fixture.Repository.CreateBranch("release-2.0.0");
170+
fixture.Repository.Checkout("release-2.0.0");
171+
fixture.Repository.MakeCommits(4);
172+
fixture.Repository.Checkout("master");
173+
fixture.Repository.MergeNoFF("release-2.0.0", Constants.SignatureNow());
174+
175+
fixture.AssertFullSemver("2.0.0+0");
176+
fixture.Repository.ApplyTag("2.0.0");
177+
fixture.Repository.MakeCommits(1);
178+
fixture.AssertFullSemver("2.0.1+1");
179+
}
180+
}
181+
162182
[Test]
163183
public void WhenReleaseBranchIsMergedIntoDevelopHighestVersionIsTakenWithIt()
164184
{
@@ -180,7 +200,7 @@ public void WhenReleaseBranchIsMergedIntoDevelopHighestVersionIsTakenWithIt()
180200
fixture.Repository.Checkout("develop");
181201
fixture.Repository.MergeNoFF("release-1.0.0", Constants.SignatureNow());
182202

183-
fixture.AssertFullSemver("2.1.0-unstable.5");
203+
fixture.AssertFullSemver("2.1.0-unstable.0");
184204
}
185205
}
186206

@@ -231,15 +251,15 @@ public void WhenMergingReleaseBackToDevShouldNotResetBetaVersion()
231251

232252
fixture.Repository.MakeCommits(1);
233253

234-
fixture.AssertFullSemver("2.0.0-beta.2+2");
254+
fixture.AssertFullSemver("2.0.0-beta.2+1");
235255

236256
//merge down to develop
237257
fixture.Repository.Checkout("develop");
238258
fixture.Repository.MergeNoFF("release-2.0.0", Constants.SignatureNow());
239259

240260
//but keep working on the release
241261
fixture.Repository.Checkout("release-2.0.0");
242-
fixture.AssertFullSemver("2.0.0-beta.2+2");
262+
fixture.AssertFullSemver("2.0.0-beta.2+1");
243263
}
244264
}
245265
}

src/GitVersionCore/VersionCalculation/BaseVersionCalculator.cs

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -29,38 +29,42 @@ public BaseVersion GetBaseVersion(GitVersionContext context)
2929

3030
return false;
3131
})
32+
.Select(v => new
33+
{
34+
IncrementedVersion = MaybeIncrement(context, v),
35+
Version = v
36+
})
3237
.ToList();
3338

34-
var maxVersion = baseVersions.Aggregate((v1, v2) =>
35-
{
36-
if (v1.SemanticVersion > v2.SemanticVersion)
37-
{
38-
return new BaseVersion(v1.Source, v1.ShouldIncrement, v1.SemanticVersion, v1.BaseVersionSource ?? v2.BaseVersionSource, v1.BranchNameOverride);
39-
}
40-
return new BaseVersion(v2.Source, v2.ShouldIncrement, v2.SemanticVersion, v2.BaseVersionSource ?? v1.BaseVersionSource, v2.BranchNameOverride);
41-
});
42-
var incrementedMax = MaybeIncrement(context, maxVersion);
43-
var matchingVersionsOnceIncremented = baseVersions.Where(b => b.BaseVersionSource != null && MaybeIncrement(context, b) == incrementedMax).ToList();
39+
var maxVersion = baseVersions.Aggregate((v1, v2) => v1.IncrementedVersion > v2.IncrementedVersion ? v1 : v2);
40+
var matchingVersionsOnceIncremented = baseVersions
41+
.Where(b => b != maxVersion && b.Version.BaseVersionSource != null && b.IncrementedVersion == maxVersion.IncrementedVersion)
42+
.ToList();
4443
BaseVersion baseVersionWithOldestSource;
4544
if (matchingVersionsOnceIncremented.Any())
4645
{
47-
baseVersionWithOldestSource = matchingVersionsOnceIncremented.Aggregate((v1, v2) => v1.BaseVersionSource.Committer.When < v2.BaseVersionSource.Committer.When ? v1 : v2);
46+
baseVersionWithOldestSource = matchingVersionsOnceIncremented.Aggregate((v1, v2) => v1.Version.BaseVersionSource.Committer.When < v2.Version.BaseVersionSource.Committer.When ? v1 : v2).Version;
4847
Logger.WriteInfo(string.Format(
4948
"Found multiple base versions which will produce the same SemVer ({0}), taking oldest source for commit counting ({1})",
50-
incrementedMax,
49+
maxVersion.IncrementedVersion,
5150
baseVersionWithOldestSource.Source));
5251
}
5352
else
5453
{
55-
baseVersionWithOldestSource = maxVersion;
54+
baseVersionWithOldestSource = baseVersions
55+
.Where(v => v.Version.BaseVersionSource != null)
56+
.OrderBy(v => v.IncrementedVersion)
57+
.ThenByDescending(v => v.Version.BaseVersionSource.Committer.When)
58+
.First()
59+
.Version;
5660
}
5761

5862
if (baseVersionWithOldestSource.BaseVersionSource == null)
5963
throw new Exception("Base version should not be null");
6064

6165
var calculatedBase = new BaseVersion(
62-
maxVersion.Source, maxVersion.ShouldIncrement, maxVersion.SemanticVersion,
63-
baseVersionWithOldestSource.BaseVersionSource, maxVersion.BranchNameOverride);
66+
maxVersion.Version.Source, maxVersion.Version.ShouldIncrement, maxVersion.Version.SemanticVersion,
67+
baseVersionWithOldestSource.BaseVersionSource, maxVersion.Version.BranchNameOverride);
6468

6569
Logger.WriteInfo(string.Format("Base version used: {0}", calculatedBase));
6670

0 commit comments

Comments
 (0)