Skip to content

Commit 7f147ed

Browse files
authored
Merge pull request #3973 from HHobeck/feature/refactoring-base-version
[Improvement] Refator BaseVersionV2 into BaseVersion
2 parents e88a625 + f835dfc commit 7f147ed

File tree

64 files changed

+918
-678
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

64 files changed

+918
-678
lines changed

docs/input/docs/reference/configuration.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ merge-message-formats: {}
6363
update-build-number: true
6464
semantic-version-format: Strict
6565
strategies:
66+
- Fallback
6667
- ConfiguredNextVersion
6768
- MergeMessage
6869
- TaggedCommit
@@ -228,6 +229,7 @@ merge-message-formats: {}
228229
update-build-number: true
229230
semantic-version-format: Strict
230231
strategies:
232+
- Fallback
231233
- ConfiguredNextVersion
232234
- MergeMessage
233235
- TaggedCommit
@@ -917,6 +919,7 @@ Example of invalid `Strict`, but valid `Loose`
917919
### strategies
918920
919921
Specifies which version strategy implementation (one ore more) will be used to determine the next version. Following values are supported and can be combined:
922+
- Fallback
920923
- ConfiguredNextVersion
921924
- MergeMessage
922925
- TaggedCommit

src/GitVersion.Configuration.Tests/Configuration/ConfigurationExtensionsTests.cs

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -6,21 +6,6 @@ namespace GitVersion.Core.Tests.Configuration;
66
[TestFixture]
77
public class ConfigurationExtensionsTests : TestBase
88
{
9-
[Test]
10-
public void GetReleaseBranchConfigReturnsAllReleaseBranches()
11-
{
12-
var configuration = EmptyConfigurationBuilder.New
13-
.WithBranch("foo", _ => _.WithRegularExpression("foo"))
14-
.WithBranch("bar", _ => _.WithRegularExpression("bar").WithIsReleaseBranch(true))
15-
.WithBranch("baz", _ => _.WithRegularExpression("baz").WithIsReleaseBranch(true))
16-
.Build();
17-
18-
var result = configuration.GetReleaseBranchConfiguration();
19-
20-
result.Count.ShouldBe(2);
21-
result.ShouldNotContain(b => b.Key == "foo");
22-
}
23-
249
[TestCase("release/2.0.0",
2510
"refs/heads/release/2.0.0", "release/2.0.0", "release/2.0.0",
2611
true, false, false, false, true)]

src/GitVersion.Configuration.Tests/Configuration/ConfigurationProviderTests.CanWriteOutEffectiveConfiguration.approved.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ merge-message-formats: {}
1212
update-build-number: true
1313
semantic-version-format: Strict
1414
strategies:
15+
- Fallback
1516
- ConfiguredNextVersion
1617
- MergeMessage
1718
- TaggedCommit

src/GitVersion.Configuration/ConfigurationBuilderBase.cs

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ internal abstract class ConfigurationBuilderBase<TConfigurationBuilder> : IConfi
2424
private string? commitDateFormat;
2525
private bool updateBuildNumber;
2626
private SemanticVersionFormat semanticVersionFormat;
27-
private VersionStrategies versionStrategy;
27+
private VersionStrategies[] versionStrategies;
2828
private Dictionary<string, string> mergeMessageFormats = new();
2929
private readonly List<IReadOnlyDictionary<object, object?>> overrides = new();
3030
private readonly Dictionary<string, BranchConfigurationBuilder> branchConfigurationBuilders = new();
@@ -204,7 +204,15 @@ public virtual TConfigurationBuilder WithSemanticVersionFormat(SemanticVersionFo
204204

205205
public virtual TConfigurationBuilder WithVersionStrategy(VersionStrategies value)
206206
{
207-
this.versionStrategy = value;
207+
this.versionStrategies = Enum.GetValues<VersionStrategies>()
208+
.Where(element => element != VersionStrategies.None && value.HasFlag(element))
209+
.ToArray();
210+
return (TConfigurationBuilder)this;
211+
}
212+
213+
public virtual TConfigurationBuilder WithVersionStrategies(params VersionStrategies[] values)
214+
{
215+
this.versionStrategies = values;
208216
return (TConfigurationBuilder)this;
209217
}
210218

@@ -382,10 +390,6 @@ public virtual IGitVersionConfiguration Build()
382390
branches.Add(name, (BranchConfiguration)branchConfigurationBuilder.Build());
383391
}
384392

385-
var versionStrategies = Enum.GetValues<VersionStrategies>()
386-
.Where(element => element != VersionStrategies.None && this.versionStrategy.HasFlag(element))
387-
.ToArray();
388-
389393
IGitVersionConfiguration configuration = new GitVersionConfiguration
390394
{
391395
AssemblyVersioningScheme = this.assemblyVersioningScheme,

src/GitVersion.Configuration/SupportedWorkflows/GitFlow/v1.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ merge-message-formats: {}
1212
update-build-number: true
1313
semantic-version-format: Strict
1414
strategies:
15+
- Fallback
1516
- ConfiguredNextVersion
1617
- MergeMessage
1718
- TaggedCommit

src/GitVersion.Configuration/SupportedWorkflows/GitHubFlow/v1.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ merge-message-formats: {}
1212
update-build-number: true
1313
semantic-version-format: Strict
1414
strategies:
15+
- Fallback
1516
- ConfiguredNextVersion
1617
- MergeMessage
1718
- TaggedCommit
Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
using GitVersion.Configuration;
2+
using GitVersion.Core.Tests.Helpers;
3+
using GitVersion.VersionCalculation;
4+
5+
namespace GitVersion.Core.Tests.IntegrationTests;
6+
7+
[TestFixture]
8+
public class FallbackVersionStrategyScenarios : TestBase
9+
{
10+
private static GitHubFlowConfigurationBuilder ConfigurationBuilder => GitHubFlowConfigurationBuilder.New
11+
.WithVersionStrategy(VersionStrategies.Fallback)
12+
.WithBranch("main", _ => _.WithDeploymentMode(DeploymentMode.ManualDeployment));
13+
14+
[TestCase(IncrementStrategy.None, "0.0.0-1+1")]
15+
[TestCase(IncrementStrategy.Patch, "0.0.1-1+1")]
16+
[TestCase(IncrementStrategy.Minor, "0.1.0-1+1")]
17+
[TestCase(IncrementStrategy.Major, "1.0.0-1+1")]
18+
public void EnsureVersionIncrementOnMainWillBeUsed(IncrementStrategy increment, string expected)
19+
{
20+
var configuration = ConfigurationBuilder
21+
.WithBranch("main", _ => _.WithIncrement(increment))
22+
.Build();
23+
24+
using EmptyRepositoryFixture fixture = new("main");
25+
26+
fixture.MakeACommit();
27+
28+
// ✅ succeeds as expected
29+
fixture.AssertFullSemver(expected, configuration);
30+
}
31+
32+
[TestCase(IncrementStrategy.None, "0.0.0-1+1")]
33+
[TestCase(IncrementStrategy.Patch, "0.0.1-1+1")]
34+
[TestCase(IncrementStrategy.Minor, "0.1.0-1+1")]
35+
[TestCase(IncrementStrategy.Major, "1.0.0-1+1")]
36+
public void EnsureVersionIncrementOnMessageWillBeUsed(IncrementStrategy increment, string expected)
37+
{
38+
var configuration = ConfigurationBuilder
39+
.WithBranch("main", _ => _.WithIncrement(IncrementStrategy.None))
40+
.Build();
41+
42+
using EmptyRepositoryFixture fixture = new("main");
43+
44+
fixture.MakeACommit($"+semver: {increment}");
45+
46+
// ✅ succeeds as expected
47+
fixture.AssertFullSemver(expected, configuration);
48+
}
49+
50+
[TestCase(false)]
51+
[TestCase(true)]
52+
public void TakeTheLatestCommitAsBaseVersion(bool mode)
53+
{
54+
var configuration = ConfigurationBuilder
55+
.WithBranch("main", _ => _
56+
.WithIncrement(IncrementStrategy.Major)
57+
.WithTrackMergeTarget(true)
58+
.WithTracksReleaseBranches(false)
59+
).Build();
60+
61+
using EmptyRepositoryFixture fixture = new("main");
62+
63+
fixture.MakeACommit("A");
64+
fixture.BranchTo("release/foo");
65+
fixture.Checkout("main");
66+
67+
fixture.MakeACommit("B");
68+
if (mode)
69+
{
70+
fixture.MergeTo("release/foo");
71+
fixture.ApplyTag("0.0.0");
72+
fixture.Checkout("main");
73+
}
74+
else
75+
{
76+
fixture.ApplyTag("0.0.0");
77+
}
78+
79+
fixture.MakeACommit("C");
80+
if (mode)
81+
{
82+
fixture.ApplyTag("0.0.1");
83+
}
84+
else
85+
{
86+
fixture.MergeTo("release/foo");
87+
fixture.ApplyTag("0.0.1");
88+
fixture.Checkout("main");
89+
}
90+
91+
fixture.MakeACommit("D");
92+
93+
// ✅ succeeds as expected
94+
fixture.AssertFullSemver("1.0.0-1+1", configuration);
95+
}
96+
97+
[Test]
98+
public void TakeTheCommitBranchedFromAsBaseVersion()
99+
{
100+
var configuration = ConfigurationBuilder
101+
.WithBranch("main", _ => _
102+
.WithIncrement(IncrementStrategy.Major)
103+
.WithTrackMergeTarget(false)
104+
.WithTracksReleaseBranches(true)
105+
).Build();
106+
107+
using EmptyRepositoryFixture fixture = new("main");
108+
109+
fixture.MakeACommit("A");
110+
fixture.MakeACommit("B");
111+
fixture.BranchTo("release/foo");
112+
fixture.Checkout("main");
113+
fixture.MakeACommit("C");
114+
fixture.Checkout("release/foo");
115+
fixture.MakeACommit("D");
116+
fixture.ApplyTag("0.0.0");
117+
fixture.Checkout("main");
118+
fixture.MakeACommit("D");
119+
120+
// ✅ succeeds as expected
121+
fixture.AssertFullSemver("1.0.0-1+2", configuration);
122+
123+
fixture.Repository.DumpGraph();
124+
}
125+
}

src/GitVersion.Core.Tests/IntegrationTests/OtherScenarios.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1053,7 +1053,7 @@ public void EnsureThePreReleaseTagIsCorrectlyGeneratedWhenPreReleaseLabelIsEmpty
10531053
}
10541054

10551055
[TestCase("0.0.1-alpha.2", true, "0.0.1-alpha.2")]
1056-
[TestCase("0.0.1-alpha.2", false, "0.0.1-alpha.3+0")]
1056+
[TestCase("0.0.1-alpha.2", false, "0.1.0-alpha.1+0")]
10571057
[TestCase("0.0.1", true, "0.0.1")]
10581058
[TestCase("0.0.1", false, "0.1.0-alpha.1+0")]
10591059
[TestCase("0.0.1-beta.2", true, "0.1.0-alpha.1+1")]
@@ -1080,7 +1080,7 @@ public void EnsurePreventIncrementWhenCurrentCommitTaggedOnDevelopWithDeployment
10801080
}
10811081

10821082
[TestCase("0.0.1-alpha.2", true, "0.0.1-alpha.2")]
1083-
[TestCase("0.0.1-alpha.2", false, "0.0.1-alpha.2")]
1083+
[TestCase("0.0.1-alpha.2", false, "0.1.0-alpha.0")]
10841084
[TestCase("0.0.1", true, "0.0.1")]
10851085
[TestCase("0.0.1", false, "0.1.0-alpha.0")]
10861086
[TestCase("0.0.1-beta.2", true, "0.1.0-alpha.1")]
@@ -1107,7 +1107,7 @@ public void EnsurePreventIncrementWhenCurrentCommitTaggedOnDevelopWithDeployment
11071107
}
11081108

11091109
[TestCase("0.0.1-alpha.2", true, "0.0.1")]
1110-
[TestCase("0.0.1-alpha.2", false, "0.0.1")]
1110+
[TestCase("0.0.1-alpha.2", false, "0.1.0")]
11111111
[TestCase("0.0.1", true, "0.0.1")]
11121112
[TestCase("0.0.1", false, "0.1.0")]
11131113
[TestCase("0.0.1-beta.2", true, "0.1.0")]

src/GitVersion.Core.Tests/VersionCalculation/MinDateVersionFilterTests.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,14 @@ public void VerifyNullGuard()
1212
var dummy = DateTimeOffset.UtcNow.AddSeconds(1.0);
1313
var sut = new MinDateVersionFilter(dummy);
1414

15-
Should.Throw<ArgumentNullException>(() => sut.Exclude(null, out _));
15+
Should.Throw<ArgumentNullException>(() => sut.Exclude(null!, out _));
1616
}
1717

1818
[Test]
1919
public void WhenCommitShouldExcludeWithReason()
2020
{
2121
var commit = GitToolsTestingExtensions.CreateMockCommit();
22-
var version = new BaseVersion("dummy", false, new(1), commit, string.Empty);
22+
BaseVersion version = new("dummy", new SemanticVersion(1), commit);
2323
var futureDate = DateTimeOffset.UtcNow.AddYears(1);
2424
var sut = new MinDateVersionFilter(futureDate);
2525

@@ -31,7 +31,7 @@ public void WhenCommitShouldExcludeWithReason()
3131
public void WhenShaMismatchShouldNotExclude()
3232
{
3333
var commit = GitToolsTestingExtensions.CreateMockCommit();
34-
var version = new BaseVersion("dummy", false, new(1), commit, string.Empty);
34+
BaseVersion version = new("dummy", new SemanticVersion(1), commit);
3535
var pastDate = DateTimeOffset.UtcNow.AddYears(-1);
3636
var sut = new MinDateVersionFilter(pastDate);
3737

@@ -42,7 +42,7 @@ public void WhenShaMismatchShouldNotExclude()
4242
[Test]
4343
public void ExcludeShouldAcceptVersionWithNullCommit()
4444
{
45-
var version = new BaseVersion("dummy", false, new(1), null, string.Empty);
45+
BaseVersion version = new("dummy", new SemanticVersion(1), null);
4646
var futureDate = DateTimeOffset.UtcNow.AddYears(1);
4747
var sut = new MinDateVersionFilter(futureDate);
4848

src/GitVersion.Core.Tests/VersionCalculation/ShaVersionFilterTests.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,19 +7,19 @@ namespace GitVersion.Core.Tests;
77
public class ShaVersionFilterTests : TestBase
88
{
99
[Test]
10-
public void VerifyNullGuard2()
10+
public void VerifyNullGuard()
1111
{
1212
var commit = GitToolsTestingExtensions.CreateMockCommit();
1313
var sut = new ShaVersionFilter(new[] { commit.Sha });
1414

15-
Should.Throw<ArgumentNullException>(() => sut.Exclude(null, out _));
15+
Should.Throw<ArgumentNullException>(() => sut.Exclude(null!, out _));
1616
}
1717

1818
[Test]
1919
public void WhenShaMatchShouldExcludeWithReason()
2020
{
2121
var commit = GitToolsTestingExtensions.CreateMockCommit();
22-
var version = new BaseVersion("dummy", false, new(1), commit, string.Empty);
22+
BaseVersion version = new("dummy", new SemanticVersion(1), commit);
2323
var sut = new ShaVersionFilter(new[] { commit.Sha });
2424

2525
sut.Exclude(version, out var reason).ShouldBeTrue();
@@ -30,7 +30,7 @@ public void WhenShaMatchShouldExcludeWithReason()
3030
public void WhenShaMismatchShouldNotExclude()
3131
{
3232
var commit = GitToolsTestingExtensions.CreateMockCommit();
33-
var version = new BaseVersion("dummy", false, new(1), commit, string.Empty);
33+
BaseVersion version = new("dummy", new SemanticVersion(1), commit);
3434
var sut = new ShaVersionFilter(["mismatched"]);
3535

3636
sut.Exclude(version, out var reason).ShouldBeFalse();
@@ -40,7 +40,7 @@ public void WhenShaMismatchShouldNotExclude()
4040
[Test]
4141
public void ExcludeShouldAcceptVersionWithNullCommit()
4242
{
43-
var version = new BaseVersion("dummy", false, new(1), null, string.Empty);
43+
BaseVersion version = new("dummy", new SemanticVersion(1));
4444
var sut = new ShaVersionFilter(["mismatched"]);
4545

4646
sut.Exclude(version, out var reason).ShouldBeFalse();

0 commit comments

Comments
 (0)