diff --git a/docs/configuration.md b/docs/configuration.md index 7a4fc23714..cf7becc312 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -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 diff --git a/src/GitVersionCore.Tests/MergeMessageTests.cs b/src/GitVersionCore.Tests/MergeMessageTests.cs index ad278a75d1..1bf65cd81b 100644 --- a/src/GitVersionCore.Tests/MergeMessageTests.cs +++ b/src/GitVersionCore.Tests/MergeMessageTests.cs @@ -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 { @@ -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 }, @@ -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 (?[^']*) \(pull request #(?\d+)\)*"; + var definition = "BitBucketCloud"; + _config.MergeMessageFormats = new Dictionary + { + [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); + } } } diff --git a/src/GitVersionCore/MergeMessage.cs b/src/GitVersionCore/MergeMessage.cs index 47a59302ad..c6877f921c 100644 --- a/src/GitVersionCore/MergeMessage.cs +++ b/src/GitVersionCore/MergeMessage.cs @@ -17,7 +17,7 @@ public class MergeMessage new MergeMessageFormat("RemoteTracking", @"^Merge remote-tracking branch '(?[^\s]*)'(?: into (?[^\s]*))*") }; - public MergeMessage(string mergeMessage, Config config) + public MergeMessage(string mergeMessage, Config config, string currentBranch = default) { if (mergeMessage == null) throw new NullReferenceException(); @@ -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)) { diff --git a/src/GitVersionCore/VersionCalculation/BaseVersionCalculators/MergeMessageBaseVersionStrategy.cs b/src/GitVersionCore/VersionCalculation/BaseVersionCalculators/MergeMessageBaseVersionStrategy.cs index 69d57997d5..fd1b0f21e2 100644 --- a/src/GitVersionCore/VersionCalculation/BaseVersionCalculators/MergeMessageBaseVersionStrategy.cs +++ b/src/GitVersionCore/VersionCalculation/BaseVersionCalculators/MergeMessageBaseVersionStrategy.cs @@ -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; } diff --git a/src/GitVersionCore/VersionCalculation/MainlineVersionCalculator.cs b/src/GitVersionCore/VersionCalculation/MainlineVersionCalculator.cs index 95f8a262d7..8fc4a0e211 100644 --- a/src/GitVersionCore/VersionCalculation/MainlineVersionCalculator.cs +++ b/src/GitVersionCore/VersionCalculation/MainlineVersionCalculator.cs @@ -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);