Skip to content

Commit 960def5

Browse files
committed
Made mainline work for feature branches too
1 parent d9d3f0a commit 960def5

File tree

2 files changed

+61
-61
lines changed

2 files changed

+61
-61
lines changed

src/GitVersionCore.Tests/IntegrationTests/MainlineDevelopmentMode.cs

Lines changed: 6 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,41 +1,15 @@
1-
using System;
2-
using System.Diagnostics;
3-
using GitTools;
4-
using GitTools.Testing;
1+
using GitTools.Testing;
52
using GitVersion;
63
using GitVersionCore.Tests;
74
using NUnit.Framework;
8-
using Shouldly;
95

106
public class MainlineDevelopmentMode
117
{
128
private Config config = new Config
139
{
14-
Branches =
15-
{
16-
{
17-
"master", new BranchConfig
18-
{
19-
VersioningMode = VersioningMode.Mainline
20-
}
21-
}
22-
}
10+
VersioningMode = VersioningMode.Mainline
2311
};
2412

25-
26-
[Test]
27-
public void CannotSetMainlineDevelopmentAtAGlobalLevel()
28-
{
29-
using (var fixture = new EmptyRepositoryFixture())
30-
{
31-
Should.Throw<NotSupportedException>(() =>
32-
fixture.AssertFullSemver(new Config
33-
{
34-
VersioningMode = VersioningMode.Mainline
35-
}, ""));
36-
}
37-
}
38-
3913
[Test]
4014
public void MergedFeatureBranchesToMasterImpliesRelease()
4115
{
@@ -46,25 +20,29 @@ public void MergedFeatureBranchesToMasterImpliesRelease()
4620

4721
fixture.BranchTo("feature/foo");
4822
fixture.Repository.MakeACommit("2");
23+
fixture.AssertFullSemver(config, "0.1.1-foo.1+2");
4924
fixture.Checkout("master");
5025
fixture.MergeNoFF("feature/foo");
5126

5227
fixture.AssertFullSemver(config, "0.1.1+3");
5328

5429
fixture.BranchTo("feature/foo2");
5530
fixture.Repository.MakeACommit("3 +semver: minor");
31+
fixture.AssertFullSemver(config, "0.2.0-foo2.1+4");
5632
fixture.Checkout("master");
5733
fixture.MergeNoFF("feature/foo2");
5834
fixture.AssertFullSemver(config, "0.2.0+5");
5935

6036
fixture.BranchTo("feature/foo3");
6137
fixture.Repository.MakeACommit("4 +semver: minor");
38+
fixture.AssertFullSemver(config, "0.3.0-foo3.1+6");
6239
fixture.Checkout("master");
6340
fixture.MergeNoFF("feature/foo3");
6441
fixture.AssertFullSemver(config, "0.3.0+7");
6542

6643
fixture.BranchTo("feature/foo4");
6744
fixture.Repository.MakeACommit("5 +semver: major");
45+
fixture.AssertFullSemver(config, "1.0.0-foo4.1+8");
6846
fixture.Checkout("master");
6947
fixture.MergeNoFF("feature/foo4");
7048
fixture.AssertFullSemver(config, "1.0.0+9");

src/GitVersionCore/VersionCalculation/NextVersionCalculator.cs

Lines changed: 55 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
using System.Linq;
55
using System.Text.RegularExpressions;
66
using BaseVersionCalculators;
7+
using GitTools;
78
using LibGit2Sharp;
89

910
public class NextVersionCalculator
@@ -49,12 +50,7 @@ public SemanticVersion FindVersion(GitVersionContext context)
4950
}
5051
else
5152
{
52-
var increment = IncrementStrategyFinder.DetermineIncrementedField(context, baseVersion);
53-
if (increment != null)
54-
{
55-
semver = semver.IncrementVersion(increment.Value);
56-
}
57-
else Logger.WriteInfo("Skipping version increment");
53+
semver = PerformIncrement(context, baseVersion, semver);
5854
}
5955

6056
if (!semver.PreReleaseTag.HasTag() && !string.IsNullOrEmpty(context.Configuration.Tag))
@@ -73,42 +69,68 @@ public SemanticVersion FindVersion(GitVersionContext context)
7369
return taggedSemanticVersion ?? semver;
7470
}
7571

72+
private static SemanticVersion PerformIncrement(GitVersionContext context, BaseVersion baseVersion, SemanticVersion semver)
73+
{
74+
var increment = IncrementStrategyFinder.DetermineIncrementedField(context, baseVersion);
75+
if (increment != null)
76+
{
77+
semver = semver.IncrementVersion(increment.Value);
78+
}
79+
else Logger.WriteInfo("Skipping version increment");
80+
return semver;
81+
}
82+
7683
private SemanticVersion FindMainlineModeVersion(BaseVersion baseVersion, GitVersionContext context)
7784
{
7885
if (baseVersion.SemanticVersion.PreReleaseTag.HasTag())
7986
{
8087
throw new NotSupportedException("Mainline development mode doesn't yet support pre-release tags on master");
8188
}
82-
Logger.WriteInfo("Using mainline development mode to calculate current version");
83-
var commitLog = context.Repository.Commits.QueryBy(new CommitFilter
89+
90+
using (Logger.IndentLog("Using mainline development mode to calculate current version"))
8491
{
85-
IncludeReachableFrom = context.CurrentBranch,
86-
ExcludeReachableFrom = baseVersion.BaseVersionSource,
87-
SortBy = CommitSortStrategies.Reverse
88-
}).ToList();
89-
var mergeCommits = commitLog
90-
.Where(l => l.Parents.Count() > 1)
91-
.ToList();
92-
return mergeCommits
93-
.Select(mc =>
92+
var commitLog = context.Repository.Commits.QueryBy(new CommitFilter
9493
{
95-
var mergedHead = GetMergedHead(mc);
96-
var findMergeBase = context.Repository.ObjectDatabase.FindMergeBase(mc.Parents.First(), mergedHead);
97-
var filter = new CommitFilter
98-
{
99-
IncludeReachableFrom = mergedHead,
100-
ExcludeReachableFrom = findMergeBase
101-
};
102-
var mergedCommits = context.Repository.Commits.QueryBy(filter).ToList();
103-
return new
94+
IncludeReachableFrom = context.CurrentBranch,
95+
ExcludeReachableFrom = baseVersion.BaseVersionSource,
96+
SortBy = CommitSortStrategies.Reverse
97+
}).ToList();
98+
var mergeCommits = commitLog
99+
.Where(l => l.Parents.Count() > 1)
100+
.ToList();
101+
102+
Logger.WriteInfo(string.Format("Found {0} merge commits to evaluate increments for..", mergeCommits.Count));
103+
104+
var mainlineVersion = mergeCommits
105+
.Select(mc =>
104106
{
105-
MergeCommit = mc,
106-
MergeHead = mergedHead,
107-
MergeBase = findMergeBase,
108-
Increment = IncrementStrategyFinder.GetIncrementForCommits(context, mergedCommits)
109-
};
110-
})
111-
.Aggregate(baseVersion.SemanticVersion, (v, i) => v.IncrementVersion(i.Increment ?? VersionField.Patch));
107+
var mergedHead = GetMergedHead(mc);
108+
var findMergeBase = context.Repository.ObjectDatabase.FindMergeBase(mc.Parents.First(), mergedHead);
109+
return FindMessageIncrement(context, mergedHead, findMergeBase);
110+
})
111+
.Aggregate(baseVersion.SemanticVersion, (v, i) => v.IncrementVersion(i));
112+
113+
if (context.CurrentBranch.FriendlyName != "master")
114+
{
115+
var mergedHead = context.CurrentCommit;
116+
var findMergeBase = context.Repository.FindBranch("master").Tip;
117+
var branchIncrement = FindMessageIncrement(context, mergedHead, findMergeBase);
118+
Logger.WriteInfo(string.Format("Performing {0} increment for current branch ", branchIncrement));
119+
mainlineVersion = mainlineVersion.IncrementVersion(branchIncrement);
120+
}
121+
return mainlineVersion;
122+
}
123+
}
124+
125+
private static VersionField FindMessageIncrement(GitVersionContext context, Commit mergedHead, Commit findMergeBase)
126+
{
127+
var filter = new CommitFilter
128+
{
129+
IncludeReachableFrom = mergedHead,
130+
ExcludeReachableFrom = findMergeBase
131+
};
132+
var commits = context.Repository.Commits.QueryBy(filter).ToList();
133+
return IncrementStrategyFinder.GetIncrementForCommits(context, commits) ?? VersionField.Patch;
112134
}
113135

114136
private Commit GetMergedHead(Commit mergeCommit)

0 commit comments

Comments
 (0)