-
Notifications
You must be signed in to change notification settings - Fork 650
/
MergeMessageVersionStrategy.cs
74 lines (66 loc) · 2.92 KB
/
MergeMessageVersionStrategy.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
using GitVersion.Configuration;
using GitVersion.Extensions;
using GitVersion.Logging;
using LibGit2Sharp;
namespace GitVersion.VersionCalculation
{
/// <summary>
/// Version is extracted from older commits's merge messages.
/// BaseVersionSource is the commit where the message was found.
/// Increments if PreventIncrementForMergedBranchVersion (from the branch config) is false.
/// </summary>
public class MergeMessageVersionStrategy : VersionStrategyBase
{
private readonly ILog log;
public MergeMessageVersionStrategy(ILog log, Lazy<GitVersionContext> versionContext) : base(versionContext)
{
this.log = log ?? throw new ArgumentNullException(nameof(log));
}
public override IEnumerable<BaseVersion> GetVersions()
{
var commitsPriorToThan = Context.CurrentBranch
.CommitsPriorToThan(Context.CurrentCommit.When());
var baseVersions = commitsPriorToThan
.SelectMany(c =>
{
if (TryParse(c, Context, out var mergeMessage) &&
mergeMessage.Version != null &&
Context.FullConfiguration.IsReleaseBranch(TrimRemote(mergeMessage.MergedBranch)))
{
log.Info($"Found commit [{Context.CurrentCommit.Sha}] matching merge message format: {mergeMessage.FormatName}");
var shouldIncrement = !Context.Configuration.PreventIncrementForMergedBranchVersion;
return new[]
{
new BaseVersion($"{MergeMessageStrategyPrefix} '{c.Message.Trim()}'", shouldIncrement, mergeMessage.Version, c, null)
};
}
return Enumerable.Empty<BaseVersion>();
})
.Take(5)
.ToList();
return baseVersions;
}
public static readonly string MergeMessageStrategyPrefix = "Merge message";
private static bool TryParse(Commit mergeCommit, GitVersionContext context, out MergeMessage mergeMessage)
{
mergeMessage = Inner(mergeCommit, context);
return mergeMessage != null;
}
private static MergeMessage Inner(Commit mergeCommit, GitVersionContext context)
{
if (mergeCommit.Parents.Count() < 2)
{
return null;
}
var mergeMessage = new MergeMessage(mergeCommit.Message, context.FullConfiguration);
return mergeMessage;
}
private static string TrimRemote(string branchName) => branchName
.RegexReplace("^refs/remotes/", string.Empty, RegexOptions.IgnoreCase)
.RegexReplace("^origin/", string.Empty, RegexOptions.IgnoreCase);
}
}