Skip to content

Commit 24bc02b

Browse files
committed
Added merge message base version strategy
1 parent 88bf262 commit 24bc02b

File tree

5 files changed

+126
-3
lines changed

5 files changed

+126
-3
lines changed

GitVersionCore.Tests/GitVersionCore.Tests.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,7 @@
118118
<Compile Include="VersionCalculation\BaseVersionCalculatorTests.cs" />
119119
<Compile Include="VersionCalculation\Strategies\ConfigNextVersionBaseVersionStrategyTests.cs" />
120120
<Compile Include="VersionCalculation\Strategies\GitVersionContextBuilder.cs" />
121+
<Compile Include="VersionCalculation\Strategies\MergeMessageBaseVersionStrategyTests.cs" />
121122
</ItemGroup>
122123
<ItemGroup>
123124
<None Include="packages.config" />
Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
namespace GitVersionCore.Tests.VersionCalculation.Strategies
2+
{
3+
using System.Collections.Generic;
4+
using GitVersion.VersionCalculation.BaseVersionCalculators;
5+
using LibGit2Sharp;
6+
using NUnit.Framework;
7+
using Shouldly;
8+
9+
[TestFixture]
10+
public class MergeMessageBaseVersionStrategyTests
11+
{
12+
[Test]
13+
public void ShouldAllowIncrementOfVersion()
14+
{
15+
var context = new GitVersionContextBuilder().WithRepository(new MockRepository
16+
{
17+
Head = new MockBranch("master") { new MockCommit
18+
{
19+
MessageEx = "Merge branch 'hotfix-0.1.5'",
20+
ParentsEx = GetParents(true)
21+
} }
22+
}).Build();
23+
var sut = new MergeMessageBaseVersionStrategy();
24+
25+
var baseVersion = sut.GetVersion(context);
26+
27+
baseVersion.ShouldIncrement.ShouldBe(true);
28+
}
29+
30+
[TestCase("Merge branch 'hotfix-0.1.5'", false, null)]
31+
[TestCase("Merge branch 'develop' of github.com:Particular/NServiceBus into develop", true, null)]
32+
[TestCase("Merge branch '4.0.3'", true, "4.0.3")] //TODO: possible make it a config option to support this
33+
[TestCase("Merge branch 'release-10.10.50'", true, "10.10.50")]
34+
[TestCase("Merge branch 's'", true, null)] // Must start with a number
35+
[TestCase("Merge branch 'release-0.2.0'", true, "0.2.0")]
36+
[TestCase("Merge branch 'hotfix-4.6.6' into support-4.6", true, "4.6.6")]
37+
[TestCase("Merge branch 'hotfix-10.10.50'", true, "10.10.50")]
38+
[TestCase("Merge branch 'hotfix-0.1.5'", true, "0.1.5")]
39+
[TestCase("Merge branch 'hotfix-0.1.5'\n\nRelates to: TicketId", true, "0.1.5")]
40+
[TestCase("Merge branch 'alpha-0.1.5'", true, "0.1.5")]
41+
[TestCase("Merge pull request #165 from Particular/release-1.0.0", true, "1.0.0")]
42+
[TestCase("Merge pull request #95 from Particular/issue-94", false, null)]
43+
[TestCase("Merge pull request #165 in Particular/release-1.0.0", true, "1.0.0")]
44+
[TestCase("Merge pull request #95 in Particular/issue-94", true, null)]
45+
[TestCase("Merge pull request #95 in Particular/issue-94", false, null)]
46+
[TestCase("Merge pull request #64 from arledesma/feature-VS2013_3rd_party_test_framework_support", true, null)]
47+
[TestCase("Finish Release-0.12.0", true, "0.12.0")] //Support Syntevo SmartGit/Hg's Gitflow merge commit messages for finishing a 'Release' branch
48+
[TestCase("Finish 0.14.1", true, "0.14.1")] //Support Syntevo SmartGit/Hg's Gitflow merge commit messages for finishing a 'Hotfix' branch
49+
public void AssertMergeMessage(string message, bool isMergeCommit, string expectedVersion)
50+
{
51+
var parents = GetParents(isMergeCommit);
52+
AssertMergeMessage(message, expectedVersion, parents);
53+
AssertMergeMessage(message + " ", expectedVersion, parents);
54+
AssertMergeMessage(message + "\r ", expectedVersion, parents);
55+
AssertMergeMessage(message + "\r", expectedVersion, parents);
56+
AssertMergeMessage(message + "\r\n", expectedVersion, parents);
57+
AssertMergeMessage(message + "\r\n ", expectedVersion, parents);
58+
AssertMergeMessage(message + "\n", expectedVersion, parents);
59+
AssertMergeMessage(message + "\n ", expectedVersion, parents);
60+
}
61+
62+
static void AssertMergeMessage(string message, string expectedVersion, List<Commit> parents)
63+
{
64+
var commit = new MockCommit
65+
{
66+
MessageEx = message,
67+
ParentsEx = parents
68+
};
69+
70+
var context = new GitVersionContextBuilder()
71+
.WithRepository(new MockRepository
72+
{
73+
Head = new MockBranch("master") { commit }
74+
})
75+
.Build();
76+
var sut = new MergeMessageBaseVersionStrategy();
77+
78+
var baseVersion = sut.GetVersion(context);
79+
80+
if (expectedVersion == null)
81+
{
82+
baseVersion.ShouldBe(null);
83+
}
84+
else
85+
{
86+
baseVersion.SemanticVersion.ToString().ShouldBe(expectedVersion);
87+
}
88+
}
89+
90+
static List<Commit> GetParents(bool isMergeCommit)
91+
{
92+
if (isMergeCommit)
93+
{
94+
return new List<Commit>
95+
{
96+
null,
97+
null
98+
};
99+
}
100+
return new List<Commit>
101+
{
102+
null
103+
};
104+
}
105+
}
106+
}

GitVersionCore/GitVersionCore.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +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\MergeMessageBaseVersionStrategy.cs" />
9394
<Compile Include="VersionCalculation\BaseVersionStrategy.cs" />
9495
<Compile Include="VersioningModes\ContinuousDeliveryMode.cs" />
9596
<Compile Include="VersioningModes\ContinuousDeploymentMode.cs" />

GitVersionCore/MergeMessageParser.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,14 @@ namespace GitVersion
66

77
static class MergeMessageParser
88
{
9-
public static bool TryParse(Commit mergeCommit, EffectiveConfiguration configuration, out SemanticVersion shortVersion)
9+
public static bool TryParse(Commit mergeCommit, EffectiveConfiguration configuration, out SemanticVersion semanticVersion)
1010
{
1111
string versionPart;
1212
if (Inner(mergeCommit, out versionPart))
1313
{
14-
return SemanticVersion.TryParse(versionPart, configuration.GitTagPrefix, out shortVersion);
14+
return SemanticVersion.TryParse(versionPart, configuration.GitTagPrefix, out semanticVersion);
1515
}
16-
shortVersion = null;
16+
semanticVersion = null;
1717
return false;
1818
}
1919

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
namespace GitVersion.VersionCalculation.BaseVersionCalculators
2+
{
3+
public class MergeMessageBaseVersionStrategy : BaseVersionStrategy
4+
{
5+
public override BaseVersion GetVersion(GitVersionContext context)
6+
{
7+
// TODO when this approach works, inline the other class into here
8+
SemanticVersion semanticVersion;
9+
if (MergeMessageParser.TryParse(context.CurrentCommit, context.Configuration, out semanticVersion))
10+
return new BaseVersion(true, semanticVersion);
11+
12+
return null;
13+
}
14+
}
15+
}

0 commit comments

Comments
 (0)