Skip to content

Commit 42a2a1e

Browse files
committed
Always use commit message increments when present
1 parent 90a504f commit 42a2a1e

10 files changed

+153
-69
lines changed

src/GitVersionCore.Tests/ConfigProviderTests.CanWriteOutEffectiveConfiguration.approved.txt

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,40 +9,68 @@ branches:
99
increment: Patch
1010
prevent-increment-of-merged-branch-version: true
1111
track-merge-target: false
12+
major-version-bump-message: '\+semver:\s?(breaking|major)'
13+
minor-version-bump-message: '\+semver:\s?(feature|minor)'
14+
patch-version-bump-message: '\+semver:\s?(fix|patch)'
15+
commit-message-version-bump-mode: All
1216
release[/-]:
1317
mode: ContinuousDelivery
1418
tag: beta
1519
increment: Patch
1620
prevent-increment-of-merged-branch-version: true
1721
track-merge-target: false
22+
major-version-bump-message: '\+semver:\s?(breaking|major)'
23+
minor-version-bump-message: '\+semver:\s?(feature|minor)'
24+
patch-version-bump-message: '\+semver:\s?(fix|patch)'
25+
commit-message-version-bump-mode: All
1826
feature[/-]:
1927
mode: ContinuousDelivery
2028
tag: useBranchName
2129
increment: Inherit
2230
prevent-increment-of-merged-branch-version: false
2331
track-merge-target: false
32+
major-version-bump-message: '\+semver:\s?(breaking|major)'
33+
minor-version-bump-message: '\+semver:\s?(feature|minor)'
34+
patch-version-bump-message: '\+semver:\s?(fix|patch)'
35+
commit-message-version-bump-mode: All
2436
(pull|pull\-requests|pr)[/-]:
2537
mode: ContinuousDelivery
2638
tag: PullRequest
2739
increment: Inherit
2840
prevent-increment-of-merged-branch-version: false
2941
tag-number-pattern: '[/-](?<number>\d+)[-/]'
3042
track-merge-target: false
43+
major-version-bump-message: '\+semver:\s?(breaking|major)'
44+
minor-version-bump-message: '\+semver:\s?(feature|minor)'
45+
patch-version-bump-message: '\+semver:\s?(fix|patch)'
46+
commit-message-version-bump-mode: All
3147
hotfix[/-]:
3248
mode: ContinuousDelivery
3349
tag: beta
3450
increment: Patch
3551
prevent-increment-of-merged-branch-version: false
3652
track-merge-target: false
53+
major-version-bump-message: '\+semver:\s?(breaking|major)'
54+
minor-version-bump-message: '\+semver:\s?(feature|minor)'
55+
patch-version-bump-message: '\+semver:\s?(fix|patch)'
56+
commit-message-version-bump-mode: All
3757
support[/-]:
3858
mode: ContinuousDelivery
3959
tag:
4060
increment: Patch
4161
prevent-increment-of-merged-branch-version: true
4262
track-merge-target: false
63+
major-version-bump-message: '\+semver:\s?(breaking|major)'
64+
minor-version-bump-message: '\+semver:\s?(feature|minor)'
65+
patch-version-bump-message: '\+semver:\s?(fix|patch)'
66+
commit-message-version-bump-mode: All
4367
develop:
4468
mode: ContinuousDeployment
4569
tag: unstable
4670
increment: Minor
4771
prevent-increment-of-merged-branch-version: false
4872
track-merge-target: true
73+
major-version-bump-message: '\+semver:\s?(breaking|major)'
74+
minor-version-bump-message: '\+semver:\s?(feature|minor)'
75+
patch-version-bump-message: '\+semver:\s?(fix|patch)'
76+
commit-message-version-bump-mode: All

src/GitVersionCore.Tests/TestEffectiveConfiguration.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,13 @@ public TestEffectiveConfiguration(
1717
bool trackMergeTarget = false,
1818
string majorMessage = null,
1919
string minorMessage = null,
20-
IncrementStrategy messageFallback = IncrementStrategy.Patch) :
20+
string patchMessage = null,
21+
CommitMessageVersionMode commitMessageMode = CommitMessageVersionMode.All) :
2122
base(assemblyVersioningScheme, versioningMode, gitTagPrefix, tag, nextVersion, IncrementStrategy.Patch,
2223
branchPrefixToTrim, preventIncrementForMergedBranchVersion, tagNumberPattern, continuousDeploymentFallbackTag,
2324
trackMergeTarget,
24-
majorMessage, minorMessage, messageFallback)
25+
majorMessage, minorMessage, patchMessage,
26+
commitMessageMode)
2527
{
2628
}
2729
}

src/GitVersionCore/Configuration/BranchConfig.cs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@ public BranchConfig(BranchConfig branchConfiguration)
1616
PreventIncrementOfMergedBranchVersion = branchConfiguration.PreventIncrementOfMergedBranchVersion;
1717
TagNumberPattern = branchConfiguration.TagNumberPattern;
1818
TrackMergeTarget = branchConfiguration.TrackMergeTarget;
19-
MessageFallbackStrategy = branchConfiguration.MessageFallbackStrategy;
19+
PatchVersionBumpMessage = branchConfiguration.PatchVersionBumpMessage;
20+
CommitMessageVersionBumpMode = branchConfiguration.CommitMessageVersionBumpMode;
2021
}
2122

2223
[YamlMember(Alias = "mode")]
@@ -46,7 +47,10 @@ public BranchConfig(BranchConfig branchConfiguration)
4647
[YamlMember(Alias = "minor-version-bump-message")]
4748
public string MinorVersionBumpMessage { get; set; }
4849

49-
[YamlMember(Alias = "message-fallback")]
50-
public IncrementStrategy? MessageFallbackStrategy { get; set; }
50+
[YamlMember(Alias = "patch-version-bump-message")]
51+
public string PatchVersionBumpMessage { get; set; }
52+
53+
[YamlMember(Alias = "commit-message-version-bump-mode")]
54+
public CommitMessageVersionMode? CommitMessageVersionBumpMode { get; set; }
5155
}
5256
}

src/GitVersionCore/Configuration/ConfigurationProvider.cs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,14 +68,22 @@ public static void ApplyBranchDefaults(Config config,
6868
bool defaultPreventIncrement = false,
6969
VersioningMode? defaultVersioningMode = null, // Looked up from main config
7070
bool defaultTrackMergeTarget = false,
71-
string defaultTagNumberPattern = null)
71+
string defaultTagNumberPattern = null,
72+
string majorVersionBumpMessage = IncrementStrategyFinder.DefaultMajorPattern,
73+
string minorVersionBumpMessage = IncrementStrategyFinder.DefaultMinorPattern,
74+
string patchVersionBumpMessage = IncrementStrategyFinder.DefaultPatchPattern,
75+
CommitMessageVersionMode commitMessageVersionBump = CommitMessageVersionMode.All)
7276
{
7377
branchConfig.Tag = branchConfig.Tag ?? defaultTag;
7478
branchConfig.TagNumberPattern = branchConfig.TagNumberPattern ?? defaultTagNumberPattern;
7579
branchConfig.Increment = branchConfig.Increment ?? defaultIncrementStrategy;
7680
branchConfig.PreventIncrementOfMergedBranchVersion = branchConfig.PreventIncrementOfMergedBranchVersion ?? defaultPreventIncrement;
7781
branchConfig.TrackMergeTarget = branchConfig.TrackMergeTarget ?? defaultTrackMergeTarget;
7882
branchConfig.VersioningMode = branchConfig.VersioningMode ?? defaultVersioningMode ?? config.VersioningMode;
83+
branchConfig.MajorVersionBumpMessage = branchConfig.MajorVersionBumpMessage ?? majorVersionBumpMessage;
84+
branchConfig.MinorVersionBumpMessage = branchConfig.MinorVersionBumpMessage ?? minorVersionBumpMessage;
85+
branchConfig.PatchVersionBumpMessage = branchConfig.PatchVersionBumpMessage ?? patchVersionBumpMessage;
86+
branchConfig.CommitMessageVersionBumpMode = branchConfig.CommitMessageVersionBumpMode ?? commitMessageVersionBump;
7987
}
8088

8189
static Config ReadConfig(string workingDirectory, IFileSystem fileSystem)
Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
namespace GitVersion
22
{
3+
using System;
4+
35
public enum IncrementStrategy
46
{
57
None,
@@ -9,14 +11,26 @@ public enum IncrementStrategy
911
/// <summary>
1012
/// Uses the increment strategy from the branch the current branch was branched from
1113
/// </summary>
12-
Inherit,
13-
/// <summary>
14-
/// Parse commit messages for indications of change severity. If none are found, <c>CommitMessage</c> behaves like <c>Patch</c>.
15-
/// </summary>
16-
CommitMessage,
17-
/// <summary>
18-
/// Parse merge commit messages for indications of change severity. If none are found, <c>MergeMessage</c> behaves like <c>Patch</c>.
19-
/// </summary>
20-
MergeMessage
14+
Inherit
15+
}
16+
17+
public static class IncrementStrategyExtensions
18+
{
19+
public static VersionField ToVersionField(this IncrementStrategy strategy)
20+
{
21+
switch (strategy)
22+
{
23+
case IncrementStrategy.None:
24+
return VersionField.None;
25+
case IncrementStrategy.Major:
26+
return VersionField.Major;
27+
case IncrementStrategy.Minor:
28+
return VersionField.Minor;
29+
case IncrementStrategy.Patch:
30+
return VersionField.Patch;
31+
default:
32+
throw new ArgumentOutOfRangeException("strategy", strategy, null);
33+
}
34+
}
2135
}
2236
}

src/GitVersionCore/EffectiveConfiguration.cs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@ public EffectiveConfiguration(
1616
bool trackMergeTarget,
1717
string majorVersionBumpMessage,
1818
string minorVersionBumpMessage,
19-
IncrementStrategy messageFallback)
19+
string patchVersionBumpMessage,
20+
CommitMessageVersionMode commitMessageVersionBumpMode)
2021
{
2122
AssemblyVersioningScheme = assemblyVersioningScheme;
2223
VersioningMode = versioningMode;
@@ -31,7 +32,8 @@ public EffectiveConfiguration(
3132
TrackMergeTarget = trackMergeTarget;
3233
MajorVersionBumpMessage = majorVersionBumpMessage;
3334
MinorVersionBumpMessage = minorVersionBumpMessage;
34-
MessageFallbackStrategy = messageFallback;
35+
PatchVersionBumpMessage = patchVersionBumpMessage;
36+
CommitMessageVersionBumpMode = commitMessageVersionBumpMode;
3537
}
3638

3739
public VersioningMode VersioningMode { get; private set; }
@@ -65,7 +67,9 @@ public EffectiveConfiguration(
6567
public string MajorVersionBumpMessage { get; private set; }
6668

6769
public string MinorVersionBumpMessage { get; private set; }
68-
69-
public IncrementStrategy MessageFallbackStrategy { get; private set; }
70+
71+
public string PatchVersionBumpMessage { get; private set; }
72+
73+
public CommitMessageVersionMode CommitMessageVersionBumpMode { get; private set; }
7074
}
7175
}

src/GitVersionCore/GitVersionContext.cs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -98,20 +98,23 @@ void CalculateEffectiveConfiguration()
9898
var incrementStrategy = currentBranchConfig.Value.Increment.Value;
9999
var preventIncrementForMergedBranchVersion = currentBranchConfig.Value.PreventIncrementOfMergedBranchVersion.Value;
100100
var trackMergeTarget = currentBranchConfig.Value.TrackMergeTarget.Value;
101+
var majorMessage = currentBranchConfig.Value.MajorVersionBumpMessage;
102+
var minorMessage = currentBranchConfig.Value.MinorVersionBumpMessage;
103+
var patchMessage = currentBranchConfig.Value.MinorVersionBumpMessage;
104+
var commitMessageVersionBump = currentBranchConfig.Value.CommitMessageVersionBumpMode.Value;
101105

102106
var nextVersion = configuration.NextVersion;
103107
var assemblyVersioningScheme = configuration.AssemblyVersioningScheme.Value;
104108
var gitTagPrefix = configuration.TagPrefix;
105-
var majorMessage = currentBranchConfig.Value.MajorVersionBumpMessage ?? @"\+semver:\s?(breaking|major)";
106-
var minorMessage = currentBranchConfig.Value.MinorVersionBumpMessage ?? @"\+semver:\s?(feature|minor)";
107-
var messageFallback = currentBranchConfig.Value.MessageFallbackStrategy ?? IncrementStrategy.Patch;
109+
108110
Configuration = new EffectiveConfiguration(
109111
assemblyVersioningScheme, versioningMode, gitTagPrefix,
110112
tag, nextVersion, incrementStrategy, currentBranchConfig.Key,
111113
preventIncrementForMergedBranchVersion,
112114
tagNumberPattern, configuration.ContinuousDeploymentFallbackTag,
113115
trackMergeTarget,
114-
majorMessage, minorMessage, messageFallback);
116+
majorMessage, minorMessage, patchMessage,
117+
commitMessageVersionBump);
115118
}
116119
}
117120
}

src/GitVersionCore/IncrementStrategyFinder.cs

Lines changed: 61 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,66 +1,83 @@
11
namespace GitVersion
22
{
3-
using System;
43
using System.Collections.Generic;
54
using System.Linq;
65
using System.Text.RegularExpressions;
76
using VersionCalculation.BaseVersionCalculators;
87
using LibGit2Sharp;
98

9+
public enum CommitMessageVersionMode
10+
{
11+
All,
12+
MergeMessageOnly,
13+
None
14+
}
15+
1016
public static class IncrementStrategyFinder
1117
{
12-
public static VersionField DetermineIncrementedField(GitVersionContext context, BaseVersion baseVersion)
18+
public const string DefaultMajorPattern = @"\+semver:\s?(breaking|major)";
19+
public const string DefaultMinorPattern = @"\+semver:\s?(feature|minor)";
20+
public const string DefaultPatchPattern = @"\+semver:\s?(fix|patch)";
21+
22+
public static VersionField? DetermineIncrementedField(GitVersionContext context, BaseVersion baseVersion)
1323
{
14-
if (context.Configuration.Increment != IncrementStrategy.CommitMessage && context.Configuration.Increment != IncrementStrategy.MergeMessage)
24+
var commitMessageIncrement = FindCommitMessageIncrement(context, baseVersion);
25+
var defaultIncrement = context.Configuration.Increment.ToVersionField();
26+
27+
// use the default branch config increment strategy if there are no commit message overrides
28+
if (commitMessageIncrement == null)
1529
{
16-
return SimpleIncrement(context.Configuration.Increment);
30+
return baseVersion.ShouldIncrement ? defaultIncrement : (VersionField?)null;
1731
}
1832

19-
var commits = GetIntermediateCommits(context.Repository, baseVersion.BaseVersionSource, context.CurrentCommit);
20-
21-
if (context.Configuration.Increment == IncrementStrategy.MergeMessage)
33+
// cap the commit message severity to minor for alpha versions
34+
if (baseVersion.SemanticVersion < new SemanticVersion(1) && commitMessageIncrement > VersionField.Minor)
2235
{
23-
commits = commits.Where(c => c.Parents.Count() > 1);
36+
commitMessageIncrement = VersionField.Minor;
2437
}
2538

26-
var majorRegex = MajorChangeRegex(context.Configuration.MajorVersionBumpMessage);
27-
var minorRegex = MinorChangeRegex(context.Configuration.MinorVersionBumpMessage);
28-
29-
VersionField biggestField = SimpleIncrement(context.Configuration.MessageFallbackStrategy);
30-
foreach (var commit in commits)
39+
// don't increment for less than the branch config increment, if the absense of commit messages would have
40+
// still resulted in an increment of configuration.Increment
41+
if (baseVersion.ShouldIncrement && commitMessageIncrement < defaultIncrement)
3142
{
32-
if (majorRegex.IsMatch(commit.Message))
33-
{
34-
biggestField = VersionField.Major;
35-
break;
36-
}
37-
38-
if (biggestField != VersionField.Minor && minorRegex.IsMatch(commit.Message))
39-
{
40-
biggestField = VersionField.Minor;
41-
}
43+
return defaultIncrement;
4244
}
4345

44-
return biggestField;
46+
return commitMessageIncrement;
4547
}
4648

47-
private static VersionField SimpleIncrement(IncrementStrategy strategy)
49+
private static VersionField? FindCommitMessageIncrement(GitVersionContext context, BaseVersion baseVersion)
4850
{
49-
switch (strategy)
51+
if (context.Configuration.CommitMessageVersionBumpMode == CommitMessageVersionMode.None)
5052
{
51-
case IncrementStrategy.None:
52-
return VersionField.None;
53-
case IncrementStrategy.Major:
54-
return VersionField.Major;
55-
case IncrementStrategy.Minor:
56-
return VersionField.Minor;
57-
case IncrementStrategy.Patch:
58-
return VersionField.Patch;
59-
default:
60-
throw new ArgumentOutOfRangeException("strategy", strategy, null);
53+
return null;
6154
}
62-
}
55+
56+
var commits = GetIntermediateCommits(context.Repository, baseVersion.BaseVersionSource, context.CurrentCommit);
6357

58+
if (context.Configuration.CommitMessageVersionBumpMode == CommitMessageVersionMode.MergeMessageOnly)
59+
{
60+
commits = commits.Where(c => c.Parents.Count() > 1);
61+
}
62+
63+
var majorRegex = CreateRegex(context.Configuration.MajorVersionBumpMessage ?? DefaultMajorPattern);
64+
var minorRegex = CreateRegex(context.Configuration.MinorVersionBumpMessage ?? DefaultMinorPattern);
65+
var patchRegex = CreateRegex(context.Configuration.PatchVersionBumpMessage ?? DefaultPatchPattern);
66+
67+
var increments = commits
68+
.Select(c => FindIncrementFromMessage(c.Message, majorRegex, minorRegex, patchRegex))
69+
.Where(v => v != null)
70+
.Select(v => v.Value)
71+
.ToList();
72+
73+
if (increments.Any())
74+
{
75+
return increments.Max();
76+
}
77+
78+
return null;
79+
}
80+
6481
private static IEnumerable<Commit> GetIntermediateCommits(IRepository repo, Commit baseCommit, Commit headCommit)
6582
{
6683
var filter = new CommitFilter
@@ -73,12 +90,16 @@ private static IEnumerable<Commit> GetIntermediateCommits(IRepository repo, Comm
7390
return repo.Commits.QueryBy(filter);
7491
}
7592

76-
private static Regex MajorChangeRegex(string pattern)
93+
private static VersionField? FindIncrementFromMessage(string message, Regex major, Regex minor, Regex patch)
7794
{
78-
return new Regex(pattern, RegexOptions.Compiled | RegexOptions.IgnoreCase);
95+
if (major.IsMatch(message)) return VersionField.Major;
96+
if (minor.IsMatch(message)) return VersionField.Minor;
97+
if (patch.IsMatch(message)) return VersionField.Patch;
98+
99+
return null;
79100
}
80101

81-
private static Regex MinorChangeRegex(string pattern)
102+
private static Regex CreateRegex(string pattern)
82103
{
83104
return new Regex(pattern, RegexOptions.Compiled | RegexOptions.IgnoreCase);
84105
}

src/GitVersionCore/VersionCalculation/BaseVersionCalculator.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -74,10 +74,10 @@ public BaseVersion GetBaseVersion(GitVersionContext context)
7474

7575
static SemanticVersion MaybeIncrement(GitVersionContext context, BaseVersion version)
7676
{
77-
if (version.ShouldIncrement)
77+
var increment = IncrementStrategyFinder.DetermineIncrementedField(context, version);
78+
if (increment != null)
7879
{
79-
var field = IncrementStrategyFinder.DetermineIncrementedField(context, version);
80-
return version.SemanticVersion.IncrementVersion(field);
80+
return version.SemanticVersion.IncrementVersion(increment.Value);
8181
}
8282

8383
return version.SemanticVersion;

0 commit comments

Comments
 (0)