Skip to content

Commit 3f19a66

Browse files
committed
Fixes #360 - was taking last tag, now taking highest tag on that branch
1 parent 1959809 commit 3f19a66

File tree

7 files changed

+59
-36
lines changed

7 files changed

+59
-36
lines changed

GitVersionCore.Tests/ConfigProviderTests.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using System.IO;
33
using System.Linq;
44
using System.Reflection;
5+
using System.Runtime.CompilerServices;
56
using ApprovalTests;
67
using GitVersion;
78
using GitVersion.Helpers;

GitVersionCore.Tests/GitVersionCore.Tests.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@
8787
<Compile Include="IntegrationTests\DevelopScenarios.cs" />
8888
<Compile Include="IntegrationTests\FeatureBranchTests.cs" />
8989
<Compile Include="IntegrationTests\SupportBranchScenarios.cs" />
90-
<Compile Include="IntegrationTests\PatchScenarios.cs" />
90+
<Compile Include="IntegrationTests\HotfixBranchScenarios.cs" />
9191
<Compile Include="IntegrationTests\ReleaseBranchTests.cs" />
9292
<Compile Include="IntegrationTests\SwitchingToGitFlowScenarios.cs" />
9393
<Compile Include="IntegrationTests\WikiScenarios.cs" />

GitVersionCore.Tests/IntegrationTests/PatchScenarios.cs renamed to GitVersionCore.Tests/IntegrationTests/HotfixBranchScenarios.cs

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
using NUnit.Framework;
44

55
[TestFixture]
6-
public class PatchScenarios
6+
public class HotfixBranchScenarios
77
{
88
[Test]
99
public void PatchLatestReleaseExample()
@@ -47,30 +47,42 @@ public void PatchOlderReleaseExample()
4747
{
4848
r.MakeATaggedCommit("1.0.0");
4949
r.MakeATaggedCommit("1.1.0");
50-
r.MakeATaggedCommit("1.2.0");
50+
r.MakeATaggedCommit("2.0.0");
5151
}))
5252
{
53-
var targetCommit = ((Commit) fixture.Repository.Tags.Single(t => t.Name == "1.1.0").Target);
53+
// Merge hotfix branch to support
54+
fixture.Repository.CreateBranch("support-1.1", (Commit)fixture.Repository.Tags.Single(t => t.Name == "1.1.0").Target).Checkout();
55+
fixture.AssertFullSemver("1.1.0+0");
56+
fixture.DumpGraph();
57+
5458
// create hotfix branch
55-
fixture.Repository.CreateBranch("hotfix-1.1.1", targetCommit).Checkout();
59+
fixture.Repository.CreateBranch("hotfix-1.1.1").Checkout();
5660

5761
fixture.AssertFullSemver("1.1.1-beta.1+0");
5862
fixture.Repository.MakeACommit();
5963
fixture.AssertFullSemver("1.1.1-beta.1+1");
6064

61-
// Merge hotfix branch to support
62-
fixture.Repository.CreateBranch("support-1.1", (Commit) fixture.Repository.Tags.Single(t => t.Name == "1.1.0").Target).Checkout();
63-
fixture.AssertFullSemver("1.1.0+0");
65+
// Create feature branch off hotfix branch and complete
66+
fixture.Repository.CreateBranch("feature/fix").Checkout();
67+
fixture.AssertFullSemver("1.1.1-fix.1+1");
68+
fixture.Repository.MakeACommit();
69+
fixture.AssertFullSemver("1.1.1-fix.1+2");
70+
fixture.Repository.Checkout("hotfix-1.1.1");
71+
fixture.Repository.MergeNoFF("feature/fix", Constants.SignatureNow());
72+
fixture.AssertFullSemver("1.1.1-beta.1+1");
6473

74+
// Merge hotfix into support branch to complete hotfix
75+
fixture.Repository.Checkout("support-1.1");
6576
fixture.Repository.MergeNoFF("hotfix-1.1.1", Constants.SignatureNow());
6677
fixture.AssertFullSemver("1.1.1+0");
67-
6878
fixture.Repository.ApplyTag("1.1.1");
6979
fixture.AssertFullSemver("1.1.1+0");
7080

7181
// Verify develop version
7282
fixture.Repository.Checkout("develop");
73-
fixture.AssertFullSemver("1.3.0-unstable.1+1");
83+
fixture.AssertFullSemver("2.1.0-unstable.1+1");
84+
fixture.Repository.MergeNoFF("support-1.1", Constants.SignatureNow());
85+
fixture.AssertFullSemver("2.1.0-unstable.1+6");
7486
}
7587
}
7688
}

GitVersionCore.Tests/VersionCalculation/Strategies/LastTagBaseVersionStrategyTests.cs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,11 @@ public class LastTagBaseVersionStrategyTests
1010
[Test]
1111
public void ShouldAllowVersionIncrement()
1212
{
13-
// TODO Looks like our MockRepostory stuff doesn't work properly. commits are added to end of list, but Tip is first.
14-
// Changing behaviour breaks a bunch of tests
1513
var context = new GitVersionContextBuilder()
1614
.WithTaggedMaster()
1715
.AddCommit()
1816
.Build();
19-
var sut = new LastTagBaseVersionStrategy();
17+
var sut = new HighestTagBaseVersionStrategy();
2018

2119
var baseVersion = sut.GetVersion(context);
2220

@@ -29,7 +27,7 @@ public void ShouldNotAllowVersionIncrementWhenTagComesFromCurrentCommit()
2927
var context = new GitVersionContextBuilder()
3028
.WithTaggedMaster()
3129
.Build();
32-
var sut = new LastTagBaseVersionStrategy();
30+
var sut = new HighestTagBaseVersionStrategy();
3331

3432
var baseVersion = sut.GetVersion(context);
3533

GitVersionCore/GitVersionCore.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@
9090
<Compile Include="VersionCalculation\BaseVersionCalculator.cs" />
9191
<Compile Include="VersionCalculation\BaseVersionCalculators\BaseVersion.cs" />
9292
<Compile Include="VersionCalculation\BaseVersionCalculators\ConfigNextVersionBaseVersionStrategy.cs" />
93-
<Compile Include="VersionCalculation\BaseVersionCalculators\LastTagBaseVersionStrategy.cs" />
93+
<Compile Include="VersionCalculation\BaseVersionCalculators\HighestTagBaseVersionStrategy.cs" />
9494
<Compile Include="VersionCalculation\BaseVersionCalculators\MergeMessageBaseVersionStrategy.cs" />
9595
<Compile Include="VersionCalculation\BaseVersionCalculators\VersionInBranchBaseVersionStrategy.cs" />
9696
<Compile Include="VersionCalculation\BaseVersionStrategy.cs" />

GitVersionCore/VersionCalculation/BaseVersionCalculators/LastTagBaseVersionStrategy.cs renamed to GitVersionCore/VersionCalculation/BaseVersionCalculators/HighestTagBaseVersionStrategy.cs

Lines changed: 29 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
using System.Linq;
44
using LibGit2Sharp;
55

6-
public class LastTagBaseVersionStrategy : BaseVersionStrategy
6+
public class HighestTagBaseVersionStrategy : BaseVersionStrategy
77
{
88
public override BaseVersion GetVersion(GitVersionContext context)
99
{
@@ -19,29 +19,41 @@ public override BaseVersion GetVersion(GitVersionContext context)
1919

2020
bool GetVersion(GitVersionContext context, out VersionTaggedCommit versionTaggedCommit)
2121
{
22-
var tags = context.Repository.Tags.Select(t =>
23-
{
24-
SemanticVersion version;
25-
if (SemanticVersion.TryParse(t.Name, context.Configuration.GitTagPrefix, out version))
22+
var olderThan = context.CurrentCommit.When();
23+
var allTags = context.Repository.Tags
24+
.Where(tag => ((Commit) tag.PeeledTarget()).When() <= olderThan)
25+
.ToList();
26+
var tagsOnBranch = context.CurrentBranch
27+
.Commits
28+
.SelectMany(commit =>
29+
{
30+
return allTags.Where(t => t.PeeledTarget() == commit);
31+
})
32+
.Select(t =>
2633
{
27-
return new VersionTaggedCommit((Commit)t.Target, version, t.Name);
28-
}
29-
return null;
30-
})
34+
SemanticVersion version;
35+
if (SemanticVersion.TryParse(t.Name, context.Configuration.GitTagPrefix, out version))
36+
{
37+
return new VersionTaggedCommit((Commit)t.Target, version, t.Name);
38+
}
39+
return null;
40+
})
3141
.Where(a => a != null)
32-
.ToArray();
33-
var olderThan = context.CurrentCommit.When();
34-
var lastTaggedCommit =
35-
context.CurrentBranch.Commits.FirstOrDefault(c => c.When() <= olderThan && tags.Any(a => a.Commit == c));
42+
.ToList();
3643

37-
if (lastTaggedCommit != null)
44+
if (tagsOnBranch.Count == 0)
45+
{
46+
versionTaggedCommit = null;
47+
return false;
48+
}
49+
if (tagsOnBranch.Count == 1)
3850
{
39-
versionTaggedCommit = tags.Last(a => a.Commit.Sha == lastTaggedCommit.Sha);
51+
versionTaggedCommit = tagsOnBranch[0];
4052
return true;
4153
}
4254

43-
versionTaggedCommit = null;
44-
return false;
55+
versionTaggedCommit = tagsOnBranch.Skip(1).Aggregate(tagsOnBranch[0], (t, t1) => t.SemVer > t1.SemVer ? t : t1);
56+
return true;
4557
}
4658

4759
class VersionTaggedCommit

GitVersionCore/VersionCalculation/NewNextVersionCalculator.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,17 @@ public class NewNextVersionCalculator
88
{
99
IBaseVersionCalculator baseVersionFinder;
1010
IMetaDataCalculator metaDataCalculator;
11-
LastTagBaseVersionStrategy lastTagBaseVersionStrategy;
11+
HighestTagBaseVersionStrategy highestTagBaseVersionStrategy;
1212

1313
public NewNextVersionCalculator(IBaseVersionCalculator baseVersionCalculator = null, IMetaDataCalculator metaDataCalculator = null)
1414
{
1515
this.metaDataCalculator = metaDataCalculator ?? new MetaDataCalculator();
16-
lastTagBaseVersionStrategy = new LastTagBaseVersionStrategy();
16+
highestTagBaseVersionStrategy = new HighestTagBaseVersionStrategy();
1717
baseVersionFinder = baseVersionCalculator ??
1818
new BaseVersionCalculator(
1919
new FallbackBaseVersionStrategy(),
2020
new ConfigNextVersionBaseVersionStrategy(),
21-
lastTagBaseVersionStrategy,
21+
highestTagBaseVersionStrategy,
2222
new MergeMessageBaseVersionStrategy(),
2323
new VersionInBranchBaseVersionStrategy());
2424
}
@@ -48,7 +48,7 @@ public SemanticVersion FindVersion(GitVersionContext context)
4848
number = int.Parse(numberGroup.Value);
4949
}
5050

51-
var lastTag = lastTagBaseVersionStrategy.GetVersion(context);
51+
var lastTag = highestTagBaseVersionStrategy.GetVersion(context);
5252
if (number == null &&
5353
lastTag != null &&
5454
!context.IsCurrentCommitTagged &&

0 commit comments

Comments
 (0)