Skip to content

Commit 5b6126b

Browse files
authored
Merge pull request #1297 from JonCubed/feature/honour-increment-config
honour increment config value for Mainline
2 parents 018ba17 + ed3ef0e commit 5b6126b

File tree

3 files changed

+115
-6
lines changed

3 files changed

+115
-6
lines changed

src/GitVersionCore.Tests/IntegrationTests/MainlineDevelopmentMode.cs

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -339,6 +339,104 @@ public void MergingFeatureBranchThatIncrementsMinorNumberIncrementsMinorVersionO
339339
fixture.AssertFullSemver(currentConfig, "1.1.0");
340340
}
341341
}
342+
343+
[Test]
344+
public void VerifyIncrementConfigIsHonoured()
345+
{
346+
var minorIncrementConfig = new Config
347+
{
348+
VersioningMode = VersioningMode.Mainline,
349+
Increment = IncrementStrategy.Minor,
350+
Branches = new Dictionary<string, BranchConfig>
351+
{
352+
{
353+
"master",
354+
new BranchConfig
355+
{
356+
Increment = IncrementStrategy.Minor,
357+
Name = "master",
358+
Regex = "master"
359+
}
360+
},
361+
{
362+
"feature",
363+
new BranchConfig
364+
{
365+
Increment = IncrementStrategy.Minor,
366+
Name = "feature",
367+
Regex = "features?[/-]"
368+
}
369+
}
370+
}
371+
};
372+
373+
using ( var fixture = new EmptyRepositoryFixture() )
374+
{
375+
fixture.Repository.MakeACommit("1");
376+
fixture.MakeATaggedCommit("1.0.0");
377+
378+
fixture.BranchTo("feature/foo", "foo");
379+
fixture.MakeACommit("2");
380+
fixture.AssertFullSemver(minorIncrementConfig, "1.1.0-foo.1");
381+
fixture.MakeACommit("2.1");
382+
fixture.AssertFullSemver(minorIncrementConfig, "1.1.0-foo.2");
383+
fixture.Checkout("master");
384+
fixture.MergeNoFF("feature/foo");
385+
386+
fixture.AssertFullSemver(minorIncrementConfig, "1.1.0");
387+
388+
fixture.BranchTo("feature/foo2", "foo2");
389+
fixture.MakeACommit("3 +semver: patch");
390+
fixture.AssertFullSemver(minorIncrementConfig, "1.1.1-foo2.1");
391+
fixture.Checkout("master");
392+
fixture.MergeNoFF("feature/foo2");
393+
fixture.AssertFullSemver(minorIncrementConfig, "1.1.1");
394+
395+
fixture.BranchTo("feature/foo3", "foo3");
396+
fixture.MakeACommit("4");
397+
fixture.Checkout("master");
398+
fixture.MergeNoFF("feature/foo3");
399+
fixture.SequenceDiagram.NoteOver("Merge message contains '+semver: patch'", "master");
400+
var commit = fixture.Repository.Head.Tip;
401+
// Put semver increment in merge message
402+
fixture.Repository.Commit(commit.Message + " +semver: patch", commit.Author, commit.Committer, new CommitOptions
403+
{
404+
AmendPreviousCommit = true
405+
});
406+
fixture.AssertFullSemver(minorIncrementConfig, "1.1.2");
407+
408+
fixture.BranchTo("feature/foo4", "foo4");
409+
fixture.MakeACommit("5 +semver: major");
410+
fixture.AssertFullSemver(minorIncrementConfig, "2.0.0-foo4.1");
411+
fixture.Checkout("master");
412+
fixture.MergeNoFF("feature/foo4");
413+
fixture.AssertFullSemver(config, "2.0.0");
414+
415+
// We should evaluate any commits not included in merge commit calculations for direct commit/push or squash to merge commits
416+
fixture.MakeACommit("6 +semver: major");
417+
fixture.AssertFullSemver(minorIncrementConfig, "3.0.0");
418+
fixture.MakeACommit("7");
419+
fixture.AssertFullSemver(minorIncrementConfig, "3.1.0");
420+
fixture.MakeACommit("8 +semver: patch");
421+
fixture.AssertFullSemver(minorIncrementConfig, "3.1.1");
422+
423+
// Finally verify that the merge commits still function properly
424+
fixture.BranchTo("feature/foo5", "foo5");
425+
fixture.MakeACommit("9 +semver: patch");
426+
fixture.AssertFullSemver(minorIncrementConfig, "3.1.2-foo5.1");
427+
fixture.Checkout("master");
428+
fixture.MergeNoFF("feature/foo5");
429+
fixture.AssertFullSemver(minorIncrementConfig, "3.1.2");
430+
431+
// One more direct commit for good measure
432+
fixture.MakeACommit("10 +semver: patch");
433+
fixture.AssertFullSemver(minorIncrementConfig, "3.1.3");
434+
// And we can commit without bumping semver
435+
fixture.MakeACommit("11 +semver: none");
436+
fixture.AssertFullSemver(minorIncrementConfig, "3.1.3");
437+
Console.WriteLine(fixture.SequenceDiagram.GetDiagram());
438+
}
439+
}
342440
}
343441

344442
static class CommitExtensions

src/GitVersionCore/IncrementStrategyFinder.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,5 +126,17 @@ private static Regex CreateRegex(string pattern)
126126
{
127127
return new Regex(pattern, RegexOptions.Compiled | RegexOptions.IgnoreCase);
128128
}
129+
130+
public static VersionField FindDefaultIncrementForBranch( GitVersionContext context, string branch = null )
131+
{
132+
var config = context.FullConfiguration.GetConfigForBranch(branch ?? context.CurrentBranch.FriendlyName);
133+
if ( config?.Increment != null && config.Increment != IncrementStrategy.Inherit )
134+
{
135+
return config.Increment.Value.ToVersionField();
136+
}
137+
138+
// Fallback to patch
139+
return VersionField.Patch;
140+
}
129141
}
130142
}

src/GitVersionCore/VersionCalculation/MainlineVersionCalculator.cs

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
using System;
44
using System.Collections.Generic;
55
using System.Linq;
6-
using System.Text;
76
using System.Text.RegularExpressions;
87

98
namespace GitVersion.VersionCalculation
@@ -73,7 +72,7 @@ public SemanticVersion FindMainlineModeVersion(BaseVersion baseVersion, GitVersi
7372

7473
var branchIncrement = FindMessageIncrement(context, null, mergedHead, findMergeBase, directCommits);
7574
// This will increment for any direct commits on master
76-
mainlineVersion = IncrementForEachCommit(context, directCommits, mainlineVersion);
75+
mainlineVersion = IncrementForEachCommit(context, directCommits, mainlineVersion, "master");
7776
mainlineVersion.BuildMetaData = metaDataCalculator.Create(findMergeBase, context);
7877
// Don't increment if the merge commit is a merge into mainline
7978
// this ensures PR's and forward merges end up correct.
@@ -164,14 +163,14 @@ static Commit GetMainlineTip(GitVersionContext context)
164163
return chosenMainline.Tip;
165164
}
166165

167-
private static SemanticVersion IncrementForEachCommit(GitVersionContext context, List<Commit> directCommits, SemanticVersion mainlineVersion)
166+
private static SemanticVersion IncrementForEachCommit(GitVersionContext context, List<Commit> directCommits, SemanticVersion mainlineVersion, string branch = null)
168167
{
169168
foreach (var directCommit in directCommits)
170169
{
171170
var directCommitIncrement = IncrementStrategyFinder.GetIncrementForCommits(context, new[]
172171
{
173172
directCommit
174-
}) ?? VersionField.Patch;
173+
}) ?? IncrementStrategyFinder.FindDefaultIncrementForBranch(context, branch);
175174
mainlineVersion = mainlineVersion.IncrementVersion(directCommitIncrement);
176175
Logger.WriteInfo(string.Format("Direct commit on master {0} incremented base versions {1}, now {2}",
177176
directCommit.Sha, directCommitIncrement, mainlineVersion));
@@ -210,8 +209,8 @@ private static VersionField TryFindIncrementFromMergeMessage(Commit mergeCommit,
210209
}
211210
}
212211

213-
// Fallback to patch
214-
return VersionField.Patch;
212+
// Fallback to config increment value
213+
return IncrementStrategyFinder.FindDefaultIncrementForBranch(context);
215214
}
216215

217216
private Commit GetMergedHead(Commit mergeCommit)

0 commit comments

Comments
 (0)