Skip to content

Commit 8f8cca1

Browse files
authored
Merge pull request #2480 from andyfurniss4/feature/features-in-mainline
Allow use of features and hotfixes with mainline mode
2 parents 68db413 + 839b6ec commit 8f8cca1

File tree

3 files changed

+138
-0
lines changed

3 files changed

+138
-0
lines changed

src/GitVersionCore.Tests/VersionCalculation/BaseVersionCalculatorTests.cs

+39
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,45 @@ public void ShouldFilterVersion()
133133
baseVersion.SemanticVersion.ShouldBe(lowerVersion.SemanticVersion);
134134
}
135135

136+
[Test]
137+
public void ShouldIgnorePreReleaseVersionInMainlineMode()
138+
{
139+
var fakeIgnoreConfig = new TestIgnoreConfig(new ExcludeSourcesContainingExclude());
140+
141+
var lowerVersion = new BaseVersion("dummy", false, new SemanticVersion(1), new MockCommit(), null);
142+
var preReleaseVersion = new BaseVersion(
143+
"prerelease",
144+
false,
145+
new SemanticVersion(1, 0, 1)
146+
{
147+
PreReleaseTag = new SemanticVersionPreReleaseTag
148+
{
149+
Name = "alpha",
150+
Number = 1
151+
}
152+
},
153+
new MockCommit(),
154+
null
155+
);
156+
157+
var versionCalculator = GetBaseVersionCalculator(contextBuilder =>
158+
{
159+
contextBuilder
160+
.WithConfig(new Config { VersioningMode = VersioningMode.Mainline, Ignore = fakeIgnoreConfig })
161+
.OverrideServices(services =>
162+
{
163+
services.RemoveAll<IVersionStrategy>();
164+
services.AddSingleton<IVersionStrategy>(new TestVersionStrategy(preReleaseVersion, lowerVersion));
165+
});
166+
});
167+
var baseVersion = versionCalculator.GetBaseVersion();
168+
169+
baseVersion.Source.ShouldNotBe(preReleaseVersion.Source);
170+
baseVersion.SemanticVersion.ShouldNotBe(preReleaseVersion.SemanticVersion);
171+
baseVersion.Source.ShouldBe(lowerVersion.Source);
172+
baseVersion.SemanticVersion.ShouldBe(lowerVersion.SemanticVersion);
173+
}
174+
136175
private static IBaseVersionCalculator GetBaseVersionCalculator(Action<GitVersionContextBuilder> contextBuilderAction)
137176
{
138177
var contextBuilder = new GitVersionContextBuilder();

src/GitVersionCore.Tests/VersionCalculation/NextVersionCalculatorTests.cs

+91
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,97 @@ public void MergeIntoMainline()
154154
fixture.AssertFullSemver("1.0.0", config);
155155
}
156156

157+
[Test]
158+
public void MergeFeatureIntoMainline()
159+
{
160+
var config = new Config
161+
{
162+
VersioningMode = VersioningMode.Mainline
163+
};
164+
165+
using var fixture = new EmptyRepositoryFixture();
166+
fixture.MakeACommit();
167+
fixture.ApplyTag("1.0.0");
168+
fixture.AssertFullSemver("1.0.0", config);
169+
170+
fixture.BranchTo("feature/foo");
171+
fixture.MakeACommit();
172+
fixture.AssertFullSemver("1.0.1-foo.1", config);
173+
fixture.ApplyTag("1.0.1-foo.1");
174+
175+
fixture.Checkout("master");
176+
fixture.MergeNoFF("feature/foo");
177+
fixture.AssertFullSemver("1.0.1", config);
178+
}
179+
180+
[Test]
181+
public void MergeFeatureIntoMainlineWithMinorIncrement()
182+
{
183+
var config = new Config
184+
{
185+
VersioningMode = VersioningMode.Mainline,
186+
Branches = new Dictionary<string, BranchConfig>()
187+
{
188+
{ "feature", new BranchConfig { Increment = IncrementStrategy.Minor } }
189+
},
190+
Ignore = new IgnoreConfig() { ShAs = new List<string>() },
191+
MergeMessageFormats = new Dictionary<string, string>()
192+
};
193+
194+
using var fixture = new EmptyRepositoryFixture();
195+
fixture.MakeACommit();
196+
fixture.ApplyTag("1.0.0");
197+
fixture.AssertFullSemver("1.0.0", config);
198+
199+
fixture.BranchTo("feature/foo");
200+
fixture.MakeACommit();
201+
fixture.AssertFullSemver("1.1.0-foo.1", config);
202+
fixture.ApplyTag("1.1.0-foo.1");
203+
204+
fixture.Checkout("master");
205+
fixture.MergeNoFF("feature/foo");
206+
fixture.AssertFullSemver("1.1.0", config);
207+
}
208+
209+
[Test]
210+
public void MergeFeatureIntoMainlineWithMinorIncrementAndThenMergeHotfix()
211+
{
212+
var config = new Config
213+
{
214+
VersioningMode = VersioningMode.Mainline,
215+
Branches = new Dictionary<string, BranchConfig>()
216+
{
217+
{ "feature", new BranchConfig { Increment = IncrementStrategy.Minor } }
218+
},
219+
Ignore = new IgnoreConfig() { ShAs = new List<string>() },
220+
MergeMessageFormats = new Dictionary<string, string>()
221+
};
222+
223+
using var fixture = new EmptyRepositoryFixture();
224+
fixture.MakeACommit();
225+
fixture.ApplyTag("1.0.0");
226+
fixture.AssertFullSemver("1.0.0", config);
227+
228+
fixture.BranchTo("feature/foo");
229+
fixture.MakeACommit();
230+
fixture.AssertFullSemver("1.1.0-foo.1", config);
231+
fixture.ApplyTag("1.1.0-foo.1");
232+
233+
fixture.Checkout("master");
234+
fixture.MergeNoFF("feature/foo");
235+
fixture.AssertFullSemver("1.1.0", config);
236+
fixture.ApplyTag("1.1.0");
237+
238+
fixture.BranchTo("hotfix/bar");
239+
fixture.MakeACommit();
240+
fixture.AssertFullSemver("1.1.1-beta.1", config);
241+
fixture.ApplyTag("1.1.1-beta.1");
242+
243+
fixture.Checkout("master");
244+
fixture.MergeNoFF("hotfix/bar");
245+
fixture.AssertFullSemver("1.1.1", config);
246+
}
247+
157248
[Test]
158249
public void PreReleaseTagCanUseBranchNameVariable()
159250
{

src/GitVersionCore/VersionCalculation/BaseVersionCalculator.cs

+8
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,14 @@ public BaseVersion GetBaseVersion()
6060
.ToList();
6161

6262
FixTheBaseVersionSourceOfMergeMessageStrategyIfReleaseBranchWasMergedAndDeleted(baseVersions);
63+
64+
if (context.Configuration.VersioningMode == VersioningMode.Mainline)
65+
{
66+
baseVersions = baseVersions
67+
.Where(b => !b.IncrementedVersion.PreReleaseTag.HasTag())
68+
.ToList();
69+
}
70+
6371
var maxVersion = baseVersions.Aggregate((v1, v2) => v1.IncrementedVersion > v2.IncrementedVersion ? v1 : v2);
6472
var matchingVersionsOnceIncremented = baseVersions
6573
.Where(b => b.Version.BaseVersionSource != null && b.IncrementedVersion == maxVersion.IncrementedVersion)

0 commit comments

Comments
 (0)