Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Improvement] Refator BaseVersionV2 into BaseVersion #3973

Merged
merged 6 commits into from
Mar 21, 2024
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions docs/input/docs/reference/configuration.md
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,7 @@ merge-message-formats: {}
update-build-number: true
semantic-version-format: Strict
strategies:
- Fallback
- ConfiguredNextVersion
- MergeMessage
- TaggedCommit
Expand Down Expand Up @@ -228,6 +229,7 @@ merge-message-formats: {}
update-build-number: true
semantic-version-format: Strict
strategies:
- Fallback
- ConfiguredNextVersion
- MergeMessage
- TaggedCommit
Expand Down Expand Up @@ -917,6 +919,7 @@ Example of invalid `Strict`, but valid `Loose`
### strategies

Specifies which version strategy implementation (one ore more) will be used to determine the next version. Following values are supported and can be combined:
- Fallback
- ConfiguredNextVersion
- MergeMessage
- TaggedCommit
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,21 +6,6 @@ namespace GitVersion.Core.Tests.Configuration;
[TestFixture]
public class ConfigurationExtensionsTests : TestBase
{
[Test]
public void GetReleaseBranchConfigReturnsAllReleaseBranches()
{
var configuration = EmptyConfigurationBuilder.New
.WithBranch("foo", _ => _.WithRegularExpression("foo"))
.WithBranch("bar", _ => _.WithRegularExpression("bar").WithIsReleaseBranch(true))
.WithBranch("baz", _ => _.WithRegularExpression("baz").WithIsReleaseBranch(true))
.Build();

var result = configuration.GetReleaseBranchConfiguration();

result.Count.ShouldBe(2);
result.ShouldNotContain(b => b.Key == "foo");
}

[TestCase("release/2.0.0",
"refs/heads/release/2.0.0", "release/2.0.0", "release/2.0.0",
true, false, false, false, true)]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ merge-message-formats: {}
update-build-number: true
semantic-version-format: Strict
strategies:
- Fallback
- ConfiguredNextVersion
- MergeMessage
- TaggedCommit
Expand Down
16 changes: 10 additions & 6 deletions src/GitVersion.Configuration/ConfigurationBuilderBase.cs
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ internal abstract class ConfigurationBuilderBase<TConfigurationBuilder> : IConfi
private string? commitDateFormat;
private bool updateBuildNumber;
private SemanticVersionFormat semanticVersionFormat;
private VersionStrategies versionStrategy;
private VersionStrategies[] versionStrategies;
private Dictionary<string, string> mergeMessageFormats = new();
private readonly List<IReadOnlyDictionary<object, object?>> overrides = new();
private readonly Dictionary<string, BranchConfigurationBuilder> branchConfigurationBuilders = new();
Expand Down Expand Up @@ -204,7 +204,15 @@ public virtual TConfigurationBuilder WithSemanticVersionFormat(SemanticVersionFo

public virtual TConfigurationBuilder WithVersionStrategy(VersionStrategies value)
{
this.versionStrategy = value;
this.versionStrategies = Enum.GetValues<VersionStrategies>()
.Where(element => element != VersionStrategies.None && value.HasFlag(element))
.ToArray();
return (TConfigurationBuilder)this;
}

public virtual TConfigurationBuilder WithVersionStrategies(params VersionStrategies[] values)
{
this.versionStrategies = values;
return (TConfigurationBuilder)this;
}

Expand Down Expand Up @@ -382,10 +390,6 @@ public virtual IGitVersionConfiguration Build()
branches.Add(name, (BranchConfiguration)branchConfigurationBuilder.Build());
}

var versionStrategies = Enum.GetValues<VersionStrategies>()
.Where(element => element != VersionStrategies.None && this.versionStrategy.HasFlag(element))
.ToArray();

IGitVersionConfiguration configuration = new GitVersionConfiguration
{
AssemblyVersioningScheme = this.assemblyVersioningScheme,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ merge-message-formats: {}
update-build-number: true
semantic-version-format: Strict
strategies:
- Fallback
- ConfiguredNextVersion
- MergeMessage
- TaggedCommit
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ merge-message-formats: {}
update-build-number: true
semantic-version-format: Strict
strategies:
- Fallback
- ConfiguredNextVersion
- MergeMessage
- TaggedCommit
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,125 @@
using GitVersion.Configuration;
using GitVersion.Core.Tests.Helpers;
using GitVersion.VersionCalculation;

namespace GitVersion.Core.Tests.IntegrationTests;

[TestFixture]
public class FallbackVersionStrategyScenarios : TestBase
{
private static GitHubFlowConfigurationBuilder ConfigurationBuilder => GitHubFlowConfigurationBuilder.New
.WithVersionStrategy(VersionStrategies.Fallback)
.WithBranch("main", _ => _.WithDeploymentMode(DeploymentMode.ManualDeployment));

[TestCase(IncrementStrategy.None, "0.0.0-1+1")]
[TestCase(IncrementStrategy.Patch, "0.0.1-1+1")]
[TestCase(IncrementStrategy.Minor, "0.1.0-1+1")]
[TestCase(IncrementStrategy.Major, "1.0.0-1+1")]
public void EnsureVersionIncrementOnMainWillBeUsed(IncrementStrategy increment, string expected)
{
var configuration = ConfigurationBuilder
.WithBranch("main", _ => _.WithIncrement(increment))
.Build();

using EmptyRepositoryFixture fixture = new("main");

fixture.MakeACommit();

// ✅ succeeds as expected
fixture.AssertFullSemver(expected, configuration);
}

[TestCase(IncrementStrategy.None, "0.0.0-1+1")]
[TestCase(IncrementStrategy.Patch, "0.0.1-1+1")]
[TestCase(IncrementStrategy.Minor, "0.1.0-1+1")]
[TestCase(IncrementStrategy.Major, "1.0.0-1+1")]
public void EnsureVersionIncrementOnMessageWillBeUsed(IncrementStrategy increment, string expected)
{
var configuration = ConfigurationBuilder
.WithBranch("main", _ => _.WithIncrement(IncrementStrategy.None))
.Build();

using EmptyRepositoryFixture fixture = new("main");

fixture.MakeACommit($"+semver: {increment}");

// ✅ succeeds as expected
fixture.AssertFullSemver(expected, configuration);
}

[TestCase(false)]
[TestCase(true)]
public void TakeTheLatestCommitAsBaseVersion(bool mode)
{
var configuration = ConfigurationBuilder
.WithBranch("main", _ => _
.WithIncrement(IncrementStrategy.Major)
.WithTrackMergeTarget(true)
.WithTracksReleaseBranches(false)
).Build();

using EmptyRepositoryFixture fixture = new("main");

fixture.MakeACommit("A");
fixture.BranchTo("release/foo");
fixture.Checkout("main");

fixture.MakeACommit("B");
if (mode)
{
fixture.MergeTo("release/foo");
fixture.ApplyTag("0.0.0");
fixture.Checkout("main");
}
else
{
fixture.ApplyTag("0.0.0");
}

fixture.MakeACommit("C");
if (mode)
{
fixture.ApplyTag("0.0.1");
}
else
{
fixture.MergeTo("release/foo");
fixture.ApplyTag("0.0.1");
fixture.Checkout("main");
}

fixture.MakeACommit("D");

// ✅ succeeds as expected
fixture.AssertFullSemver("1.0.0-1+1", configuration);
}

[Test]
public void TakeTheCommitBranchedFromAsBaseVersion()
{
var configuration = ConfigurationBuilder
.WithBranch("main", _ => _
.WithIncrement(IncrementStrategy.Major)
.WithTrackMergeTarget(false)
.WithTracksReleaseBranches(true)
).Build();

using EmptyRepositoryFixture fixture = new("main");

fixture.MakeACommit("A");
fixture.MakeACommit("B");
fixture.BranchTo("release/foo");
fixture.Checkout("main");
fixture.MakeACommit("C");
fixture.Checkout("release/foo");
fixture.MakeACommit("D");
fixture.ApplyTag("0.0.0");
fixture.Checkout("main");
fixture.MakeACommit("D");

// ✅ succeeds as expected
fixture.AssertFullSemver("1.0.0-1+2", configuration);

fixture.Repository.DumpGraph();
}
}
6 changes: 3 additions & 3 deletions src/GitVersion.Core.Tests/IntegrationTests/OtherScenarios.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1053,7 +1053,7 @@ public void EnsureThePreReleaseTagIsCorrectlyGeneratedWhenPreReleaseLabelIsEmpty
}

[TestCase("0.0.1-alpha.2", true, "0.0.1-alpha.2")]
[TestCase("0.0.1-alpha.2", false, "0.0.1-alpha.3+0")]
[TestCase("0.0.1-alpha.2", false, "0.1.0-alpha.1+0")]
[TestCase("0.0.1", true, "0.0.1")]
[TestCase("0.0.1", false, "0.1.0-alpha.1+0")]
[TestCase("0.0.1-beta.2", true, "0.1.0-alpha.1+1")]
Expand All @@ -1080,7 +1080,7 @@ public void EnsurePreventIncrementWhenCurrentCommitTaggedOnDevelopWithDeployment
}

[TestCase("0.0.1-alpha.2", true, "0.0.1-alpha.2")]
[TestCase("0.0.1-alpha.2", false, "0.0.1-alpha.2")]
[TestCase("0.0.1-alpha.2", false, "0.1.0-alpha.0")]
[TestCase("0.0.1", true, "0.0.1")]
[TestCase("0.0.1", false, "0.1.0-alpha.0")]
[TestCase("0.0.1-beta.2", true, "0.1.0-alpha.1")]
Expand All @@ -1107,7 +1107,7 @@ public void EnsurePreventIncrementWhenCurrentCommitTaggedOnDevelopWithDeployment
}

[TestCase("0.0.1-alpha.2", true, "0.0.1")]
[TestCase("0.0.1-alpha.2", false, "0.0.1")]
[TestCase("0.0.1-alpha.2", false, "0.1.0")]
[TestCase("0.0.1", true, "0.0.1")]
[TestCase("0.0.1", false, "0.1.0")]
[TestCase("0.0.1-beta.2", true, "0.1.0")]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,14 +12,14 @@ public void VerifyNullGuard()
var dummy = DateTimeOffset.UtcNow.AddSeconds(1.0);
var sut = new MinDateVersionFilter(dummy);

Should.Throw<ArgumentNullException>(() => sut.Exclude(null, out _));
Should.Throw<ArgumentNullException>(() => sut.Exclude(null!, out _));
}

[Test]
public void WhenCommitShouldExcludeWithReason()
{
var commit = GitToolsTestingExtensions.CreateMockCommit();
var version = new BaseVersion("dummy", false, new(1), commit, string.Empty);
BaseVersion version = new("dummy", new SemanticVersion(1), commit);
var futureDate = DateTimeOffset.UtcNow.AddYears(1);
var sut = new MinDateVersionFilter(futureDate);

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

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

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,19 +7,19 @@ namespace GitVersion.Core.Tests;
public class ShaVersionFilterTests : TestBase
{
[Test]
public void VerifyNullGuard2()
public void VerifyNullGuard()
{
var commit = GitToolsTestingExtensions.CreateMockCommit();
var sut = new ShaVersionFilter(new[] { commit.Sha });

Should.Throw<ArgumentNullException>(() => sut.Exclude(null, out _));
Should.Throw<ArgumentNullException>(() => sut.Exclude(null!, out _));
}

[Test]
public void WhenShaMatchShouldExcludeWithReason()
{
var commit = GitToolsTestingExtensions.CreateMockCommit();
var version = new BaseVersion("dummy", false, new(1), commit, string.Empty);
BaseVersion version = new("dummy", new SemanticVersion(1), commit);
var sut = new ShaVersionFilter(new[] { commit.Sha });

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

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

sut.Exclude(version, out var reason).ShouldBeFalse();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,15 @@ public void ReturnsNullWhenNoNextVersionIsInConfig()
baseVersion.ShouldBe(null);
}

[TestCase("1.0.0", "1.0.0", SemanticVersionFormat.Strict)]
[TestCase("1.0.0", "1.0.0", SemanticVersionFormat.Loose)]
[TestCase("2.12.654651698", "2.12.654651698", SemanticVersionFormat.Strict)]
[TestCase("2.12.654651698", "2.12.654651698", SemanticVersionFormat.Loose)]
[TestCase("0.1", "0.1.0", SemanticVersionFormat.Loose)]
public void ConfiguredNextVersionTest(string nextVersion, string expectedVersion, SemanticVersionFormat versionFormat)
[TestCase("1.0.0", "1.0.0", SemanticVersionFormat.Strict, "1.0.0-1")]
[TestCase("1.0.0", "1.0.0", SemanticVersionFormat.Loose, "1.0.0-1")]
[TestCase("2.12.654651698", "2.12.654651698", SemanticVersionFormat.Strict, "2.12.654651698-1")]
[TestCase("2.12.654651698", "2.12.654651698", SemanticVersionFormat.Loose, "2.12.654651698-1")]
[TestCase("0.1", "0.1.0", SemanticVersionFormat.Loose, "0.1.0-1")]
[TestCase("1.0.0-alpha.1", null, SemanticVersionFormat.Strict, null)]
[TestCase("1.0.0-2", "1.0.0-2", SemanticVersionFormat.Strict, "1.0.0-2")]
public void ConfiguredNextVersionTest(
string nextVersion, string? semanticVersion, SemanticVersionFormat versionFormat, string? incrementedVersion)
{
var overrideConfiguration = new Dictionary<object, object?>
{
Expand All @@ -31,9 +34,31 @@ public void ConfiguredNextVersionTest(string nextVersion, string expectedVersion
};
var baseVersion = GetBaseVersion(overrideConfiguration);

if (semanticVersion.IsNullOrEmpty())
{
baseVersion.ShouldBeNull();
return;
}

baseVersion.ShouldNotBeNull();
baseVersion.ShouldIncrement.ShouldBe(false);
baseVersion.GetSemanticVersion().ToString().ShouldBe(expectedVersion);
baseVersion.SemanticVersion.ToString().ShouldBe(semanticVersion);
baseVersion.BaseVersionSource.ShouldBeNull();

var shouldBeIncremented = semanticVersion != incrementedVersion;
baseVersion.ShouldIncrement.ShouldBe(shouldBeIncremented);
if (shouldBeIncremented)
{
baseVersion.Operator.ShouldNotBeNull();
baseVersion.Operator!.Label.ShouldBe(string.Empty);
baseVersion.Operator.ForceIncrement.ShouldBe(false);
baseVersion.Operator.Increment.ShouldBe(VersionField.None);
baseVersion.Operator.BaseVersionSource.ShouldBeNull();
}
else
{
baseVersion.Operator.ShouldBeNull();
}
baseVersion.GetIncrementedVersion().ToString().ShouldBe(incrementedVersion);
}

[TestCase("0.1", SemanticVersionFormat.Strict)]
Expand Down
Loading