Skip to content

add support for custom merge messages without 'TargetBranch' capture group #1846

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion docs/configuration.md
Original file line number Diff line number Diff line change
Expand Up @@ -193,9 +193,11 @@ merge-message-formats:

The regular expression should contain the following capture groups:
+ SourceBranch - Identifies the source branch of the merge
+ TargetBranch - Identifies the target of the merge
+ TargetBranch - Identifies the target of the merge (optional)
+ PullRequestNumber - Captures the pull-request number

If regular expression doesn't contain TargetBranch then for matched messages current branch will be used.

Custom merge message formats are evalauted _before_ any built in formats.

## Branch configuration
Expand Down
39 changes: 37 additions & 2 deletions src/GitVersionCore.Tests/MergeMessageTests.cs
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
using GitVersion;
using GitVersion.Configuration;
using NUnit.Framework;
using Shouldly;
using System;
using System.Collections.Generic;
using GitVersion.Configuration;

namespace GitVersionCore.Tests
{
Expand Down Expand Up @@ -149,7 +149,6 @@ public void ParsesBitBucketPullMergeMessage(
sut.Version.ShouldBe(expectedVersion);
}


private static readonly object[] SmartGitMergeMessages =
{
new object[] { "Finish feature/one", "feature/one", null, null },
Expand Down Expand Up @@ -336,5 +335,41 @@ public void ReturnsAfterFirstMatchingPattern()
sut.PullRequestNumber.ShouldBeNull();
sut.Version.ShouldBeNull();
}


private static readonly object[] BitBucketCloudCustomPullMergeMessages =
{
new object[] { "Merged in feature/one (pull request #1234)", "develop", "feature/one", "develop", null, 1234 },
new object[] { "Merged in hotfix/0.3.1 (pull request #1234)", "master", "hotfix/0.3.1", "master", new SemanticVersion(0,3,1), 1234 },
new object[] { "Merged in master (pull request #1234)", "develop", "master", "develop", null, 1234 }
};

[TestCaseSource(nameof(BitBucketCloudCustomPullMergeMessages))]
public void ParsesBitBucketCloudCustomPullMergeMessage(
string message,
string currentBranch,
string expectedMergedBranch,
string expectedTargetBranch,
SemanticVersion expectedVersion,
int? expectedPullRequestNumber)
{
var format = @"^Merged in (?<SourceBranch>[^']*) \(pull request #(?<PullRequestNumber>\d+)\)*";
var definition = "BitBucketCloud";
_config.MergeMessageFormats = new Dictionary<string, string>
{
[definition] = format
};

// Act
var sut = new MergeMessage(message, _config, currentBranch);

// Assert
sut.FormatName.ShouldBe("BitBucketCloud");
sut.TargetBranch.ShouldBe(expectedTargetBranch);
sut.MergedBranch.ShouldBe(expectedMergedBranch);
sut.IsMergedPullRequest.ShouldBeTrue();
sut.PullRequestNumber.ShouldBe(expectedPullRequestNumber);
sut.Version.ShouldBe(expectedVersion);
}
}
}
9 changes: 7 additions & 2 deletions src/GitVersionCore/MergeMessage.cs
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ public class MergeMessage
new MergeMessageFormat("RemoteTracking", @"^Merge remote-tracking branch '(?<SourceBranch>[^\s]*)'(?: into (?<TargetBranch>[^\s]*))*")
};

public MergeMessage(string mergeMessage, Config config)
public MergeMessage(string mergeMessage, Config config, string currentBranch = default)
{
if (mergeMessage == null)
throw new NullReferenceException();
Expand All @@ -36,10 +36,15 @@ public MergeMessage(string mergeMessage, Config config)
FormatName = format.Name;
MergedBranch = match.Groups["SourceBranch"].Value;

if (match.Groups["TargetBranch"].Success)
var containsTargetBranchGroup = format.Pattern.GetGroupNames().Contains("TargetBranch");
if (containsTargetBranchGroup && match.Groups["TargetBranch"].Success)
{
TargetBranch = match.Groups["TargetBranch"].Value;
}
else
{
TargetBranch = currentBranch;
}

if (int.TryParse(match.Groups["PullRequestNumber"].Value, out var pullNumber))
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ static MergeMessage Inner(Commit mergeCommit, GitVersionContext context)
return null;
}

var mergeMessage = new MergeMessage(mergeCommit.Message, context.FullConfiguration);
var mergeMessage = new MergeMessage(mergeCommit.Message, context.FullConfiguration, context.CurrentBranch.FriendlyName);
return mergeMessage;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -269,7 +269,7 @@ private static VersionField TryFindIncrementFromMergeMessage(Commit mergeCommit,
{
if (mergeCommit != null)
{
var mergeMessage = new MergeMessage(mergeCommit.Message, context.FullConfiguration);
var mergeMessage = new MergeMessage(mergeCommit.Message, context.FullConfiguration, context.CurrentBranch.FriendlyName);
if (mergeMessage.MergedBranch != null)
{
var config = context.FullConfiguration.GetConfigForBranch(mergeMessage.MergedBranch);
Expand Down