Skip to content

Commit 5f2cbbd

Browse files
committed
simplify MergeMessageParser
1 parent 5706e41 commit 5f2cbbd

File tree

3 files changed

+103
-87
lines changed

3 files changed

+103
-87
lines changed

GitVersionCore/ExtensionMethods.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,15 @@ public static bool IsOdd(this int number)
1515

1616
public static string TrimToFirstLine(this string s)
1717
{
18-
return s.Split(new[]
18+
var firstLine = s.Split(new[]
1919
{
2020
"\r\n",
2121
"\n"
2222
}, StringSplitOptions.None)[0];
23+
return firstLine.Trim();
2324
}
2425

26+
2527
[StringFormatMethod("format")]
2628
public static void AppendLineFormat(this StringBuilder stringBuilder, string format, params object[] args)
2729
{

GitVersionCore/MergeMessageParser.cs

Lines changed: 56 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -1,123 +1,107 @@
11
namespace GitVersion
22
{
3+
using System;
34
using System.Linq;
4-
using System.Text.RegularExpressions;
55
using LibGit2Sharp;
66

7-
class MergeMessageParser
7+
static class MergeMessageParser
88
{
99
public static bool TryParse(Commit mergeCommit, out string versionPart)
1010
{
11-
versionPart = null;
1211

1312
if (mergeCommit.Parents.Count() < 2)
1413
{
14+
versionPart = null;
1515
return false;
1616
}
1717

18-
var message = mergeCommit.Message;
18+
var message = mergeCommit.Message.TrimToFirstLine();
19+
1920

20-
string trimmed;
2121
if (message.StartsWith("Merge branch 'hotfix-"))
2222
{
23-
trimmed = message.Replace("Merge branch 'hotfix-", "");
23+
var suffix = message.Replace("Merge branch 'hotfix-", "");
24+
return suffix.TryGetPrefix(out versionPart, "'");
2425
}
25-
else if (message.StartsWith("Merge branch 'hotfix/"))
26+
27+
if (message.StartsWith("Merge branch 'hotfix/"))
2628
{
27-
trimmed = message.Replace("Merge branch 'hotfix/", "");
29+
var suffix = message.Replace("Merge branch 'hotfix/", "");
30+
return suffix.TryGetPrefix(out versionPart, "'");
2831
}
29-
else if (message.StartsWith("Merge branch 'release-"))
32+
33+
if (message.StartsWith("Merge branch 'release-"))
3034
{
31-
trimmed = message.Replace("Merge branch 'release-", "");
35+
var suffix = message.Replace("Merge branch 'release-", "");
36+
return suffix.TryGetPrefix(out versionPart, "'");
3237
}
33-
else if (message.StartsWith("Merge branch 'release/"))
38+
39+
if (message.StartsWith("Merge branch 'release/"))
3440
{
35-
trimmed = message.Replace("Merge branch 'release/", "");
41+
var suffix = message.Replace("Merge branch 'release/", "");
42+
return suffix.TryGetPrefix(out versionPart, "'");
3643
}
37-
else if (Regex.IsMatch(message, "Merge pull request #\\d+ from "))
38-
{
39-
var branch = Regex.Match(message, "from (?<branch>.*)").Groups["branch"].Value;
40-
var lastBranchPart = branch.Split('/', '-').Last();
41-
42-
if (!char.IsNumber(lastBranchPart.First()) || !lastBranchPart.Contains("."))
43-
{
44-
return false;
45-
}
4644

47-
versionPart = lastBranchPart;
48-
return true;
49-
}
50-
else if (Regex.IsMatch(message, "Merge pull request #\\d+ in "))
45+
if (message.StartsWith("Merge branch '"))
5146
{
52-
var branch = Regex.Match(message, "in (?<branch>.*)").Groups["branch"].Value;
53-
var lastBranchPart = branch.Split('/', '-').Last();
47+
var suffix = message.Replace("Merge branch '", "");
5448

55-
if (!char.IsNumber(lastBranchPart.First()) || !lastBranchPart.Contains("."))
49+
if (suffix.Contains("-"))
5650
{
57-
return false;
51+
suffix = suffix.Split('-')[1];
5852
}
59-
60-
versionPart = lastBranchPart;
61-
return true;
53+
return suffix.TryGetPrefix(out versionPart, "'");
6254
}
63-
else if (message.StartsWith("Merge branch '"))
64-
{
65-
trimmed = message.Replace("Merge branch '", "");
66-
var branchName = trimmed.Split('\'').First();
67-
var dashSeparared = branchName.Split('-');
68-
// Support branchname-1.2.3
69-
if (dashSeparared.Length == 2)
70-
{
71-
trimmed = dashSeparared[1];
72-
if (!char.IsNumber(trimmed.First()))
73-
return false;
7455

75-
versionPart = trimmed;
76-
return true;
77-
}
78-
if (!char.IsNumber(trimmed.First()))
56+
if (message.StartsWith("Merge pull request #"))
57+
{
58+
var split = message.Split(new[] { "/" },StringSplitOptions.RemoveEmptyEntries);
59+
if (split.Length != 2)
7960
{
61+
versionPart = null;
8062
return false;
8163
}
64+
return split[1].TryGetSuffix(out versionPart, "-");
8265
}
83-
else if (message.StartsWith("Finish Release-")) //Match Syntevo SmartGit client's GitFlow 'release' merge commit message formatting
66+
67+
if (message.StartsWith("Finish Release-")) //Match Syntevo SmartGit client's GitFlow 'release' merge commit message formatting
8468
{
85-
var branch = Regex.Match(message, "Release-(?<branch>.*)").Groups["branch"].Value;
86-
var lastBranchPart = branch.Split('/', '-').Last();
87-
88-
if (!char.IsNumber(lastBranchPart.First()) || !lastBranchPart.Contains("."))
89-
{
90-
return false;
91-
}
92-
93-
versionPart = lastBranchPart;
69+
versionPart = message.Replace("Finish Release-", "");
9470
return true;
9571
}
96-
else if (message.StartsWith("Finish ")) //Match Syntevo SmartGit client's GitFlow 'hotfix' merge commit message formatting
72+
73+
if (message.StartsWith("Finish ")) //Match Syntevo SmartGit client's GitFlow 'hotfix' merge commit message formatting
9774
{
98-
var branch = Regex.Match(message, "Finish (?<branch>.*)").Groups["branch"].Value;
99-
var lastBranchPart = branch.Split('/', '-').Last();
100-
101-
if (!char.IsNumber(lastBranchPart.First()) || !lastBranchPart.Contains("."))
102-
{
103-
return false;
104-
}
105-
106-
versionPart = lastBranchPart;
75+
versionPart = message.Replace("Finish ", "");
10776
return true;
10877
}
109-
else
78+
79+
versionPart = null;
80+
return false;
81+
}
82+
83+
static bool TryGetPrefix(this string target, out string result, string splitter)
84+
{
85+
var indexOf = target.IndexOf(splitter);
86+
if (indexOf == -1)
11087
{
88+
result = null;
11189
return false;
11290
}
113-
trimmed = trimmed.TrimToFirstLine();
114-
if (!trimmed.EndsWith("'"))
91+
result = target.Substring(0, indexOf);
92+
return true;
93+
}
94+
95+
static bool TryGetSuffix(this string target, out string result, string splitter)
96+
{
97+
var indexOf = target.IndexOf(splitter);
98+
if (indexOf == -1)
11599
{
100+
result = null;
116101
return false;
117102
}
118-
versionPart = trimmed.TrimEnd('\'');
103+
result = target.Substring(indexOf + 1, target.Length - indexOf - 1);
119104
return true;
120105
}
121-
122106
}
123107
}

GitVersionTask.Tests/MergeMessageParserTests.cs

Lines changed: 44 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,15 @@
88
public class MergeMessageParserTests
99
{
1010

11-
[TestCase("Merge branch 'hotfix-0.1.5'\n", false, null)]
12-
[TestCase("Merge branch 'develop' of github.com:Particular/NServiceBus into develop\n", true, null)]
13-
[TestCase("Merge branch '4.0.3'\n", true, "4.0.3")] //TODO: possible make it a config option to support this
14-
[TestCase("Merge branch 'release-10.10.50'\n", true, "10.10.50")]
15-
[TestCase("Merge branch 's'\n", true, null)] // Must start with a number
16-
[TestCase("Merge branch 'release-0.2.0'\n", true, "0.2.0")]
17-
[TestCase("Merge branch 'hotfix-10.10.50'\n", true, "10.10.50")]
18-
[TestCase("Merge branch 'hotfix-0.1.5'\n", true, "0.1.5")]
11+
[TestCase("Merge branch 'hotfix-0.1.5'", false, null)]
12+
[TestCase("Merge branch 'develop' of github.com:Particular/NServiceBus into develop", true, null)]
13+
[TestCase("Merge branch '4.0.3'", true, "4.0.3")] //TODO: possible make it a config option to support this
14+
[TestCase("Merge branch 'release-10.10.50'", true, "10.10.50")]
15+
[TestCase("Merge branch 's'", true, null)] // Must start with a number
16+
[TestCase("Merge branch 'release-0.2.0'", true, "0.2.0")]
17+
[TestCase("Merge branch 'hotfix-4.6.6' into support-4.6", true, "4.6.6")]
18+
[TestCase("Merge branch 'hotfix-10.10.50'", true, "10.10.50")]
19+
[TestCase("Merge branch 'hotfix-0.1.5'", true, "0.1.5")]
1920
[TestCase("Merge branch 'hotfix-0.1.5'\n\nRelates to: TicketId", true, "0.1.5")]
2021
[TestCase("Merge branch 'alpha-0.1.5'", true, "0.1.5")]
2122
[TestCase("Merge pull request #165 from Particular/release-1.0.0", true, "1.0.0")]
@@ -26,14 +27,27 @@ public class MergeMessageParserTests
2627
[TestCase("Finish 0.14.1", true, "0.14.1")] //Support Syntevo SmartGit/Hg's Gitflow merge commit messages for finishing a 'Hotfix' branch
2728
public void AssertMergeMessage(string message, bool isMergeCommit, string expectedVersion)
2829
{
29-
var c = new MockCommit
30-
{
31-
MessageEx = message,
32-
ParentsEx = isMergeCommit ? new List<Commit> {null, null} : new List<Commit>{ null }
33-
};
30+
var parents = GetParents(isMergeCommit);
31+
AssertMereMessage(message, expectedVersion, parents);
32+
AssertMereMessage(message+ " ", expectedVersion, parents);
33+
AssertMereMessage(message+"\r ", expectedVersion, parents);
34+
AssertMereMessage(message+"\r", expectedVersion, parents);
35+
AssertMereMessage(message+"\r\n", expectedVersion, parents);
36+
AssertMereMessage(message+"\r\n ", expectedVersion, parents);
37+
AssertMereMessage(message+"\n", expectedVersion, parents);
38+
AssertMereMessage(message+"\n ", expectedVersion, parents);
39+
}
40+
41+
static void AssertMereMessage(string message, string expectedVersion, List<Commit> parents)
42+
{
43+
var commit = new MockCommit
44+
{
45+
MessageEx = message,
46+
ParentsEx = parents
47+
};
3448

3549
string versionPart;
36-
var parsed = MergeMessageParser.TryParse(c, out versionPart);
50+
var parsed = MergeMessageParser.TryParse(commit, out versionPart);
3751

3852
if (expectedVersion == null)
3953
{
@@ -45,4 +59,20 @@ public void AssertMergeMessage(string message, bool isMergeCommit, string expect
4559
versionPart.ShouldBe(expectedVersion);
4660
}
4761
}
62+
63+
static List<Commit> GetParents(bool isMergeCommit)
64+
{
65+
if (isMergeCommit)
66+
{
67+
return new List<Commit>
68+
{
69+
null,
70+
null
71+
};
72+
}
73+
return new List<Commit>
74+
{
75+
null
76+
};
77+
}
4878
}

0 commit comments

Comments
 (0)