Skip to content

Commit b6c6e2c

Browse files
committed
Rebase on master
Add additional tests for TFS messages
2 parents 65edb4f + 5c1db80 commit b6c6e2c

File tree

2 files changed

+113
-61
lines changed

2 files changed

+113
-61
lines changed

src/GitVersionCore.Tests/MergeMessageTests.cs

Lines changed: 110 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -54,15 +54,14 @@ public void EmptyTagPrefix(string prefix)
5454

5555
private static readonly object[] MergeMessages =
5656
{
57-
new object[] { "Merge branch 'feature/one'", "feature/one", null, null },
58-
new object[] { "Merge branch 'origin/feature/one'", "origin/feature/one", null, null },
59-
new object[] { "Merge tag 'v4.0.0' into master", "v4.0.0", "master", new SemanticVersion(4) },
60-
new object[] { "Merge tag 'V4.0.0' into master", "V4.0.0", "master", new SemanticVersion(4) },
61-
new object[] { "Merge branch 'feature/4.1/one'", "feature/4.1/one", null, new SemanticVersion(4, 1) },
62-
new object[] { "Merge branch 'origin/4.1/feature/one'", "origin/4.1/feature/one", null, new SemanticVersion(4, 1) },
63-
new object[] { "Merge tag 'v://10.10.10.10' into master", "v://10.10.10.10", "master", null }
64-
65-
};
57+
new object[] { "Merge branch 'feature/one'", "feature/one", null, null },
58+
new object[] { "Merge branch 'origin/feature/one'", "origin/feature/one", null, null },
59+
new object[] { "Merge tag 'v4.0.0' into master", "v4.0.0", "master", new SemanticVersion(4) },
60+
new object[] { "Merge tag 'V4.0.0' into master", "V4.0.0", "master", new SemanticVersion(4) },
61+
new object[] { "Merge branch 'feature/4.1/one'", "feature/4.1/one", null, new SemanticVersion(4, 1) },
62+
new object[] { "Merge branch 'origin/4.1/feature/one'", "origin/4.1/feature/one", null, new SemanticVersion(4, 1) },
63+
new object[] { "Merge tag 'v://10.10.10.10' into master", "v://10.10.10.10", "master", null }
64+
};
6665

6766
[TestCaseSource(nameof(MergeMessages))]
6867
public void ParsesMergeMessage(
@@ -85,15 +84,14 @@ public void ParsesMergeMessage(
8584

8685
private static readonly object[] GitHubPullPullMergeMessages =
8786
{
88-
new object[] { "Merge pull request #1234 from feature/one", "feature/one", null, null, 1234 },
89-
new object[] { "Merge pull request #1234 in feature/one", "feature/one", null, null, 1234 },
90-
new object[] { "Merge pull request #1234 in v4.0.0", "v4.0.0", null, new SemanticVersion(4), 1234 },
91-
new object[] { "Merge pull request #1234 in V4.0.0", "V4.0.0", null, new SemanticVersion(4), 1234 },
92-
new object[] { "Merge pull request #1234 from origin/feature/one", "origin/feature/one", null, null, 1234 },
93-
new object[] { "Merge pull request #1234 in feature/4.1/one", "feature/4.1/one", null, new SemanticVersion(4,1), 1234 },
94-
new object[] { "Merge pull request #1234 in V://10.10.10.10", "V://10.10.10.10", null, null, 1234 },
95-
new object[] { "Merge pull request #1234 from feature/one into dev", "feature/one", "dev", null, 1234 }
96-
};
87+
new object[] { "Merge pull request #1234 from feature/one", "feature/one", null, null, 1234 },
88+
new object[] { "Merge pull request #1234 in feature/one", "feature/one", null, null, 1234 },
89+
new object[] { "Merge pull request #1234 in v4.0.0", "v4.0.0", null, new SemanticVersion(4), 1234 },
90+
new object[] { "Merge pull request #1234 from origin/feature/one", "origin/feature/one", null, null, 1234 },
91+
new object[] { "Merge pull request #1234 in feature/4.1/one", "feature/4.1/one", null, new SemanticVersion(4,1), 1234 },
92+
new object[] { "Merge pull request #1234 in V://10.10.10.10", "V://10.10.10.10", null, null, 1234 },
93+
new object[] { "Merge pull request #1234 from feature/one into dev", "feature/one", "dev", null, 1234 }
94+
};
9795

9896
[TestCaseSource(nameof(GitHubPullPullMergeMessages))]
9997
public void ParsesGitHubPullMergeMessage(
@@ -114,26 +112,20 @@ public void ParsesGitHubPullMergeMessage(
114112
sut.PullRequestNumber.ShouldBe(expectedPullRequestNumber);
115113
sut.Version.ShouldBe(expectedVersion);
116114
}
117-
115+
118116
private static readonly object[] BitBucketPullMergeMessages =
119117
{
120-
new object[] { "Merge pull request #1234 from feature/one from feature/two to dev", "feature/two", "dev", null, 1234 },
121-
new object[] { "Merge pull request #1234 in feature/one from feature/two to dev", "feature/two", "dev", null, 1234 },
122-
new object[] { "Merge pull request #1234 in v4.0.0 from v4.1.0 to dev", "v4.1.0", "dev", new SemanticVersion(4,1), 1234 },
123-
new object[] { "Merge pull request #1234 in V4.0.0 from V4.1.0 to dev", "V4.1.0", "dev", new SemanticVersion(4,1), 1234 },
124-
new object[] { "Merge pull request #1234 from origin/feature/one from origin/feature/4.2/two to dev", "origin/feature/4.2/two", "dev", new SemanticVersion(4,2), 1234 },
125-
new object[] { "Merge pull request #1234 in feature/4.1/one from feature/4.2/two to dev", "feature/4.2/two", "dev", new SemanticVersion(4,2), 1234 },
126-
new object[] { "Merge pull request #1234 in feature/4.1/one from feature/4.2/two to dev", "feature/4.2/two", "dev", new SemanticVersion(4,2), 1234 },
127-
new object[] { "Merge pull request #1234 from feature/one from feature/two to master" , "feature/two", "master", null, 1234 },
128-
new object[] { "Merge pull request #1234 in V4.1.0 from V://10.10.10.10 to dev", "V://10.10.10.10", "dev", null, 1234 },
129-
//TODO: Investigate successful bitbucket merge messages that may be invalid
130-
// Regex has double 'from/in from' section. Is that correct?
131-
new object[] { "Merge pull request #1234 in feature/4.1/one from feature/4.2/two to dev", "feature/4.2/two", "dev", new SemanticVersion(4,2), 1234 },
132-
new object[] { "Merge pull request #1234 from feature/one from v4.0.0 to master", "v4.0.0", "master", new SemanticVersion(4), 1234 }
133-
134-
135-
136-
};
118+
new object[] { "Merge pull request #1234 from feature/one from feature/two to dev", "feature/two", "dev", null, 1234 },
119+
new object[] { "Merge pull request #1234 in feature/one from feature/two to dev", "feature/two", "dev", null, 1234 },
120+
new object[] { "Merge pull request #1234 in v4.0.0 from v4.1.0 to dev", "v4.1.0", "dev", new SemanticVersion(4,1), 1234 },
121+
new object[] { "Merge pull request #1234 from origin/feature/one from origin/feature/4.2/two to dev", "origin/feature/4.2/two", "dev", new SemanticVersion(4,2), 1234 },
122+
new object[] { "Merge pull request #1234 in feature/4.1/one from feature/4.2/two to dev", "feature/4.2/two", "dev", new SemanticVersion(4,2), 1234 },
123+
new object[] { "Merge pull request #1234 from feature/one from feature/two to master" , "feature/two", "master", null, 1234 },
124+
new object[] { "Merge pull request #1234 in V4.1.0 from V://10.10.10.10 to dev", "V://10.10.10.10", "dev", null, 1234 },
125+
//TODO: Investigate successful bitbucket merge messages that may be invalid
126+
// Regex has double 'from/in from' section. Is that correct?
127+
new object[] { "Merge pull request #1234 from feature/one from v4.0.0 to master", "v4.0.0", "master", new SemanticVersion(4), 1234 }
128+
};
137129

138130
[TestCaseSource(nameof(BitBucketPullMergeMessages))]
139131
public void ParsesBitBucketPullMergeMessage(
@@ -158,14 +150,14 @@ public void ParsesBitBucketPullMergeMessage(
158150

159151
private static readonly object[] SmartGitMergeMessages =
160152
{
161-
new object[] { "Finish feature/one", "feature/one", null, null },
162-
new object[] { "Finish origin/feature/one", "origin/feature/one", null, null },
163-
new object[] { "Finish v4.0.0", "v4.0.0", null, new SemanticVersion(4) },
164-
new object[] { "Finish feature/4.1/one", "feature/4.1/one", null, new SemanticVersion(4, 1) },
165-
new object[] { "Finish origin/4.1/feature/one", "origin/4.1/feature/one", null, new SemanticVersion(4, 1) },
166-
new object[] { "Finish V://10.10.10.10", "V://10.10.10.10", null, null },
167-
new object[] { "Finish V4.0.0 into master", "V4.0.0", "master", new SemanticVersion(4) }
168-
};
153+
new object[] { "Finish feature/one", "feature/one", null, null },
154+
new object[] { "Finish origin/feature/one", "origin/feature/one", null, null },
155+
new object[] { "Finish v4.0.0", "v4.0.0", null, new SemanticVersion(4) },
156+
new object[] { "Finish feature/4.1/one", "feature/4.1/one", null, new SemanticVersion(4, 1) },
157+
new object[] { "Finish origin/4.1/feature/one", "origin/4.1/feature/one", null, new SemanticVersion(4, 1) },
158+
new object[] { "Finish V://10.10.10.10", "V://10.10.10.10", null, null },
159+
new object[] { "Finish V4.0.0 into master", "V4.0.0", "master", new SemanticVersion(4) }
160+
};
169161

170162
[TestCaseSource(nameof(SmartGitMergeMessages))]
171163
public void ParsesSmartGitMergeMessage(
@@ -188,14 +180,14 @@ public void ParsesSmartGitMergeMessage(
188180

189181
private static readonly object[] RemoteTrackingMergeMessages =
190182
{
191-
new object[] { "Merge remote-tracking branch 'feature/one' into master", "feature/one", "master", null },
192-
new object[] { "Merge remote-tracking branch 'origin/feature/one' into dev", "origin/feature/one", "dev", null },
193-
new object[] { "Merge remote-tracking branch 'v4.0.0' into master", "v4.0.0", "master", new SemanticVersion(4) },
194-
new object[] { "Merge remote-tracking branch 'V4.0.0' into master", "V4.0.0", "master", new SemanticVersion(4) },
195-
new object[] { "Merge remote-tracking branch 'feature/4.1/one' into dev", "feature/4.1/one", "dev", new SemanticVersion(4, 1) },
196-
new object[] { "Merge remote-tracking branch 'origin/4.1/feature/one' into master", "origin/4.1/feature/one", "master", new SemanticVersion(4, 1) },
197-
new object[] { "Merge remote-tracking branch 'v://10.10.10.10' into master", "v://10.10.10.10", "master", null }
198-
};
183+
new object[] { "Merge remote-tracking branch 'feature/one' into master", "feature/one", "master", null },
184+
new object[] { "Merge remote-tracking branch 'origin/feature/one' into dev", "origin/feature/one", "dev", null },
185+
new object[] { "Merge remote-tracking branch 'v4.0.0' into master", "v4.0.0", "master", new SemanticVersion(4) },
186+
new object[] { "Merge remote-tracking branch 'V4.0.0' into master", "V4.0.0", "master", new SemanticVersion(4) },
187+
new object[] { "Merge remote-tracking branch 'feature/4.1/one' into dev", "feature/4.1/one", "dev", new SemanticVersion(4, 1) },
188+
new object[] { "Merge remote-tracking branch 'origin/4.1/feature/one' into master", "origin/4.1/feature/one", "master", new SemanticVersion(4, 1) },
189+
new object[] { "Merge remote-tracking branch 'v://10.10.10.10' into master", "v://10.10.10.10", "master", null }
190+
};
199191

200192
[TestCaseSource(nameof(RemoteTrackingMergeMessages))]
201193
public void ParsesRemoteTrackingMergeMessage(
@@ -216,19 +208,77 @@ public void ParsesRemoteTrackingMergeMessage(
216208
sut.Version.ShouldBe(expectedVersion);
217209
}
218210

211+
private static readonly object[] ParsesTfsEnglishUSMergeMessages =
212+
{
213+
new object[] { "Merge feature/one to master", "feature/one", "master", null },
214+
new object[] { "Merge v://10.10.10.10 to master", "v://10.10.10.10", "master", null },
215+
new object[] { "Merge feature/one to v://10.10.10.10", "feature/one", "v://10.10.10.10", null },
216+
new object[] { "Merge V4.0.0 to master", "V4.0.0", "master", new SemanticVersion(4) },
217+
new object[] { "Merge feature/4.1/one to master", "feature/4.1/one", "master", new SemanticVersion(4, 1) }
218+
};
219+
220+
[TestCaseSource(nameof(ParsesTfsEnglishUSMergeMessages))]
221+
public void ParsesTfsEnglishUSMessage(
222+
string message,
223+
string expectedMergedBranch,
224+
string expectedTargetBranch,
225+
SemanticVersion expectedVersion)
226+
{
227+
// Act
228+
var sut = new MergeMessage(message, _config);
229+
230+
// Assert
231+
sut.MatchDefinition.ShouldBe("TfsMergeMessageEnglishUS");
232+
sut.TargetBranch.ShouldBe(expectedTargetBranch);
233+
sut.MergedBranch.ShouldBe(expectedMergedBranch);
234+
sut.IsMergedPullRequest.ShouldBeFalse();
235+
sut.PullRequestNumber.ShouldBeNull();
236+
sut.Version.ShouldBe(expectedVersion);
237+
}
238+
239+
private static readonly object[] ParsesTfsGermanDEMergeMessages =
240+
{
241+
new object[] { "Zusammengeführter PR \"1234\": feature/one mit master mergen", "feature/one", "master", null, 1234 },
242+
new object[] { "Zusammengeführter PR \"1234\": v://10.10.10.10 mit master mergen", "v://10.10.10.10", "master", null, 1234 },
243+
new object[] { "Zusammengeführter PR \"1234\": feature/one mit v://10.10.10.10 mergen", "feature/one", "v://10.10.10.10", null, 1234 },
244+
new object[] { "Zusammengeführter PR \"1234\": V4.0.0 mit master mergen", "V4.0.0", "master", new SemanticVersion(4), 1234 },
245+
new object[] { "Zusammengeführter PR \"1234\": feature/4.1/one mit master mergen", "feature/4.1/one", "master", new SemanticVersion(4, 1), 1234 }
246+
};
247+
248+
[TestCaseSource(nameof(ParsesTfsGermanDEMergeMessages))]
249+
public void ParseTfsGermanDEMessage(
250+
string message,
251+
string expectedMergedBranch,
252+
string expectedTargetBranch,
253+
SemanticVersion expectedVersion,
254+
int? expectedPullRequestNumber)
255+
{
256+
// Act
257+
var sut = new MergeMessage(message, _config);
258+
259+
// Assert
260+
sut.MatchDefinition.ShouldBe("TfsMergeMessageGermanDE");
261+
sut.TargetBranch.ShouldBe(expectedTargetBranch);
262+
sut.MergedBranch.ShouldBe(expectedMergedBranch);
263+
sut.IsMergedPullRequest.ShouldBeTrue();
264+
sut.PullRequestNumber.ShouldBe(expectedPullRequestNumber);
265+
sut.Version.ShouldBe(expectedVersion);
266+
}
267+
219268
private static readonly object[] InvalidMergeMessages =
220269
{
221-
new object[] { "Merge pull request # from feature/one", "", null, null, null },
222-
new object[] { "Merge pull request # in feature/one from feature/two to master" , "", null, null, null }
270+
new object[] { "Merge pull request # from feature/one", "", null, null, null },
271+
new object[] { "Merge pull request # in feature/one from feature/two to master" , "", null, null, null },
272+
new object[] { "Zusammengeführter PR : feature/one mit master mergen", "", null, null, null }
223273
};
224274

225275
[TestCaseSource(nameof(InvalidMergeMessages))]
226-
public void ParsesInvalidBitBucketPullMergeMessage(
227-
string message,
228-
string expectedMergedBranch,
229-
string expectedTargetBranch,
230-
SemanticVersion expectedVersion,
231-
int? expectedPullRequestNumber)
276+
public void ParsesInvalidMergeMessage(
277+
string message,
278+
string expectedMergedBranch,
279+
string expectedTargetBranch,
280+
SemanticVersion expectedVersion,
281+
int? expectedPullRequestNumber)
232282
{
233283
// Act
234284
var sut = new MergeMessage(message, _config);

src/GitVersionCore/MergeMessage.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,9 @@ class MergeMessage
1212
new MergeMessagePattern("SmartGit", @"^Finish (?<SourceBranch>[^\s]*)(?: into (?<TargetBranch>[^\s]*))*"),
1313
new MergeMessagePattern("BitBucketPull", @"^Merge pull request #(?<PullRequestNumber>\d+) (from|in) (?<Source>.*) from (?<SourceBranch>[^\s]*) to (?<TargetBranch>[^\s]*)"),
1414
new MergeMessagePattern("GitHubPull", @"^Merge pull request #(?<PullRequestNumber>\d+) (from|in) (?:(?<SourceBranch>[^\s]*))(?: into (?<TargetBranch>[^\s]*))*"),
15-
new MergeMessagePattern("RemoteTracking", @"^Merge remote-tracking branch '(?<SourceBranch>[^\s]*)'(?: into (?<TargetBranch>[^\s]*))*")
15+
new MergeMessagePattern("RemoteTracking", @"^Merge remote-tracking branch '(?<SourceBranch>[^\s]*)'(?: into (?<TargetBranch>[^\s]*))*"),
16+
new MergeMessagePattern("TfsMergeMessageEnglishUS", @"^Merge (?<SourceBranch>[^\s]*) to (?<TargetBranch>[^\s]*)"),
17+
new MergeMessagePattern("TfsMergeMessageGermanDE",@"^Zusammengeführter PR ""(?<PullRequestNumber>\d+)""\: (?<SourceBranch>.*) mit (?<TargetBranch>.*) mergen")
1618
};
1719

1820
public MergeMessage(string mergeMessage, Config config)

0 commit comments

Comments
 (0)