diff --git a/src/GitTools.Testing/Fixtures/BaseGitFlowRepositoryFixture.cs b/src/GitTools.Testing/Fixtures/BaseGitFlowRepositoryFixture.cs index 94fb6327bc..bc41fad9a3 100644 --- a/src/GitTools.Testing/Fixtures/BaseGitFlowRepositoryFixture.cs +++ b/src/GitTools.Testing/Fixtures/BaseGitFlowRepositoryFixture.cs @@ -12,8 +12,26 @@ public class BaseGitFlowRepositoryFixture : EmptyRepositoryFixture /// /// Main will be tagged with the initial version before branching develop /// - public BaseGitFlowRepositoryFixture(string initialVersion) : - this(r => r.MakeATaggedCommit(initialVersion)) + public BaseGitFlowRepositoryFixture(string initialVersion) : this(initialVersion, "main") + { + } + + /// + /// Creates a repo with a develop branch off main which is a single commit ahead of main + /// + /// Main will be tagged with the initial version before branching develop + /// + public BaseGitFlowRepositoryFixture(string initialVersion, string branchName) : + this(r => r.MakeATaggedCommit(initialVersion), branchName) + { + } + + /// + /// Creates a repo with a develop branch off main which is a single commit ahead of main + /// + /// The initial setup actions will be performed before branching develop + /// + public BaseGitFlowRepositoryFixture(Action initialMainAction) : this(initialMainAction, "main") { } @@ -22,7 +40,8 @@ public BaseGitFlowRepositoryFixture(string initialVersion) : /// /// The initial setup actions will be performed before branching develop /// - public BaseGitFlowRepositoryFixture(Action initialMainAction) => SetupRepo(initialMainAction); + public BaseGitFlowRepositoryFixture(Action initialMainAction, string branchName) : + base(branchName) => SetupRepo(initialMainAction); private void SetupRepo(Action initialMainAction) { diff --git a/src/GitTools.Testing/Fixtures/EmptyRepositoryFixture.cs b/src/GitTools.Testing/Fixtures/EmptyRepositoryFixture.cs index 0c4d0ea0d1..710ad33c08 100644 --- a/src/GitTools.Testing/Fixtures/EmptyRepositoryFixture.cs +++ b/src/GitTools.Testing/Fixtures/EmptyRepositoryFixture.cs @@ -4,13 +4,18 @@ namespace GitTools.Testing; public class EmptyRepositoryFixture : RepositoryFixtureBase { - public EmptyRepositoryFixture() : base(CreateNewRepository) + public EmptyRepositoryFixture() : this("main") { } - private static IRepository CreateNewRepository(string path) + public EmptyRepositoryFixture(string branchName) + : base(path => CreateNewRepository(path, branchName)) { - Init(path); + } + + private static IRepository CreateNewRepository(string path, string branchName) + { + Init(path, branchName); Console.WriteLine("Created git repository at '{0}'", path); return new Repository(path); diff --git a/src/GitTools.Testing/Fixtures/RemoteRepositoryFixture.cs b/src/GitTools.Testing/Fixtures/RemoteRepositoryFixture.cs index 8ee343181e..e17c13714c 100644 --- a/src/GitTools.Testing/Fixtures/RemoteRepositoryFixture.cs +++ b/src/GitTools.Testing/Fixtures/RemoteRepositoryFixture.cs @@ -12,7 +12,12 @@ public class RemoteRepositoryFixture : RepositoryFixtureBase public RemoteRepositoryFixture(Func builder) : base(builder) => CreateLocalRepository(); - public RemoteRepositoryFixture() : this(CreateNewRepository) + public RemoteRepositoryFixture() : this("main") + { + } + + public RemoteRepositoryFixture(string branchName) : + this(path => CreateNewRepository(path, branchName)) { } @@ -21,9 +26,9 @@ public RemoteRepositoryFixture() : this(CreateNewRepository) /// public LocalRepositoryFixture LocalRepositoryFixture { get; private set; } - private static IRepository CreateNewRepository(string path) + private static IRepository CreateNewRepository(string path, string branchName) { - Init(path); + Init(path, branchName); Console.WriteLine("Created git repository at '{0}'", path); var repo = new Repository(path); diff --git a/src/GitTools.Testing/Fixtures/RepositoryFixtureBase.cs b/src/GitTools.Testing/Fixtures/RepositoryFixtureBase.cs index b246b84339..9ab330f4df 100644 --- a/src/GitTools.Testing/Fixtures/RepositoryFixtureBase.cs +++ b/src/GitTools.Testing/Fixtures/RepositoryFixtureBase.cs @@ -65,7 +65,7 @@ protected virtual void Dispose(bool disposing) public void Checkout(string branch) => Commands.Checkout(Repository, branch); - public static void Init(string path) => GitTestExtensions.ExecuteGitCmd($"init {path} -b main"); + public static void Init(string path, string branchName) => GitTestExtensions.ExecuteGitCmd($"init {path} -b {branchName}"); public void MakeATaggedCommit(string tag) { diff --git a/src/GitVersion.App.Tests/PullRequestInBuildAgentTest.cs b/src/GitVersion.App.Tests/PullRequestInBuildAgentTest.cs index e443e726cf..dbdf5342f8 100644 --- a/src/GitVersion.App.Tests/PullRequestInBuildAgentTest.cs +++ b/src/GitVersion.App.Tests/PullRequestInBuildAgentTest.cs @@ -143,9 +143,9 @@ public async Task VerifyBitBucketPipelinesPullRequest(string pullRequestRef) private static async Task VerifyPullRequestVersionIsCalculatedProperly(string pullRequestRef, Dictionary env) { - using var fixture = new EmptyRepositoryFixture(); + using var fixture = new EmptyRepositoryFixture("main"); var remoteRepositoryPath = ExecutableHelper.GetTempPath(); - RepositoryFixtureBase.Init(remoteRepositoryPath); + RepositoryFixtureBase.Init(remoteRepositoryPath, "main"); using (var remoteRepository = new Repository(remoteRepositoryPath)) { remoteRepository.Config.Set("user.name", "Test"); diff --git a/src/GitVersion.App.Tests/TagCheckoutInBuildAgentTests.cs b/src/GitVersion.App.Tests/TagCheckoutInBuildAgentTests.cs index 330d2ff717..3258565fba 100644 --- a/src/GitVersion.App.Tests/TagCheckoutInBuildAgentTests.cs +++ b/src/GitVersion.App.Tests/TagCheckoutInBuildAgentTests.cs @@ -36,9 +36,9 @@ public async Task VerifyTagCheckoutOnGitHubActions() private static async Task VerifyTagCheckoutVersionIsCalculatedProperly(Dictionary env) { - using var fixture = new EmptyRepositoryFixture(); + using var fixture = new EmptyRepositoryFixture("main"); var remoteRepositoryPath = ExecutableHelper.GetTempPath(); - RepositoryFixtureBase.Init(remoteRepositoryPath); + RepositoryFixtureBase.Init(remoteRepositoryPath, "main"); using (var remoteRepository = new Repository(remoteRepositoryPath)) { remoteRepository.Config.Set("user.name", "Test"); diff --git a/src/GitVersion.Core.Tests/Configuration/ConfigProviderTests.CanWriteOutEffectiveConfiguration.approved.txt b/src/GitVersion.Core.Tests/Configuration/ConfigProviderTests.CanWriteOutEffectiveConfiguration.approved.txt index f7a27ad32f..c3749b2a40 100644 --- a/src/GitVersion.Core.Tests/Configuration/ConfigProviderTests.CanWriteOutEffectiveConfiguration.approved.txt +++ b/src/GitVersion.Core.Tests/Configuration/ConfigProviderTests.CanWriteOutEffectiveConfiguration.approved.txt @@ -57,10 +57,8 @@ branches: pre-release-weight: 30000 feature: mode: ContinuousDelivery - tag: useBranchName + tag: '{BranchName}' increment: Inherit - prevent-increment-of-merged-branch-version: false - track-merge-target: false regex: ^features?[/-] source-branches: - develop @@ -69,17 +67,12 @@ branches: - feature - support - hotfix - tracks-release-branches: false - is-release-branch: false - is-mainline: false pre-release-weight: 30000 pull-request: mode: ContinuousDelivery tag: PullRequest increment: Inherit - prevent-increment-of-merged-branch-version: false tag-number-pattern: '[/-](?\d+)' - track-merge-target: false regex: ^(pull|pull\-requests|pr)[/-] source-branches: - develop @@ -88,9 +81,6 @@ branches: - feature - support - hotfix - tracks-release-branches: false - is-release-branch: false - is-mainline: false pre-release-weight: 30000 hotfix: mode: ContinuousDelivery @@ -100,9 +90,10 @@ branches: track-merge-target: false regex: ^hotfix(es)?[/-] source-branches: - - develop + - release - main - support + - hotfix tracks-release-branches: false is-release-branch: false is-mainline: false @@ -122,6 +113,7 @@ branches: pre-release-weight: 55000 ignore: sha: [] +increment: Inherit commit-date-format: yyyy-MM-dd merge-message-formats: {} update-build-number: true diff --git a/src/GitVersion.Core.Tests/Core/RepositoryStoreTests.cs b/src/GitVersion.Core.Tests/Core/RepositoryStoreTests.cs index 78a7aa7aeb..bd60860d71 100644 --- a/src/GitVersion.Core.Tests/Core/RepositoryStoreTests.cs +++ b/src/GitVersion.Core.Tests/Core/RepositoryStoreTests.cs @@ -3,7 +3,6 @@ using GitVersion.Core.Tests.IntegrationTests; using GitVersion.Logging; using GitVersion.Model.Configuration; -using GitVersion.VersionCalculation; using Microsoft.Extensions.DependencyInjection; using NUnit.Framework; using Shouldly; @@ -14,13 +13,11 @@ namespace GitVersion.Core.Tests; public class RepositoryStoreTests : TestBase { private readonly ILog log; - private readonly IIncrementStrategyFinder incrementStrategyFinder; public RepositoryStoreTests() { var sp = ConfigureServices(); this.log = sp.GetRequiredService(); - this.incrementStrategyFinder = sp.GetRequiredService(); } [Test] @@ -65,7 +62,7 @@ public void FindsCorrectMergeBaseForForwardMerge() var develop = fixtureRepository.FindBranch("develop"); var release = fixtureRepository.FindBranch("release-2.0.0"); - var gitRepoMetadataProvider = new RepositoryStore(this.log, fixtureRepository, this.incrementStrategyFinder); + var gitRepoMetadataProvider = new RepositoryStore(this.log, fixtureRepository); var releaseBranchMergeBase = gitRepoMetadataProvider.FindMergeBase(release, develop); @@ -121,7 +118,7 @@ public void FindsCorrectMergeBaseForForwardMergeMovesOn() var develop = fixtureRepository.FindBranch("develop"); var release = fixtureRepository.FindBranch("release-2.0.0"); - var gitRepoMetadataProvider = new RepositoryStore(this.log, fixtureRepository, this.incrementStrategyFinder); + var gitRepoMetadataProvider = new RepositoryStore(this.log, fixtureRepository); var releaseBranchMergeBase = gitRepoMetadataProvider.FindMergeBase(release, develop); @@ -196,7 +193,7 @@ public void FindsCorrectMergeBaseForMultipleForwardMerges() var develop = fixtureRepository.FindBranch("develop"); var release = fixtureRepository.FindBranch("release-2.0.0"); - var gitRepoMetadataProvider = new RepositoryStore(this.log, fixtureRepository, this.incrementStrategyFinder); + var gitRepoMetadataProvider = new RepositoryStore(this.log, fixtureRepository); var releaseBranchMergeBase = gitRepoMetadataProvider.FindMergeBase(release, develop); @@ -213,7 +210,7 @@ public void GetBranchesContainingCommitThrowsDirectlyOnNullCommit() { using var fixture = new EmptyRepositoryFixture(); var fixtureRepository = fixture.Repository.ToGitRepository(); - var gitRepoMetadataProvider = new RepositoryStore(this.log, fixtureRepository, this.incrementStrategyFinder); + var gitRepoMetadataProvider = new RepositoryStore(this.log, fixtureRepository); Assert.Throws(() => gitRepoMetadataProvider.GetBranchesContainingCommit(null)); } @@ -227,7 +224,7 @@ public void FindCommitBranchWasBranchedFromShouldReturnNullIfTheRemoteIsTheOnlyS var localRepository = fixture.LocalRepositoryFixture.Repository.ToGitRepository(); - var gitRepoMetadataProvider = new RepositoryStore(this.log, localRepository, this.incrementStrategyFinder); + var gitRepoMetadataProvider = new RepositoryStore(this.log, localRepository); var branch = localRepository.FindBranch("main"); branch.ShouldNotBeNull(); diff --git a/src/GitVersion.Core.Tests/Extensions/GitToolsTestingExtensions.cs b/src/GitVersion.Core.Tests/Extensions/GitToolsTestingExtensions.cs index 20decb9958..cca12fe9fd 100644 --- a/src/GitVersion.Core.Tests/Extensions/GitToolsTestingExtensions.cs +++ b/src/GitVersion.Core.Tests/Extensions/GitToolsTestingExtensions.cs @@ -82,8 +82,8 @@ public static VersionVariables GetVersion(this RepositoryFixtureBase fixture, Co try { - var semanticVersion = nextVersionCalculator.FindVersion(); - var variables = variableProvider.GetVariablesFor(semanticVersion, context.Configuration, context.IsCurrentCommitTagged); + var nextVersion = nextVersionCalculator.FindVersion(); + var variables = variableProvider.GetVariablesFor(nextVersion.IncrementedVersion, nextVersion.Configuration, context.IsCurrentCommitTagged); return variables; } diff --git a/src/GitVersion.Core.Tests/Helpers/TestConfigurationBuilder.cs b/src/GitVersion.Core.Tests/Helpers/TestConfigurationBuilder.cs new file mode 100644 index 0000000000..150d96a939 --- /dev/null +++ b/src/GitVersion.Core.Tests/Helpers/TestConfigurationBuilder.cs @@ -0,0 +1,161 @@ +using GitVersion.Configuration; +using GitVersion.Model.Configuration; +using GitVersion.VersionCalculation; + +namespace GitVersion.Core.Tests.Helpers; + +public sealed class TestConfigurationBuilder +{ + public static TestConfigurationBuilder New => new(); + + private string? nextVerson; + private VersioningMode? versioningMode; + private readonly Dictionary versioningModeDictionary = new(); + private bool withoutAnyTrackMergeTargets; + private readonly Dictionary trackMergeTargetsDictionary = new(); + private readonly Dictionary preventIncrementOfMergedBranchVersionDictionary = new(); + private IncrementStrategy? increment; + private readonly Dictionary incrementDictionary = new(); + private readonly Dictionary tagDictionary = new(); + private IgnoreConfig? ignoreConfig; + + private TestConfigurationBuilder() + { + withoutAnyTrackMergeTargets = false; + increment = IncrementStrategy.Inherit; + versioningMode = VersioningMode.ContinuousDelivery; + } + + public TestConfigurationBuilder WithNextVersion(string? value) + { + nextVerson = value; + return this; + } + + public TestConfigurationBuilder WithVersioningMode(VersioningMode value) + { + versioningMode = value; + return this; + } + + public TestConfigurationBuilder WithoutVersioningMode() + { + versioningMode = null; + return this; + } + + public TestConfigurationBuilder WithVersioningMode(string branch, VersioningMode value) + { + versioningModeDictionary[branch] = value; + return this; + } + + public TestConfigurationBuilder WithoutVersioningMode(string branch) + { + versioningModeDictionary[branch] = null; + return this; + } + + public TestConfigurationBuilder WithTrackMergeTarget(string branch, bool value) + { + trackMergeTargetsDictionary[branch] = value; + return this; + } + + public TestConfigurationBuilder WithoutAnyTrackMergeTargets() + { + withoutAnyTrackMergeTargets = true; + trackMergeTargetsDictionary.Clear(); + return this; + } + + public TestConfigurationBuilder WithPreventIncrementOfMergedBranchVersion(string branch, bool value) + { + preventIncrementOfMergedBranchVersionDictionary[branch] = value; + return this; + } + + public TestConfigurationBuilder WithIncrement(IncrementStrategy? value) + { + increment = value; + return this; + } + + public TestConfigurationBuilder WithIncrement(string branch, IncrementStrategy value) + { + incrementDictionary[branch] = value; + return this; + } + + public TestConfigurationBuilder WithoutTag(string branch) + { + tagDictionary[branch] = null; + return this; + } + + public TestConfigurationBuilder WithTag(string branch, string value) + { + tagDictionary[branch] = value; + return this; + } + + public TestConfigurationBuilder WithIgnoreConfig(IgnoreConfig value) + { + ignoreConfig = value; + return this; + } + + public Config Build() + { + Config configuration = new() + { + NextVersion = nextVerson, + VersioningMode = versioningMode + }; + + if (ignoreConfig != null) + { + configuration.Ignore = ignoreConfig; + } + + ConfigurationBuilder configurationBuilder = new(); + configuration = configurationBuilder.Add(configuration).Build(); + + if (withoutAnyTrackMergeTargets) + { + foreach (var branchConfiguration in configuration.Branches.Values) + { + branchConfiguration.TrackMergeTarget = false; + } + } + + foreach (var item in trackMergeTargetsDictionary) + { + configuration.Branches[item.Key].TrackMergeTarget = item.Value; + } + + foreach (var item in versioningModeDictionary) + { + configuration.Branches[item.Key].VersioningMode = item.Value; + } + + foreach (var item in preventIncrementOfMergedBranchVersionDictionary) + { + configuration.Branches[item.Key].PreventIncrementOfMergedBranchVersion = item.Value; + } + + configuration.Increment = increment; + + foreach (var item in incrementDictionary) + { + configuration.Branches[item.Key].Increment = item.Value; + } + + foreach (var item in tagDictionary) + { + configuration.Branches[item.Key].Tag = item.Value; + } + + return configuration; + } +} diff --git a/src/GitVersion.Core.Tests/Helpers/TestEffectiveConfiguration.cs b/src/GitVersion.Core.Tests/Helpers/TestEffectiveConfiguration.cs index 1cc3306f73..98991ec0ac 100644 --- a/src/GitVersion.Core.Tests/Helpers/TestEffectiveConfiguration.cs +++ b/src/GitVersion.Core.Tests/Helpers/TestEffectiveConfiguration.cs @@ -13,11 +13,11 @@ public TestEffectiveConfiguration( string? assemblyFileVersioningFormat = null, string? assemblyInformationalFormat = null, VersioningMode versioningMode = VersioningMode.ContinuousDelivery, - string gitTagPrefix = "v", + string tagPrefix = "v", string tag = "", string? nextVersion = null, string branchPrefixToTrim = "", - bool preventIncrementForMergedBranchVersion = false, + bool preventIncrementOfMergedBranchVersion = false, string? tagNumberPattern = null, string continuousDeploymentFallbackTag = "ci", bool trackMergeTarget = false, @@ -32,6 +32,7 @@ public TestEffectiveConfiguration( IEnumerable? versionFilters = null, bool tracksReleaseBranches = false, bool isRelease = false, + bool isMainline = false, string commitDateFormat = "yyyy-MM-dd", bool updateBuildNumber = false) : base(assemblyVersioningScheme, @@ -40,12 +41,12 @@ public TestEffectiveConfiguration( assemblyVersioningFormat, assemblyFileVersioningFormat, versioningMode, - gitTagPrefix, + tagPrefix, tag, nextVersion, IncrementStrategy.Patch, branchPrefixToTrim, - preventIncrementForMergedBranchVersion, + preventIncrementOfMergedBranchVersion, tagNumberPattern, continuousDeploymentFallbackTag, trackMergeTarget, @@ -60,6 +61,7 @@ public TestEffectiveConfiguration( versionFilters ?? Enumerable.Empty(), tracksReleaseBranches, isRelease, + isMainline, commitDateFormat, updateBuildNumber, 0, diff --git a/src/GitVersion.Core.Tests/Model/GitVersionContextTests.cs b/src/GitVersion.Core.Tests/Model/GitVersionContextTests.cs index 86715bf374..e16a66d8ec 100644 --- a/src/GitVersion.Core.Tests/Model/GitVersionContextTests.cs +++ b/src/GitVersion.Core.Tests/Model/GitVersionContextTests.cs @@ -37,9 +37,9 @@ public void CanInheritVersioningMode(VersioningMode mode) mockRepository.Branches.Returns(branches); mockRepository.Commits.Returns(mockBranch.Commits); - var context = GetGitVersionContext(fixture.RepositoryPath, mockRepository, branchName, config); + var effectiveConfiguration = GetEffectiveConfiguration(fixture.RepositoryPath, mockRepository, branchName, config); - context.Configuration.VersioningMode.ShouldBe(mode); + effectiveConfiguration.VersioningMode.ShouldBe(mode); } [TestCase(IncrementStrategy.Inherit, IncrementStrategy.Patch)] // Since it inherits, the increment strategy of main is used => Patch @@ -61,9 +61,9 @@ public void CanInheritIncrement(IncrementStrategy increment, IncrementStrategy? fixture.BranchTo(dummyBranchName); fixture.MakeACommit(); - var context = GetGitVersionContext(fixture.RepositoryPath, fixture.Repository.ToGitRepository(), dummyBranchName, config); + var effectiveConfiguration = GetEffectiveConfiguration(fixture.RepositoryPath, fixture.Repository.ToGitRepository(), dummyBranchName, config); - context.Configuration.Increment.ShouldBe(alternateExpected ?? increment); + effectiveConfiguration.Increment.ShouldBe(alternateExpected ?? increment); } [Test] @@ -100,9 +100,9 @@ public void UsesBranchSpecificConfigOverTopLevelDefaults() mockRepository.Branches.Returns(branches); mockRepository.Commits.Returns(develop.Commits); - var context = GetGitVersionContext(fixture.RepositoryPath, mockRepository, branchName, config); + var effectiveConfiguration = GetEffectiveConfiguration(fixture.RepositoryPath, mockRepository, branchName, config); - context.Configuration.Tag.ShouldBe("alpha"); + effectiveConfiguration.Tag.ShouldBe("alpha"); } [Test] @@ -143,12 +143,12 @@ public void UsesFirstBranchConfigWhenMultipleMatch() mockRepository.Head.Returns(releaseLatestBranch); mockRepository.Commits.Returns(releaseLatestBranch.Commits); - var latestContext = GetGitVersionContext(fixture.RepositoryPath, mockRepository, releaseLatestBranch.Name.Canonical, config); - latestContext.Configuration.Increment.ShouldBe(IncrementStrategy.None); + var latestEffectiveConfiguration = GetEffectiveConfiguration(fixture.RepositoryPath, mockRepository, releaseLatestBranch.Name.Canonical, config); + latestEffectiveConfiguration.Increment.ShouldBe(IncrementStrategy.None); mockRepository.Head.Returns(releaseVersionBranch); - var versionContext = GetGitVersionContext(fixture.RepositoryPath, mockRepository, releaseVersionBranch.Name.Canonical, config); - versionContext.Configuration.Increment.ShouldBe(IncrementStrategy.Patch); + var effectiveConfiguration = GetEffectiveConfiguration(fixture.RepositoryPath, mockRepository, releaseVersionBranch.Name.Canonical, config); + effectiveConfiguration.Increment.ShouldBe(IncrementStrategy.Patch); } [Test] @@ -173,12 +173,12 @@ public void CanFindParentBranchForInheritingIncrementStrategy() Commands.Checkout(fixture.Repository, featureBranch); fixture.Repository.MakeACommit(); - var context = GetGitVersionContext(fixture.RepositoryPath, fixture.Repository.ToGitRepository(), "develop", config); + var effectiveConfiguration = GetEffectiveConfiguration(fixture.RepositoryPath, fixture.Repository.ToGitRepository(), "develop", config); - context.Configuration.Increment.ShouldBe(IncrementStrategy.Major); + effectiveConfiguration.Increment.ShouldBe(IncrementStrategy.Major); } - private static GitVersionContext GetGitVersionContext(string workingDirectory, IGitRepository repository, string branch, Config? config = null) + private static EffectiveConfiguration GetEffectiveConfiguration(string workingDirectory, IGitRepository repository, string branch, Config? config = null) { var options = Options.Create(new GitVersionOptions { @@ -193,6 +193,12 @@ private static GitVersionContext GetGitVersionContext(string workingDirectory, I services.AddSingleton(repository); }); - return sp.GetRequiredService>().Value; + var context = sp.GetRequiredService>().Value; + var branchConfigurationCalculator = sp.GetRequiredService(); + var configuration = context.FullConfiguration; + var currentBranchConfig = branchConfigurationCalculator.GetBranchConfiguration( + context.CurrentBranch, context.CurrentCommit, configuration + ); + return new(configuration, currentBranchConfig); } } diff --git a/src/GitVersion.Core.Tests/VersionCalculation/BaseVersionCalculatorTests.cs b/src/GitVersion.Core.Tests/VersionCalculation/BaseVersionCalculatorTests.cs index eb7f2a2368..ec2229e460 100644 --- a/src/GitVersion.Core.Tests/VersionCalculation/BaseVersionCalculatorTests.cs +++ b/src/GitVersion.Core.Tests/VersionCalculation/BaseVersionCalculatorTests.cs @@ -24,7 +24,7 @@ public void ChoosesHighestVersionReturnedFromStrategies() services.AddSingleton(new V2Strategy(dateTimeOffset)); })); - var baseVersion = versionCalculator.GetBaseVersion(); + var (baseVersion, _) = versionCalculator.GetBaseVersion(); baseVersion.SemanticVersion.ToString().ShouldBe("2.0.0"); baseVersion.ShouldIncrement.ShouldBe(true); @@ -45,7 +45,7 @@ public void UsesWhenFromNextBestMatchIfHighestDoesntHaveWhen() services.AddSingleton(new V2Strategy(null)); })); - var baseVersion = versionCalculator.GetBaseVersion(); + var (baseVersion, _) = versionCalculator.GetBaseVersion(); baseVersion.SemanticVersion.ToString().ShouldBe("2.0.0"); baseVersion.ShouldIncrement.ShouldBe(true); @@ -66,7 +66,7 @@ public void UsesWhenFromNextBestMatchIfHighestDoesntHaveWhenReversedOrder() services.AddSingleton(new V2Strategy(when)); })); - var baseVersion = versionCalculator.GetBaseVersion(); + var (baseVersion, _) = versionCalculator.GetBaseVersion(); baseVersion.SemanticVersion.ToString().ShouldBe("2.0.0"); baseVersion.ShouldIncrement.ShouldBe(true); @@ -88,7 +88,7 @@ public void ShouldNotFilterVersion() services.AddSingleton(new TestVersionStrategy(version)); })); - var baseVersion = versionCalculator.GetBaseVersion(); + var (baseVersion, _) = versionCalculator.GetBaseVersion(); baseVersion.Source.ShouldBe(version.Source); baseVersion.ShouldIncrement.ShouldBe(version.ShouldIncrement); @@ -110,7 +110,7 @@ public void ShouldFilterVersion() services.RemoveAll(); services.AddSingleton(new TestVersionStrategy(higherVersion, lowerVersion)); })); - var baseVersion = versionCalculator.GetBaseVersion(); + var (baseVersion, _) = versionCalculator.GetBaseVersion(); baseVersion.Source.ShouldNotBe(higherVersion.Source); baseVersion.SemanticVersion.ShouldNotBe(higherVersion.SemanticVersion); @@ -146,7 +146,7 @@ public void ShouldIgnorePreReleaseVersionInMainlineMode() services.RemoveAll(); services.AddSingleton(new TestVersionStrategy(preReleaseVersion, lowerVersion)); })); - var baseVersion = versionCalculator.GetBaseVersion(); + var (baseVersion, _) = versionCalculator.GetBaseVersion(); baseVersion.Source.ShouldNotBe(preReleaseVersion.Source); baseVersion.SemanticVersion.ShouldNotBe(preReleaseVersion.SemanticVersion); @@ -209,7 +209,7 @@ public V1Strategy(DateTimeOffset? when) } } - public IEnumerable GetVersions() + public IEnumerable GetBaseVersions(EffectiveBranchConfiguration configuration) { yield return new BaseVersion("Source 1", false, new SemanticVersion(1), this.when, null); } @@ -232,7 +232,7 @@ public V2Strategy(DateTimeOffset? when) } } - public IEnumerable GetVersions() + public IEnumerable GetBaseVersions(EffectiveBranchConfiguration configuration) { yield return new BaseVersion("Source 2", true, new SemanticVersion(2), this.when, null); } @@ -240,10 +240,10 @@ public IEnumerable GetVersions() private sealed class TestVersionStrategy : IVersionStrategy { - private readonly IEnumerable versions; + private readonly IEnumerable baseVersions; - public TestVersionStrategy(params BaseVersion[] versions) => this.versions = versions; + public TestVersionStrategy(params BaseVersion[] baseVersions) => this.baseVersions = baseVersions; - public IEnumerable GetVersions() => this.versions; + public IEnumerable GetBaseVersions(EffectiveBranchConfiguration configuration) => this.baseVersions; } } diff --git a/src/GitVersion.Core.Tests/VersionCalculation/MinDateVersionFilterTests.cs b/src/GitVersion.Core.Tests/VersionCalculation/MinDateVersionFilterTests.cs index f9d0af5e85..dcc568f49b 100644 --- a/src/GitVersion.Core.Tests/VersionCalculation/MinDateVersionFilterTests.cs +++ b/src/GitVersion.Core.Tests/VersionCalculation/MinDateVersionFilterTests.cs @@ -14,7 +14,7 @@ public void VerifyNullGuard() var dummy = DateTimeOffset.UtcNow.AddSeconds(1.0); var sut = new MinDateVersionFilter(dummy); - Should.Throw(() => sut.Exclude(null, out _)); + Should.Throw(() => sut.Exclude(null!, out _)); } [Test] diff --git a/src/GitVersion.Core.Tests/VersionCalculation/NextVersionCalculatorTests.cs b/src/GitVersion.Core.Tests/VersionCalculation/NextVersionCalculatorTests.cs index 2bad65900d..0f6117dfbb 100644 --- a/src/GitVersion.Core.Tests/VersionCalculation/NextVersionCalculatorTests.cs +++ b/src/GitVersion.Core.Tests/VersionCalculation/NextVersionCalculatorTests.cs @@ -1,4 +1,5 @@ using GitTools.Testing; +using GitVersion.Configuration; using GitVersion.Core.Tests.Helpers; using GitVersion.Core.Tests.IntegrationTests; using GitVersion.Model.Configuration; @@ -18,11 +19,16 @@ public void ShouldIncrementVersionBasedOnConfig() var semanticVersionBuildMetaData = new SemanticVersionBuildMetaData("ef7d0d7e1e700f1c7c9fa01ea6791bb778a5c37c", 1, MainBranch, "b1a34edbd80e141f7cc046c074f109be7d022074", "b1a34e", DateTimeOffset.Now, 0); var contextBuilder = new GitVersionContextBuilder(); - contextBuilder .OverrideServices(services => { - var testBaseVersionCalculator = new TestBaseVersionCalculator(true, new SemanticVersion(1), GitToolsTestingExtensions.CreateMockCommit()); + var configuration = TestConfigurationBuilder.New.Build(); + var branchMock = GitToolsTestingExtensions.CreateMockBranch("main", GitToolsTestingExtensions.CreateMockCommit()); + var effectiveConfiguration = new EffectiveConfiguration(configuration, configuration.GetBranchConfiguration("main")); + var effectiveBranchConfiguration = new EffectiveBranchConfiguration(branchMock, effectiveConfiguration); + var testBaseVersionCalculator = new TestBaseVersionCalculator( + true, new SemanticVersion(1), GitToolsTestingExtensions.CreateMockCommit(), effectiveBranchConfiguration + ); services.AddSingleton(testBaseVersionCalculator); services.AddSingleton(new TestMainlineVersionCalculator(semanticVersionBuildMetaData)); }) @@ -33,9 +39,9 @@ public void ShouldIncrementVersionBasedOnConfig() var nextVersionCalculator = contextBuilder.ServicesProvider.GetRequiredService(); nextVersionCalculator.ShouldNotBeNull(); - var version = nextVersionCalculator.FindVersion(); + var nextVersion = nextVersionCalculator.FindVersion(); - version.ToString().ShouldBe("1.0.1"); + nextVersion.IncrementedVersion.ToString().ShouldBe("1.0.1"); } [Test] @@ -48,7 +54,13 @@ public void DoesNotIncrementWhenBaseVersionSaysNotTo() contextBuilder .OverrideServices(services => { - var testBaseVersionCalculator = new TestBaseVersionCalculator(false, new SemanticVersion(1), GitToolsTestingExtensions.CreateMockCommit()); + var configuration = TestConfigurationBuilder.New.Build(); + var branchMock = GitToolsTestingExtensions.CreateMockBranch("main", GitToolsTestingExtensions.CreateMockCommit()); + var effectiveConfiguration = new EffectiveConfiguration(configuration, configuration.GetBranchConfiguration("main")); + var effectiveBranchConfiguration = new EffectiveBranchConfiguration(branchMock, effectiveConfiguration); + var testBaseVersionCalculator = new TestBaseVersionCalculator( + false, new SemanticVersion(1), GitToolsTestingExtensions.CreateMockCommit(), effectiveBranchConfiguration + ); services.AddSingleton(testBaseVersionCalculator); services.AddSingleton(new TestMainlineVersionCalculator(semanticVersionBuildMetaData)); }) @@ -60,9 +72,9 @@ public void DoesNotIncrementWhenBaseVersionSaysNotTo() nextVersionCalculator.ShouldNotBeNull(); - var version = nextVersionCalculator.FindVersion(); + var nextVersion = nextVersionCalculator.FindVersion(); - version.ToString().ShouldBe("1.0.0"); + nextVersion.IncrementedVersion.ToString().ShouldBe("1.0.0"); } [Test] @@ -74,7 +86,13 @@ public void AppliesBranchPreReleaseTag() contextBuilder .OverrideServices(services => { - var testBaseVersionCalculator = new TestBaseVersionCalculator(false, new SemanticVersion(1), GitToolsTestingExtensions.CreateMockCommit()); + var configuration = TestConfigurationBuilder.New.Build(); + var branchMock = GitToolsTestingExtensions.CreateMockBranch("develop", GitToolsTestingExtensions.CreateMockCommit()); + var effectiveConfiguration = new EffectiveConfiguration(configuration, configuration.GetBranchConfiguration("develop")); + var effectiveBranchConfiguration = new EffectiveBranchConfiguration(branchMock, effectiveConfiguration); + var testBaseVersionCalculator = new TestBaseVersionCalculator( + false, new SemanticVersion(1), GitToolsTestingExtensions.CreateMockCommit(), effectiveBranchConfiguration + ); services.AddSingleton(testBaseVersionCalculator); services.AddSingleton(new TestMainlineVersionCalculator(semanticVersionBuildMetaData)); }) @@ -85,9 +103,9 @@ public void AppliesBranchPreReleaseTag() var nextVersionCalculator = contextBuilder.ServicesProvider.GetRequiredService(); nextVersionCalculator.ShouldNotBeNull(); - var version = nextVersionCalculator.FindVersion(); + var nextVersion = nextVersionCalculator.FindVersion(); - version.ToString("f").ShouldBe("1.0.0-alpha.1+2"); + nextVersion.IncrementedVersion.ToString("f").ShouldBe("1.0.0-alpha.1+2"); } [Test] diff --git a/src/GitVersion.Core.Tests/VersionCalculation/ShaVersionFilterTests.cs b/src/GitVersion.Core.Tests/VersionCalculation/ShaVersionFilterTests.cs index e1cca263be..9a07c7311e 100644 --- a/src/GitVersion.Core.Tests/VersionCalculation/ShaVersionFilterTests.cs +++ b/src/GitVersion.Core.Tests/VersionCalculation/ShaVersionFilterTests.cs @@ -14,7 +14,7 @@ public void VerifyNullGuard2() var commit = GitToolsTestingExtensions.CreateMockCommit(); var sut = new ShaVersionFilter(new[] { commit.Sha }); - Should.Throw(() => sut.Exclude(null, out _)); + Should.Throw(() => sut.Exclude(null!, out _)); } [Test] diff --git a/src/GitVersion.Core.Tests/VersionCalculation/Strategies/ConfigNextVersionBaseVersionStrategyTests.cs b/src/GitVersion.Core.Tests/VersionCalculation/Strategies/ConfigNextVersionBaseVersionStrategyTests.cs index 773aebcb18..24d9abd155 100644 --- a/src/GitVersion.Core.Tests/VersionCalculation/Strategies/ConfigNextVersionBaseVersionStrategyTests.cs +++ b/src/GitVersion.Core.Tests/VersionCalculation/Strategies/ConfigNextVersionBaseVersionStrategyTests.cs @@ -1,7 +1,9 @@ +using GitVersion.Configuration; using GitVersion.Core.Tests.Helpers; using GitVersion.Extensions; using GitVersion.Model.Configuration; using GitVersion.VersionCalculation; +using Microsoft.Extensions.DependencyInjection; using NUnit.Framework; using Shouldly; @@ -46,7 +48,10 @@ public void ConfigNextVersionTest(string nextVersion, string expectedVersion) contextBuilder.Build(); contextBuilder.ServicesProvider.ShouldNotBeNull(); var strategy = contextBuilder.ServicesProvider.GetServiceForType(); - - return strategy.GetVersions().SingleOrDefault(); + var context = contextBuilder.ServicesProvider.GetRequiredService>().Value; + var branchMock = GitToolsTestingExtensions.CreateMockBranch("main", GitToolsTestingExtensions.CreateMockCommit()); + var branchConfiguration = context.FullConfiguration.GetBranchConfiguration(branchMock); + var effectiveConfiguration = new EffectiveConfiguration(context.FullConfiguration, branchConfiguration); + return strategy.GetBaseVersions(new(branchMock, effectiveConfiguration)).SingleOrDefault(); } } diff --git a/src/GitVersion.Core.Tests/VersionCalculation/Strategies/MergeMessageBaseVersionStrategyTests.cs b/src/GitVersion.Core.Tests/VersionCalculation/Strategies/MergeMessageBaseVersionStrategyTests.cs index 4d1ededce0..a2ca9409ae 100644 --- a/src/GitVersion.Core.Tests/VersionCalculation/Strategies/MergeMessageBaseVersionStrategyTests.cs +++ b/src/GitVersion.Core.Tests/VersionCalculation/Strategies/MergeMessageBaseVersionStrategyTests.cs @@ -1,7 +1,9 @@ +using GitVersion.Configuration; using GitVersion.Core.Tests.Helpers; using GitVersion.Extensions; using GitVersion.Model.Configuration; using GitVersion.VersionCalculation; +using Microsoft.Extensions.DependencyInjection; using NSubstitute; using NUnit.Framework; using Shouldly; @@ -36,8 +38,10 @@ public void ShouldNotAllowIncrementOfVersion() contextBuilder.Build(); contextBuilder.ServicesProvider.ShouldNotBeNull(); var strategy = contextBuilder.ServicesProvider.GetServiceForType(); - - var baseVersion = strategy.GetVersions().Single(); + var context = contextBuilder.ServicesProvider.GetRequiredService>().Value; + var branchConfiguration = context.FullConfiguration.GetBranchConfiguration(mockBranch); + var effectiveConfiguration = new EffectiveConfiguration(context.FullConfiguration, branchConfiguration); + var baseVersion = strategy.GetBaseVersions(new(mockBranch, effectiveConfiguration)).Single(); baseVersion.ShouldIncrement.ShouldBe(false); } @@ -171,8 +175,10 @@ private static void AssertMergeMessage(string message, string? expectedVersion, contextBuilder.Build(); contextBuilder.ServicesProvider.ShouldNotBeNull(); var strategy = contextBuilder.ServicesProvider.GetServiceForType(); - - var baseVersion = strategy.GetVersions().SingleOrDefault(); + var context = contextBuilder.ServicesProvider.GetRequiredService>().Value; + var branchConfiguration = context.FullConfiguration.GetBranchConfiguration(mockBranch); + var effectiveConfiguration = new EffectiveConfiguration(context.FullConfiguration, branchConfiguration); + var baseVersion = strategy.GetBaseVersions(new(mockBranch, effectiveConfiguration)).SingleOrDefault(); if (expectedVersion == null) { diff --git a/src/GitVersion.Core.Tests/VersionCalculation/Strategies/VersionInBranchNameBaseVersionStrategyTests.cs b/src/GitVersion.Core.Tests/VersionCalculation/Strategies/VersionInBranchNameBaseVersionStrategyTests.cs index ba225f7c6d..3d46d8d190 100644 --- a/src/GitVersion.Core.Tests/VersionCalculation/Strategies/VersionInBranchNameBaseVersionStrategyTests.cs +++ b/src/GitVersion.Core.Tests/VersionCalculation/Strategies/VersionInBranchNameBaseVersionStrategyTests.cs @@ -21,8 +21,12 @@ public void CanTakeVersionFromNameOfReleaseBranch(string branchName, string expe fixture.Repository.MakeACommit(); fixture.Repository.CreateBranch(branchName); - var strategy = GetVersionStrategy(fixture.RepositoryPath, fixture.Repository.ToGitRepository(), branchName); - var baseVersion = strategy.GetVersions().Single(); + var gitRepository = fixture.Repository.ToGitRepository(); + var strategy = GetVersionStrategy(fixture.RepositoryPath, gitRepository, branchName); + var configuration = TestConfigurationBuilder.New.Build(); + var branchConfiguration = configuration.GetBranchConfiguration(branchName); + var effectiveConfiguration = new EffectiveConfiguration(configuration, branchConfiguration); + var baseVersion = strategy.GetBaseVersions(new(gitRepository.FindBranch(branchName)!, effectiveConfiguration)).Single(); baseVersion.SemanticVersion.ToString().ShouldBe(expectedBaseVersion); } @@ -37,8 +41,12 @@ public void ShouldNotTakeVersionFromNameOfNonReleaseBranch(string branchName) fixture.Repository.MakeACommit(); fixture.Repository.CreateBranch(branchName); - var strategy = GetVersionStrategy(fixture.RepositoryPath, fixture.Repository.ToGitRepository(), branchName); - var baseVersions = strategy.GetVersions(); + var gitRepository = fixture.Repository.ToGitRepository(); + var strategy = GetVersionStrategy(fixture.RepositoryPath, gitRepository, branchName); + var configuration = TestConfigurationBuilder.New.Build(); + var branchConfiguration = configuration.GetBranchConfiguration(branchName); + var effectiveConfiguration = new EffectiveConfiguration(configuration, branchConfiguration); + var baseVersions = strategy.GetBaseVersions(new(gitRepository.FindBranch(branchName)!, effectiveConfiguration)); baseVersions.ShouldBeEmpty(); } @@ -55,9 +63,13 @@ public void CanTakeVersionFromNameOfConfiguredReleaseBranch(string branchName, s .Add(new Config { Branches = { { "support", new BranchConfig { IsReleaseBranch = true } } } }) .Build(); - var strategy = GetVersionStrategy(fixture.RepositoryPath, fixture.Repository.ToGitRepository(), branchName, config); + var gitRepository = fixture.Repository.ToGitRepository(); + var strategy = GetVersionStrategy(fixture.RepositoryPath, gitRepository, branchName, config); - var baseVersion = strategy.GetVersions().Single(); + var configuration = TestConfigurationBuilder.New.Build(); + var branchConfiguration = configuration.GetBranchConfiguration(branchName); + var effectiveConfiguration = new EffectiveConfiguration(configuration, branchConfiguration); + var baseVersion = strategy.GetBaseVersions(new(gitRepository.FindBranch(branchName)!, effectiveConfiguration)).Single(); baseVersion.SemanticVersion.ToString().ShouldBe(expectedBaseVersion); } @@ -74,8 +86,13 @@ public void CanTakeVersionFromNameOfRemoteReleaseBranch(string branchName, strin Commands.Fetch((Repository)fixture.LocalRepositoryFixture.Repository, fixture.LocalRepositoryFixture.Repository.Network.Remotes.First().Name, Array.Empty(), new FetchOptions(), null); fixture.LocalRepositoryFixture.Checkout($"origin/{branchName}"); - var strategy = GetVersionStrategy(fixture.RepositoryPath, fixture.Repository.ToGitRepository(), branchName); - var baseVersion = strategy.GetVersions().Single(); + var gitRepository = fixture.Repository.ToGitRepository(); + var strategy = GetVersionStrategy(fixture.RepositoryPath, gitRepository, branchName); + + var configuration = TestConfigurationBuilder.New.Build(); + var branchConfiguration = configuration.GetBranchConfiguration(branchName); + var effectiveConfiguration = new EffectiveConfiguration(configuration, branchConfiguration); + var baseVersion = strategy.GetBaseVersions(new(gitRepository.FindBranch(branchName)!, effectiveConfiguration)).Single(); baseVersion.SemanticVersion.ToString().ShouldBe(expectedBaseVersion); } diff --git a/src/GitVersion.Core.Tests/VersionCalculation/TestBaseVersionCalculator.cs b/src/GitVersion.Core.Tests/VersionCalculation/TestBaseVersionCalculator.cs index 48b5ebb761..467f899b8d 100644 --- a/src/GitVersion.Core.Tests/VersionCalculation/TestBaseVersionCalculator.cs +++ b/src/GitVersion.Core.Tests/VersionCalculation/TestBaseVersionCalculator.cs @@ -1,3 +1,4 @@ +using GitVersion.Model.Configuration; using GitVersion.VersionCalculation; namespace GitVersion.Core.Tests.VersionCalculation; @@ -7,13 +8,15 @@ public class TestBaseVersionCalculator : IBaseVersionCalculator private readonly SemanticVersion semanticVersion; private readonly bool shouldIncrement; private readonly ICommit source; + private readonly EffectiveBranchConfiguration configuration; - public TestBaseVersionCalculator(bool shouldIncrement, SemanticVersion semanticVersion, ICommit source) + public TestBaseVersionCalculator(bool shouldIncrement, SemanticVersion semanticVersion, ICommit source, EffectiveBranchConfiguration configuration) { this.semanticVersion = semanticVersion; this.source = source; this.shouldIncrement = shouldIncrement; + this.configuration = configuration; } - public BaseVersion GetBaseVersion() => new("Test source", this.shouldIncrement, this.semanticVersion, this.source, null); + public (BaseVersion, EffectiveBranchConfiguration) GetBaseVersion() => new(new("Test source", this.shouldIncrement, this.semanticVersion, this.source, null), this.configuration); } diff --git a/src/GitVersion.Core.Tests/VersionCalculation/VersionSourceTests.cs b/src/GitVersion.Core.Tests/VersionCalculation/VersionSourceTests.cs index 57dac3edcd..0434ab6fda 100644 --- a/src/GitVersion.Core.Tests/VersionCalculation/VersionSourceTests.cs +++ b/src/GitVersion.Core.Tests/VersionCalculation/VersionSourceTests.cs @@ -24,11 +24,11 @@ public void VersionSourceSha() var nextVersionCalculator = GetNextVersionCalculator(fixture); - var version = nextVersionCalculator.FindVersion(); + var nextVersion = nextVersionCalculator.FindVersion(); - version.BuildMetaData.ShouldNotBeNull(); - version.BuildMetaData.VersionSourceSha.ShouldBe(initialCommit.Sha); - version.BuildMetaData.CommitsSinceVersionSource.ShouldBe(2); + nextVersion.IncrementedVersion.BuildMetaData.ShouldNotBeNull(); + nextVersion.IncrementedVersion.BuildMetaData.VersionSourceSha.ShouldBe(initialCommit.Sha); + nextVersion.IncrementedVersion.BuildMetaData.CommitsSinceVersionSource.ShouldBe(2); } [Test] @@ -39,11 +39,11 @@ public void VersionSourceShaOneCommit() var nextVersionCalculator = GetNextVersionCalculator(fixture); - var version = nextVersionCalculator.FindVersion(); + var nextVersion = nextVersionCalculator.FindVersion(); - version.BuildMetaData.ShouldNotBeNull(); - version.BuildMetaData.VersionSourceSha.ShouldBe(initialCommit.Sha); - version.BuildMetaData.CommitsSinceVersionSource.ShouldBe(0); + nextVersion.IncrementedVersion.BuildMetaData.ShouldNotBeNull(); + nextVersion.IncrementedVersion.BuildMetaData.VersionSourceSha.ShouldBe(initialCommit.Sha); + nextVersion.IncrementedVersion.BuildMetaData.CommitsSinceVersionSource.ShouldBe(0); } [Test] @@ -60,11 +60,11 @@ public void VersionSourceShaUsingTag() var nextVersionCalculator = GetNextVersionCalculator(fixture); - var version = nextVersionCalculator.FindVersion(); + var nextVersion = nextVersionCalculator.FindVersion(); - version.BuildMetaData.ShouldNotBeNull(); - version.BuildMetaData.VersionSourceSha.ShouldBe(secondCommit.Sha); - version.BuildMetaData.CommitsSinceVersionSource.ShouldBe(1); + nextVersion.IncrementedVersion.BuildMetaData.ShouldNotBeNull(); + nextVersion.IncrementedVersion.BuildMetaData.VersionSourceSha.ShouldBe(secondCommit.Sha); + nextVersion.IncrementedVersion.BuildMetaData.CommitsSinceVersionSource.ShouldBe(1); } private static INextVersionCalculator GetNextVersionCalculator(RepositoryFixtureBase fixture) diff --git a/src/GitVersion.Core/Configuration/BranchConfigurationCalculator.cs b/src/GitVersion.Core/Configuration/BranchConfigurationCalculator.cs index fec7c7906c..dc33672dd5 100644 --- a/src/GitVersion.Core/Configuration/BranchConfigurationCalculator.cs +++ b/src/GitVersion.Core/Configuration/BranchConfigurationCalculator.cs @@ -34,7 +34,7 @@ private BranchConfig GetBranchConfigurationInternal(int recursions, IBranch targ throw new InfiniteLoopProtectionException($"Inherited branch configuration caused {recursions} recursions. Aborting!"); } - var matchingBranches = configuration.GetConfigForBranch(targetBranch.Name.WithoutRemote); + var matchingBranches = configuration.ForBranch(targetBranch); if (matchingBranches == null) { diff --git a/src/GitVersion.Core/Configuration/ConfigExtensions.cs b/src/GitVersion.Core/Configuration/ConfigExtensions.cs index 7568c6d984..3edf74d0a3 100644 --- a/src/GitVersion.Core/Configuration/ConfigExtensions.cs +++ b/src/GitVersion.Core/Configuration/ConfigExtensions.cs @@ -7,14 +7,59 @@ namespace GitVersion.Configuration; public static class ConfigExtensions { - public static BranchConfig? GetConfigForBranch(this Config config, string? branchName) + public static BranchConfig GetBranchConfiguration(this Config configuration, IBranch branch) + => GetBranchConfiguration(configuration, branch.NotNull().Name.WithoutRemote); + + public static BranchConfig GetBranchConfiguration(this Config configuration, string branchName) + { + var branchConfiguration = ForBranch(configuration, branchName); + if (branchConfiguration is null) + { + branchConfiguration = GetUnknownBranchConfiguration(configuration); + branchConfiguration.Name = branchName; + } + return branchConfiguration; + } + + // TODO: Please make the unknown settings also configurable in the yaml. + public static BranchConfig GetUnknownBranchConfiguration(this Config configuration) => new() { - if (branchName == null) + Name = "Unknown", + Regex = "", + Tag = "{BranchName}", + VersioningMode = configuration.VersioningMode, + Increment = IncrementStrategy.Inherit + }; + + // TODO: Please make the fallback settings also configurable in the yaml. + public static BranchConfig GetFallbackBranchConfiguration(this Config configuration) + { + var result = new BranchConfig() + { + Name = "Fallback", + Regex = "", + Tag = "{BranchName}", + VersioningMode = configuration.VersioningMode, + Increment = configuration.Increment, + PreventIncrementOfMergedBranchVersion = false, + TrackMergeTarget = false, + TracksReleaseBranches = false, + IsReleaseBranch = false, + IsMainline = false + }; + if (result.Increment == IncrementStrategy.Inherit) { - throw new ArgumentNullException(nameof(branchName)); + result.Increment = IncrementStrategy.None; } + return result; + } + + internal static BranchConfig? ForBranch(this Config configuration, IBranch branch) + => ForBranch(configuration, branch.NotNull().Name.WithoutRemote); - var matches = config.Branches + internal static BranchConfig? ForBranch(this Config configuration, string branchName) + { + var matches = configuration.Branches .Where(b => b.Value?.Regex != null && Regex.IsMatch(branchName, b.Value.Regex, RegexOptions.IgnoreCase)) .ToArray(); @@ -40,7 +85,7 @@ public static class ConfigExtensions } } - public static bool IsReleaseBranch(this Config config, string branchName) => config.GetConfigForBranch(branchName)?.IsReleaseBranch ?? false; + public static bool IsReleaseBranch(this Config config, string branchName) => config.GetBranchConfiguration(branchName).IsReleaseBranch ?? false; public static string GetBranchSpecificTag(this EffectiveConfiguration configuration, ILog log, string? branchFriendlyName, string? branchNameOverride) { diff --git a/src/GitVersion.Core/Configuration/ConfigurationBuilder.cs b/src/GitVersion.Core/Configuration/ConfigurationBuilder.cs index da93481cd8..57aac7e158 100644 --- a/src/GitVersion.Core/Configuration/ConfigurationBuilder.cs +++ b/src/GitVersion.Core/Configuration/ConfigurationBuilder.cs @@ -88,7 +88,7 @@ private static void ApplyBranchOverrides(Config targetConfig, Config overrideCon var branchName = name == Config.MasterBranchKey ? Config.MainBranchKey : name; if (!targetConfigBranches.TryGetValue(branchName, out var target)) { - target = BranchConfig.CreateDefaultBranchConfig(branchName); + target = new BranchConfig() { Name = branchName }; } branchConfig.MergeTo(target); @@ -191,41 +191,59 @@ private static Config CreateDefaultConfiguration() CommitsSinceVersionSourcePadding = 4, CommitDateFormat = "yyyy-MM-dd", UpdateBuildNumber = true, - TagPreReleaseWeight = DefaultTagPreReleaseWeight + TagPreReleaseWeight = DefaultTagPreReleaseWeight, + Increment = IncrementStrategy.Inherit }; AddBranchConfig(Config.DevelopBranchKey, new BranchConfig { + Increment = IncrementStrategy.Minor, Regex = Config.DevelopBranchRegex, SourceBranches = new HashSet(), Tag = "alpha", - Increment = IncrementStrategy.Minor, + PreventIncrementOfMergedBranchVersion = false, TrackMergeTarget = true, TracksReleaseBranches = true, + IsMainline = false, + IsReleaseBranch = false, PreReleaseWeight = 0 }); AddBranchConfig(Config.MainBranchKey, new BranchConfig { + Increment = IncrementStrategy.Patch, Regex = Config.MainBranchRegex, - SourceBranches = new HashSet { Config.DevelopBranchKey, Config.ReleaseBranchKey }, + SourceBranches = new HashSet { + Config.DevelopBranchKey, + Config.ReleaseBranchKey + }, Tag = string.Empty, PreventIncrementOfMergedBranchVersion = true, - Increment = IncrementStrategy.Patch, + TrackMergeTarget = false, + TracksReleaseBranches = false, IsMainline = true, + IsReleaseBranch = false, PreReleaseWeight = 55000 }); AddBranchConfig(Config.ReleaseBranchKey, new BranchConfig { + Increment = IncrementStrategy.None, Regex = Config.ReleaseBranchRegex, - SourceBranches = new HashSet { Config.DevelopBranchKey, Config.MainBranchKey, Config.SupportBranchKey, Config.ReleaseBranchKey }, + SourceBranches = new HashSet { + Config.DevelopBranchKey, + Config.MainBranchKey, + Config.SupportBranchKey, + Config.ReleaseBranchKey + }, Tag = "beta", PreventIncrementOfMergedBranchVersion = true, - Increment = IncrementStrategy.None, + TrackMergeTarget = false, + TracksReleaseBranches = false, + IsMainline = false, IsReleaseBranch = true, PreReleaseWeight = 30000 }); @@ -233,47 +251,79 @@ private static Config CreateDefaultConfiguration() AddBranchConfig(Config.FeatureBranchKey, new BranchConfig { - Regex = Config.FeatureBranchRegex, - SourceBranches = new HashSet { Config.DevelopBranchKey, Config.MainBranchKey, Config.ReleaseBranchKey, Config.FeatureBranchKey, Config.SupportBranchKey, Config.HotfixBranchKey }, Increment = IncrementStrategy.Inherit, + Regex = Config.FeatureBranchRegex, + SourceBranches = new HashSet { + Config.DevelopBranchKey, + Config.MainBranchKey, + Config.ReleaseBranchKey, + Config.FeatureBranchKey, + Config.SupportBranchKey, + Config.HotfixBranchKey + }, + Tag = "{BranchName}", PreReleaseWeight = 30000 }); AddBranchConfig(Config.PullRequestBranchKey, new BranchConfig { + Increment = IncrementStrategy.Inherit, Regex = Config.PullRequestRegex, - SourceBranches = new HashSet { Config.DevelopBranchKey, Config.MainBranchKey, Config.ReleaseBranchKey, Config.FeatureBranchKey, Config.SupportBranchKey, Config.HotfixBranchKey }, + SourceBranches = new HashSet { + Config.DevelopBranchKey, + Config.MainBranchKey, + Config.ReleaseBranchKey, + Config.FeatureBranchKey, + Config.SupportBranchKey, + Config.HotfixBranchKey + }, Tag = "PullRequest", TagNumberPattern = @"[/-](?\d+)", - Increment = IncrementStrategy.Inherit, PreReleaseWeight = 30000 }); AddBranchConfig(Config.HotfixBranchKey, new BranchConfig { + Increment = IncrementStrategy.Patch, Regex = Config.HotfixBranchRegex, - SourceBranches = new HashSet { Config.DevelopBranchKey, Config.MainBranchKey, Config.SupportBranchKey }, + SourceBranches = new HashSet { + Config.ReleaseBranchKey, + Config.MainBranchKey, + Config.SupportBranchKey, + Config.HotfixBranchKey + }, Tag = "beta", - Increment = IncrementStrategy.Patch, + PreventIncrementOfMergedBranchVersion = false, + TrackMergeTarget = false, + TracksReleaseBranches = false, + IsMainline = false, + IsReleaseBranch = false, PreReleaseWeight = 30000 }); AddBranchConfig(Config.SupportBranchKey, new BranchConfig { + Increment = IncrementStrategy.Patch, Regex = Config.SupportBranchRegex, SourceBranches = new HashSet { Config.MainBranchKey }, Tag = string.Empty, PreventIncrementOfMergedBranchVersion = true, - Increment = IncrementStrategy.Patch, + TrackMergeTarget = false, + TracksReleaseBranches = false, IsMainline = true, + IsReleaseBranch = false, PreReleaseWeight = 55000 }); return config; - void AddBranchConfig(string name, BranchConfig overrides) => config.Branches[name] = BranchConfig.CreateDefaultBranchConfig(name).Apply(overrides); + void AddBranchConfig(string name, BranchConfig overrides) + { + var emptyBranchConfiguration = new BranchConfig() { Name = name }; + config.Branches[name] = emptyBranchConfiguration.Apply(overrides); + } } } diff --git a/src/GitVersion.Core/Core/Abstractions/IRepositoryStore.cs b/src/GitVersion.Core/Core/Abstractions/IRepositoryStore.cs index 113472f668..5b0b969fba 100644 --- a/src/GitVersion.Core/Core/Abstractions/IRepositoryStore.cs +++ b/src/GitVersion.Core/Core/Abstractions/IRepositoryStore.cs @@ -1,5 +1,4 @@ using GitVersion.Model.Configuration; -using GitVersion.VersionCalculation; namespace GitVersion.Common; @@ -9,6 +8,7 @@ public interface IRepositoryStore /// Find the merge base of the two branches, i.e. the best common ancestor of the two branches' tips. /// ICommit? FindMergeBase(IBranch? branch, IBranch? otherBranch); + ICommit? FindMergeBase(ICommit commit, ICommit mainlineTip); ICommit? GetCurrentCommit(IBranch currentBranch, string? commitId); ICommit GetBaseVersionSource(ICommit currentBranchTip); @@ -33,13 +33,11 @@ public interface IRepositoryStore /// BranchCommit FindCommitBranchWasBranchedFrom(IBranch? branch, Config configuration, params IBranch[] excludedBranches); - SemanticVersion GetCurrentCommitTaggedVersion(ICommit? commit, EffectiveConfiguration config); - SemanticVersion MaybeIncrement(BaseVersion baseVersion, GitVersionContext context); + SemanticVersion GetCurrentCommitTaggedVersion(ICommit? commit, string? tagPrefix); IEnumerable GetVersionTagsOnBranch(IBranch branch, string? tagPrefixRegex); IEnumerable<(ITag Tag, SemanticVersion Semver, ICommit Commit)> GetValidVersionTags(string? tagPrefixRegex, DateTimeOffset? olderThan = null); bool IsCommitOnBranch(ICommit? baseVersionSource, IBranch branch, ICommit firstMatchingCommit); - VersionField? DetermineIncrementedField(BaseVersion baseVersion, GitVersionContext context); int GetNumberOfUncommittedChanges(); } diff --git a/src/GitVersion.Core/Core/GitVersionCalculateTool.cs b/src/GitVersion.Core/Core/GitVersionCalculateTool.cs index d8db3dc714..9274ec265f 100644 --- a/src/GitVersion.Core/Core/GitVersionCalculateTool.cs +++ b/src/GitVersion.Core/Core/GitVersionCalculateTool.cs @@ -49,8 +49,8 @@ public VersionVariables CalculateVersionVariables() if (versionVariables != null) return versionVariables; - var semanticVersion = this.nextVersionCalculator.FindVersion(); - versionVariables = this.variableProvider.GetVariablesFor(semanticVersion, context.Configuration, context.IsCurrentCommitTagged); + var nextVersion = this.nextVersionCalculator.FindVersion(); + versionVariables = this.variableProvider.GetVariablesFor(nextVersion.IncrementedVersion, nextVersion.Configuration, context.IsCurrentCommitTagged); if (gitVersionOptions.Settings.NoCache) return versionVariables; try diff --git a/src/GitVersion.Core/Core/GitVersionContextFactory.cs b/src/GitVersion.Core/Core/GitVersionContextFactory.cs index 35cb1446e8..0343656554 100644 --- a/src/GitVersion.Core/Core/GitVersionContextFactory.cs +++ b/src/GitVersion.Core/Core/GitVersionContextFactory.cs @@ -1,7 +1,6 @@ using GitVersion.Common; using GitVersion.Configuration; using GitVersion.Extensions; -using GitVersion.Model.Configuration; using Microsoft.Extensions.Options; namespace GitVersion; @@ -10,14 +9,12 @@ public class GitVersionContextFactory : IGitVersionContextFactory { private readonly IConfigProvider configProvider; private readonly IRepositoryStore repositoryStore; - private readonly IBranchConfigurationCalculator branchConfigurationCalculator; private readonly IOptions options; - public GitVersionContextFactory(IConfigProvider configProvider, IRepositoryStore repositoryStore, IBranchConfigurationCalculator branchConfigurationCalculator, IOptions options) + public GitVersionContextFactory(IConfigProvider configProvider, IRepositoryStore repositoryStore, IOptions options) { this.configProvider = configProvider.NotNull(); this.repositoryStore = repositoryStore.NotNull(); - this.branchConfigurationCalculator = branchConfigurationCalculator.NotNull(); this.options = options.NotNull(); } @@ -36,11 +33,9 @@ public GitVersionContext Create(GitVersionOptions gitVersionOptions) currentBranch = branchForCommit ?? currentBranch; } - var currentBranchConfig = this.branchConfigurationCalculator.GetBranchConfiguration(currentBranch, currentCommit, configuration); - var effectiveConfiguration = new EffectiveConfiguration(configuration, currentBranchConfig); - var currentCommitTaggedVersion = this.repositoryStore.GetCurrentCommitTaggedVersion(currentCommit, effectiveConfiguration); + var currentCommitTaggedVersion = this.repositoryStore.GetCurrentCommitTaggedVersion(currentCommit, configuration.TagPrefix); var numberOfUncommittedChanges = this.repositoryStore.GetNumberOfUncommittedChanges(); - return new GitVersionContext(currentBranch, currentCommit, configuration, effectiveConfiguration, currentCommitTaggedVersion, numberOfUncommittedChanges); + return new GitVersionContext(currentBranch, currentCommit, configuration, currentCommitTaggedVersion, numberOfUncommittedChanges); } } diff --git a/src/GitVersion.Core/Core/RepositoryStore.cs b/src/GitVersion.Core/Core/RepositoryStore.cs index e13385e2bf..2ae5ed42a8 100644 --- a/src/GitVersion.Core/Core/RepositoryStore.cs +++ b/src/GitVersion.Core/Core/RepositoryStore.cs @@ -4,23 +4,20 @@ using GitVersion.Extensions; using GitVersion.Logging; using GitVersion.Model.Configuration; -using GitVersion.VersionCalculation; namespace GitVersion; public class RepositoryStore : IRepositoryStore { - private readonly IIncrementStrategyFinder incrementStrategyFinder; private readonly ILog log; private readonly IGitRepository repository; private readonly Dictionary> semanticVersionTagsOnBranchCache = new(); private readonly MergeBaseFinder mergeBaseFinder; - public RepositoryStore(ILog log, IGitRepository repository, IIncrementStrategyFinder incrementStrategyFinder) + public RepositoryStore(ILog log, IGitRepository repository) { this.log = log.NotNull(); this.repository = repository.NotNull(); - this.incrementStrategyFinder = incrementStrategyFinder.NotNull(); this.mergeBaseFinder = new MergeBaseFinder(this, repository, log); } @@ -158,9 +155,9 @@ public IEnumerable GetBranchesForCommit(ICommit commit) public IEnumerable GetExcludedInheritBranches(Config configuration) => this.repository.Branches.Where(b => { - var branchConfig = configuration.GetConfigForBranch(b.Name.WithoutRemote); + var branchConfiguration = configuration.ForBranch(b); - return branchConfig == null || branchConfig.Increment == IncrementStrategy.Inherit; + return branchConfiguration == null || branchConfiguration.Increment == IncrementStrategy.Inherit; }).ToList(); public IEnumerable GetReleaseBranches(IEnumerable> releaseBranchConfig) @@ -213,17 +210,11 @@ public BranchCommit FindCommitBranchWasBranchedFrom(IBranch? branch, Config conf } } - public SemanticVersion GetCurrentCommitTaggedVersion(ICommit? commit, EffectiveConfiguration config) + public SemanticVersion GetCurrentCommitTaggedVersion(ICommit? commit, string? tagPrefix) => this.repository.Tags - .SelectMany(t => GetCurrentCommitSemanticVersions(commit, config, t)) + .SelectMany(t => GetCurrentCommitSemanticVersions(commit, tagPrefix, t)) .Max(); - public SemanticVersion MaybeIncrement(BaseVersion baseVersion, GitVersionContext context) - { - var increment = this.incrementStrategyFinder.DetermineIncrementedField(this.repository, context, baseVersion); - return increment != null ? baseVersion.SemanticVersion.IncrementVersion(increment.Value) : baseVersion.SemanticVersion; - } - public IEnumerable GetVersionTagsOnBranch(IBranch branch, string? tagPrefixRegex) { branch = branch.NotNull(); @@ -276,9 +267,6 @@ public IEnumerable GetCommitLog(ICommit? baseVersionSource, ICommit? cu return this.repository.Commits.QueryBy(filter); } - public VersionField? DetermineIncrementedField(BaseVersion baseVersion, GitVersionContext context) => - this.incrementStrategyFinder.DetermineIncrementedField(this.repository, context, baseVersion); - public bool IsCommitOnBranch(ICommit? baseVersionSource, IBranch branch, ICommit firstMatchingCommit) { var filter = new CommitFilter { IncludeReachableFrom = branch, ExcludeReachableFrom = baseVersionSource, FirstParentOnly = true }; @@ -293,12 +281,12 @@ public bool IsCommitOnBranch(ICommit? baseVersionSource, IBranch branch, ICommit private static bool IsReleaseBranch(INamedReference branch, IEnumerable> releaseBranchConfig) => releaseBranchConfig.Any(c => c.Value?.Regex != null && Regex.IsMatch(branch.Name.Friendly, c.Value.Regex)); - private static IEnumerable GetCurrentCommitSemanticVersions(ICommit? commit, EffectiveConfiguration config, ITag tag) + private static IEnumerable GetCurrentCommitSemanticVersions(ICommit? commit, string? tagPrefix, ITag tag) { var targetCommit = tag.PeeledTargetCommit(); var tagName = tag.Name.Friendly; - return targetCommit != null && Equals(targetCommit, commit) && SemanticVersion.TryParse(tagName, config.GitTagPrefix, out var version) + return targetCommit != null && Equals(targetCommit, commit) && SemanticVersion.TryParse(tagName, tagPrefix, out var version) ? new[] { version } : Array.Empty(); } diff --git a/src/GitVersion.Core/Core/SourceBranchFinder.cs b/src/GitVersion.Core/Core/SourceBranchFinder.cs index 1b90be34f5..d462b38c40 100644 --- a/src/GitVersion.Core/Core/SourceBranchFinder.cs +++ b/src/GitVersion.Core/Core/SourceBranchFinder.cs @@ -47,8 +47,8 @@ public bool IsSourceBranch(INamedReference sourceBranchCandidate) private static IEnumerable GetSourceBranchRegexes(INamedReference branch, Config configuration) { var branchName = branch.Name.WithoutRemote; - var currentBranchConfig = configuration.GetConfigForBranch(branchName); - if (currentBranchConfig?.SourceBranches == null) + var currentBranchConfig = configuration.GetBranchConfiguration(branchName); + if (currentBranchConfig.SourceBranches == null) { yield return ".*"; } diff --git a/src/GitVersion.Core/Extensions/CommonExtensions.cs b/src/GitVersion.Core/Extensions/CommonExtensions.cs index c21577f05d..5cd5018df9 100644 --- a/src/GitVersion.Core/Extensions/CommonExtensions.cs +++ b/src/GitVersion.Core/Extensions/CommonExtensions.cs @@ -7,4 +7,28 @@ public static class CommonExtensions { public static T NotNull([NotNull] this T? value, [CallerArgumentExpression("value")] string name = "") where T : class => value ?? throw new ArgumentNullException(name); + + public static string NotNullOrEmpty([NotNull] this string? value, [CallerArgumentExpression("value")] string name = "") + { + if (string.IsNullOrEmpty(value)) + { + throw new ArgumentException("The parameter is null or empty.", name); + } + +#pragma warning disable CS8777 // Parameter must have a non-null value when exiting. + return value!; +#pragma warning restore CS8777 // Parameter must have a non-null value when exiting. + } + + public static string NotNullOrWhitespace([NotNull] this string? value, [CallerArgumentExpression("value")] string name = "") + { + if (string.IsNullOrWhiteSpace(value)) + { + throw new ArgumentException("The parameter is null or empty or contains only white space.", name); + } + +#pragma warning disable CS8777 // Parameter must have a non-null value when exiting. + return value!; +#pragma warning restore CS8777 // Parameter must have a non-null value when exiting. + } } diff --git a/src/GitVersion.Core/Model/Configuration/EffectiveBranchConfiguration.cs b/src/GitVersion.Core/Model/Configuration/EffectiveBranchConfiguration.cs new file mode 100644 index 0000000000..e45d1afa6c --- /dev/null +++ b/src/GitVersion.Core/Model/Configuration/EffectiveBranchConfiguration.cs @@ -0,0 +1,20 @@ +using GitVersion.Extensions; +using GitVersion.VersionCalculation; + +namespace GitVersion.Model.Configuration; + +public class EffectiveBranchConfiguration +{ + public IBranch Branch { get; } + + public EffectiveConfiguration Value { get; } + + public EffectiveBranchConfiguration(IBranch branch, EffectiveConfiguration value) + { + Branch = branch.NotNull(); + Value = value.NotNull(); + } + + public NextVersion CreateNextVersion(BaseVersion baseVersion, SemanticVersion incrementedVersion) + => new(incrementedVersion.NotNull(), baseVersion.NotNull(), new(Branch, Value)); +} diff --git a/src/GitVersion.Core/Model/Configuration/EffectiveConfiguration.cs b/src/GitVersion.Core/Model/Configuration/EffectiveConfiguration.cs index 1f94252cb2..f0ba2bef63 100644 --- a/src/GitVersion.Core/Model/Configuration/EffectiveConfiguration.cs +++ b/src/GitVersion.Core/Model/Configuration/EffectiveConfiguration.cs @@ -11,7 +11,7 @@ public class EffectiveConfiguration { public EffectiveConfiguration(Config configuration, BranchConfig currentBranchConfig) { - Configuration = configuration.NotNull(); + configuration.NotNull(); currentBranchConfig.NotNull(); var name = currentBranchConfig.Name; @@ -22,18 +22,6 @@ public EffectiveConfiguration(Config configuration, BranchConfig currentBranchCo if (!currentBranchConfig.Increment.HasValue) throw new Exception($"Configuration value for 'Increment' for branch {name} has no value. (this should not happen, please report an issue)"); - if (!currentBranchConfig.PreventIncrementOfMergedBranchVersion.HasValue) - throw new Exception($"Configuration value for 'PreventIncrementOfMergedBranchVersion' for branch {name} has no value. (this should not happen, please report an issue)"); - - if (!currentBranchConfig.TrackMergeTarget.HasValue) - throw new Exception($"Configuration value for 'TrackMergeTarget' for branch {name} has no value. (this should not happen, please report an issue)"); - - if (!currentBranchConfig.TracksReleaseBranches.HasValue) - throw new Exception($"Configuration value for 'TracksReleaseBranches' for branch {name} has no value. (this should not happen, please report an issue)"); - - if (!currentBranchConfig.IsReleaseBranch.HasValue) - throw new Exception($"Configuration value for 'IsReleaseBranch' for branch {name} has no value. (this should not happen, please report an issue)"); - if (!configuration.AssemblyVersioningScheme.HasValue) throw new Exception("Configuration value for 'AssemblyVersioningScheme' has no value. (this should not happen, please report an issue)"); @@ -61,15 +49,15 @@ public EffectiveConfiguration(Config configuration, BranchConfig currentBranchCo AssemblyVersioningFormat = configuration.AssemblyVersioningFormat; AssemblyFileVersioningFormat = configuration.AssemblyFileVersioningFormat; VersioningMode = currentBranchConfig.VersioningMode.Value; - GitTagPrefix = configuration.TagPrefix; - Tag = currentBranchConfig.Tag; + TagPrefix = configuration.TagPrefix; + Tag = currentBranchConfig.Tag ?? @"{BranchName}"; NextVersion = configuration.NextVersion; Increment = currentBranchConfig.Increment.Value; BranchPrefixToTrim = currentBranchConfig.Regex; - PreventIncrementForMergedBranchVersion = currentBranchConfig.PreventIncrementOfMergedBranchVersion.Value; + PreventIncrementOfMergedBranchVersion = currentBranchConfig.PreventIncrementOfMergedBranchVersion ?? false; TagNumberPattern = currentBranchConfig.TagNumberPattern; ContinuousDeploymentFallbackTag = configuration.ContinuousDeploymentFallbackTag; - TrackMergeTarget = currentBranchConfig.TrackMergeTarget.Value; + TrackMergeTarget = currentBranchConfig.TrackMergeTarget ?? false; MajorVersionBumpMessage = configuration.MajorVersionBumpMessage; MinorVersionBumpMessage = configuration.MinorVersionBumpMessage; PatchVersionBumpMessage = configuration.PatchVersionBumpMessage; @@ -79,8 +67,9 @@ public EffectiveConfiguration(Config configuration, BranchConfig currentBranchCo BuildMetaDataPadding = configuration.BuildMetaDataPadding.Value; CommitsSinceVersionSourcePadding = configuration.CommitsSinceVersionSourcePadding.Value; VersionFilters = configuration.Ignore.ToFilters(); - TracksReleaseBranches = currentBranchConfig.TracksReleaseBranches.Value; - IsCurrentBranchRelease = currentBranchConfig.IsReleaseBranch.Value; + TracksReleaseBranches = currentBranchConfig.TracksReleaseBranches ?? false; + IsReleaseBranch = currentBranchConfig.IsReleaseBranch ?? false; + IsMainline = currentBranchConfig.IsMainline ?? false; CommitDateFormat = configuration.CommitDateFormat; UpdateBuildNumber = configuration.UpdateBuildNumber ?? true; PreReleaseWeight = currentBranchConfig.PreReleaseWeight ?? 0; @@ -93,12 +82,12 @@ protected EffectiveConfiguration(AssemblyVersioningScheme assemblyVersioningSche string? assemblyVersioningFormat, string? assemblyFileVersioningFormat, VersioningMode versioningMode, - string? gitTagPrefix, + string? tagPrefix, string? tag, string? nextVersion, IncrementStrategy increment, string? branchPrefixToTrim, - bool preventIncrementForMergedBranchVersion, + bool preventIncrementOfMergedBranchVersion, string? tagNumberPattern, string? continuousDeploymentFallbackTag, bool trackMergeTarget, @@ -112,7 +101,8 @@ protected EffectiveConfiguration(AssemblyVersioningScheme assemblyVersioningSche int commitsSinceVersionSourcePadding, IEnumerable versionFilters, bool tracksReleaseBranches, - bool isCurrentBranchRelease, + bool isReleaseBranch, + bool isMainline, string? commitDateFormat, bool updateBuildNumber, int preReleaseWeight, @@ -124,12 +114,12 @@ protected EffectiveConfiguration(AssemblyVersioningScheme assemblyVersioningSche AssemblyVersioningFormat = assemblyVersioningFormat; AssemblyFileVersioningFormat = assemblyFileVersioningFormat; VersioningMode = versioningMode; - GitTagPrefix = gitTagPrefix; + TagPrefix = tagPrefix; Tag = tag; NextVersion = nextVersion; Increment = increment; BranchPrefixToTrim = branchPrefixToTrim; - PreventIncrementForMergedBranchVersion = preventIncrementForMergedBranchVersion; + PreventIncrementOfMergedBranchVersion = preventIncrementOfMergedBranchVersion; TagNumberPattern = tagNumberPattern; ContinuousDeploymentFallbackTag = continuousDeploymentFallbackTag; TrackMergeTarget = trackMergeTarget; @@ -143,7 +133,8 @@ protected EffectiveConfiguration(AssemblyVersioningScheme assemblyVersioningSche CommitsSinceVersionSourcePadding = commitsSinceVersionSourcePadding; VersionFilters = versionFilters; TracksReleaseBranches = tracksReleaseBranches; - IsCurrentBranchRelease = isCurrentBranchRelease; + IsReleaseBranch = isReleaseBranch; + IsMainline = isMainline; CommitDateFormat = commitDateFormat; UpdateBuildNumber = updateBuildNumber; PreReleaseWeight = preReleaseWeight; @@ -151,7 +142,8 @@ protected EffectiveConfiguration(AssemblyVersioningScheme assemblyVersioningSche } public bool TracksReleaseBranches { get; } - public bool IsCurrentBranchRelease { get; } + public bool IsReleaseBranch { get; } + public bool IsMainline { get; } public VersioningMode VersioningMode { get; } public AssemblyVersioningScheme AssemblyVersioningScheme { get; } public AssemblyFileVersioningScheme AssemblyFileVersioningScheme { get; } @@ -162,7 +154,7 @@ protected EffectiveConfiguration(AssemblyVersioningScheme assemblyVersioningSche /// /// Git tag prefix /// - public string? GitTagPrefix { get; } + public string? TagPrefix { get; } /// /// Tag to use when calculating SemVer @@ -175,7 +167,7 @@ protected EffectiveConfiguration(AssemblyVersioningScheme assemblyVersioningSche public string? BranchPrefixToTrim { get; } - public bool PreventIncrementForMergedBranchVersion { get; } + public bool PreventIncrementOfMergedBranchVersion { get; } public string? TagNumberPattern { get; } @@ -206,6 +198,4 @@ protected EffectiveConfiguration(AssemblyVersioningScheme assemblyVersioningSche public int PreReleaseWeight { get; } public int TagPreReleaseWeight { get; } - - public Config Configuration { get; } } diff --git a/src/GitVersion.Core/Model/GitVersionContext.cs b/src/GitVersion.Core/Model/GitVersionContext.cs index e712a76862..3d303072a6 100644 --- a/src/GitVersion.Core/Model/GitVersionContext.cs +++ b/src/GitVersion.Core/Model/GitVersionContext.cs @@ -1,3 +1,4 @@ +using GitVersion.Configuration; using GitVersion.Model.Configuration; namespace GitVersion; @@ -13,24 +14,28 @@ public class GitVersionContext public Config FullConfiguration { get; } public SemanticVersion? CurrentCommitTaggedVersion { get; } - public EffectiveConfiguration Configuration { get; } + public IBranch CurrentBranch { get; } + public ICommit? CurrentCommit { get; } + public bool IsCurrentCommitTagged => CurrentCommitTaggedVersion != null; public int NumberOfUncommittedChanges { get; } public GitVersionContext(IBranch currentBranch, ICommit? currentCommit, - Config configuration, EffectiveConfiguration effectiveConfiguration, - SemanticVersion currentCommitTaggedVersion, int numberOfUncommittedChanges) + Config configuration, SemanticVersion? currentCommitTaggedVersion, int numberOfUncommittedChanges) { CurrentBranch = currentBranch; CurrentCommit = currentCommit; - FullConfiguration = configuration; - Configuration = effectiveConfiguration; - CurrentCommitTaggedVersion = currentCommitTaggedVersion; NumberOfUncommittedChanges = numberOfUncommittedChanges; } + + public EffectiveConfiguration GetEffectiveConfiguration(IBranch branch) + { + BranchConfig branchConfiguration = FullConfiguration.GetBranchConfiguration(branch); + return new EffectiveConfiguration(FullConfiguration, branchConfiguration); + } } diff --git a/src/GitVersion.Core/PublicAPI.Shipped.txt b/src/GitVersion.Core/PublicAPI.Shipped.txt index 58818b425b..a6814b5b0d 100644 --- a/src/GitVersion.Core/PublicAPI.Shipped.txt +++ b/src/GitVersion.Core/PublicAPI.Shipped.txt @@ -6,6 +6,7 @@ abstract GitVersion.Configuration.Init.Wizard.ConfigInitWizardStep.DefaultResult abstract GitVersion.Configuration.Init.Wizard.ConfigInitWizardStep.GetPrompt(GitVersion.Model.Configuration.Config! config, string! workingDirectory) -> string! abstract GitVersion.Configuration.Init.Wizard.ConfigInitWizardStep.HandleResult(string? result, System.Collections.Generic.Queue! steps, GitVersion.Model.Configuration.Config! config, string! workingDirectory) -> GitVersion.Configuration.Init.StepResult! abstract GitVersion.GitVersionModule.RegisterTypes(Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> void +abstract GitVersion.VersionCalculation.VersionStrategyBase.GetBaseVersions(GitVersion.Model.Configuration.EffectiveBranchConfiguration! configuration) -> System.Collections.Generic.IEnumerable! const GitVersion.BuildAgents.AppVeyor.EnvironmentVariableName = "APPVEYOR" -> string! const GitVersion.BuildAgents.AzurePipelines.EnvironmentVariableName = "TF_BUILD" -> string! const GitVersion.BuildAgents.BitBucketPipelines.BranchEnvironmentVariableName = "BITBUCKET_BRANCH" -> string! @@ -144,7 +145,6 @@ GitVersion.CommitSortStrategies.Reverse = 4 -> GitVersion.CommitSortStrategies GitVersion.CommitSortStrategies.Time = 2 -> GitVersion.CommitSortStrategies GitVersion.CommitSortStrategies.Topological = 1 -> GitVersion.CommitSortStrategies GitVersion.Common.IRepositoryStore -GitVersion.Common.IRepositoryStore.DetermineIncrementedField(GitVersion.VersionCalculation.BaseVersion! baseVersion, GitVersion.GitVersionContext! context) -> GitVersion.VersionField? GitVersion.Common.IRepositoryStore.ExcludingBranches(System.Collections.Generic.IEnumerable! branchesToExclude) -> System.Collections.Generic.IEnumerable! GitVersion.Common.IRepositoryStore.FindBranch(string? branchName) -> GitVersion.IBranch? GitVersion.Common.IRepositoryStore.FindCommitBranchWasBranchedFrom(GitVersion.IBranch? branch, GitVersion.Model.Configuration.Config! configuration, params GitVersion.IBranch![]! excludedBranches) -> GitVersion.BranchCommit @@ -157,7 +157,7 @@ GitVersion.Common.IRepositoryStore.GetBranchesForCommit(GitVersion.ICommit! comm GitVersion.Common.IRepositoryStore.GetChosenBranch(GitVersion.Model.Configuration.Config! configuration) -> GitVersion.IBranch? GitVersion.Common.IRepositoryStore.GetCommitLog(GitVersion.ICommit? baseVersionSource, GitVersion.ICommit? currentCommit) -> System.Collections.Generic.IEnumerable! GitVersion.Common.IRepositoryStore.GetCurrentCommit(GitVersion.IBranch! currentBranch, string? commitId) -> GitVersion.ICommit? -GitVersion.Common.IRepositoryStore.GetCurrentCommitTaggedVersion(GitVersion.ICommit? commit, GitVersion.Model.Configuration.EffectiveConfiguration! config) -> GitVersion.SemanticVersion! +GitVersion.Common.IRepositoryStore.GetCurrentCommitTaggedVersion(GitVersion.ICommit? commit, string? tagPrefix) -> GitVersion.SemanticVersion! GitVersion.Common.IRepositoryStore.GetExcludedInheritBranches(GitVersion.Model.Configuration.Config! configuration) -> System.Collections.Generic.IEnumerable! GitVersion.Common.IRepositoryStore.GetMainlineBranches(GitVersion.ICommit! commit, GitVersion.Model.Configuration.Config! configuration, System.Collections.Generic.IEnumerable>? mainlineBranchConfigs) -> System.Collections.Generic.IDictionary!>! GitVersion.Common.IRepositoryStore.GetMainlineCommitLog(GitVersion.ICommit? baseVersionSource, GitVersion.ICommit? mainlineTip) -> System.Collections.Generic.IEnumerable! @@ -168,7 +168,6 @@ GitVersion.Common.IRepositoryStore.GetTargetBranch(string? targetBranchName) -> GitVersion.Common.IRepositoryStore.GetValidVersionTags(string? tagPrefixRegex, System.DateTimeOffset? olderThan = null) -> System.Collections.Generic.IEnumerable<(GitVersion.ITag! Tag, GitVersion.SemanticVersion! Semver, GitVersion.ICommit! Commit)>! GitVersion.Common.IRepositoryStore.GetVersionTagsOnBranch(GitVersion.IBranch! branch, string? tagPrefixRegex) -> System.Collections.Generic.IEnumerable! GitVersion.Common.IRepositoryStore.IsCommitOnBranch(GitVersion.ICommit? baseVersionSource, GitVersion.IBranch! branch, GitVersion.ICommit! firstMatchingCommit) -> bool -GitVersion.Common.IRepositoryStore.MaybeIncrement(GitVersion.VersionCalculation.BaseVersion! baseVersion, GitVersion.GitVersionContext! context) -> GitVersion.SemanticVersion! GitVersion.ConfigInfo GitVersion.ConfigInfo.ConfigFile -> string? GitVersion.ConfigInfo.ConfigInfo() -> void @@ -328,17 +327,17 @@ GitVersion.GitVersionCalculateTool GitVersion.GitVersionCalculateTool.CalculateVersionVariables() -> GitVersion.OutputVariables.VersionVariables! GitVersion.GitVersionCalculateTool.GitVersionCalculateTool(GitVersion.Logging.ILog! log, GitVersion.VersionCalculation.INextVersionCalculator! nextVersionCalculator, GitVersion.VersionCalculation.IVariableProvider! variableProvider, GitVersion.IGitPreparer! gitPreparer, GitVersion.VersionCalculation.Cache.IGitVersionCache! gitVersionCache, GitVersion.VersionCalculation.Cache.IGitVersionCacheKeyFactory! cacheKeyFactory, Microsoft.Extensions.Options.IOptions! options, System.Lazy! versionContext) -> void GitVersion.GitVersionContext -GitVersion.GitVersionContext.Configuration.get -> GitVersion.Model.Configuration.EffectiveConfiguration! GitVersion.GitVersionContext.CurrentBranch.get -> GitVersion.IBranch! GitVersion.GitVersionContext.CurrentCommit.get -> GitVersion.ICommit? GitVersion.GitVersionContext.CurrentCommitTaggedVersion.get -> GitVersion.SemanticVersion? GitVersion.GitVersionContext.FullConfiguration.get -> GitVersion.Model.Configuration.Config! -GitVersion.GitVersionContext.GitVersionContext(GitVersion.IBranch! currentBranch, GitVersion.ICommit? currentCommit, GitVersion.Model.Configuration.Config! configuration, GitVersion.Model.Configuration.EffectiveConfiguration! effectiveConfiguration, GitVersion.SemanticVersion! currentCommitTaggedVersion, int numberOfUncommittedChanges) -> void +GitVersion.GitVersionContext.GetEffectiveConfiguration(GitVersion.IBranch! branch) -> GitVersion.Model.Configuration.EffectiveConfiguration! +GitVersion.GitVersionContext.GitVersionContext(GitVersion.IBranch! currentBranch, GitVersion.ICommit? currentCommit, GitVersion.Model.Configuration.Config! configuration, GitVersion.SemanticVersion? currentCommitTaggedVersion, int numberOfUncommittedChanges) -> void GitVersion.GitVersionContext.IsCurrentCommitTagged.get -> bool GitVersion.GitVersionContext.NumberOfUncommittedChanges.get -> int GitVersion.GitVersionContextFactory GitVersion.GitVersionContextFactory.Create(GitVersion.GitVersionOptions! gitVersionOptions) -> GitVersion.GitVersionContext! -GitVersion.GitVersionContextFactory.GitVersionContextFactory(GitVersion.Configuration.IConfigProvider! configProvider, GitVersion.Common.IRepositoryStore! repositoryStore, GitVersion.Configuration.IBranchConfigurationCalculator! branchConfigurationCalculator, Microsoft.Extensions.Options.IOptions! options) -> void +GitVersion.GitVersionContextFactory.GitVersionContextFactory(GitVersion.Configuration.IConfigProvider! configProvider, GitVersion.Common.IRepositoryStore! repositoryStore, Microsoft.Extensions.Options.IOptions! options) -> void GitVersion.GitVersionCoreModule GitVersion.GitVersionCoreModule.GitVersionCoreModule() -> void GitVersion.GitVersionCoreModule.RegisterTypes(Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> void @@ -662,6 +661,11 @@ GitVersion.Model.Configuration.Config.UpdateBuildNumber.get -> bool? GitVersion.Model.Configuration.Config.UpdateBuildNumber.set -> void GitVersion.Model.Configuration.Config.VersioningMode.get -> GitVersion.VersionCalculation.VersioningMode? GitVersion.Model.Configuration.Config.VersioningMode.set -> void +GitVersion.Model.Configuration.EffectiveBranchConfiguration +GitVersion.Model.Configuration.EffectiveBranchConfiguration.Branch.get -> GitVersion.IBranch! +GitVersion.Model.Configuration.EffectiveBranchConfiguration.CreateNextVersion(GitVersion.VersionCalculation.BaseVersion! baseVersion, GitVersion.SemanticVersion! incrementedVersion) -> GitVersion.VersionCalculation.NextVersion! +GitVersion.Model.Configuration.EffectiveBranchConfiguration.EffectiveBranchConfiguration(GitVersion.IBranch! branch, GitVersion.Model.Configuration.EffectiveConfiguration! value) -> void +GitVersion.Model.Configuration.EffectiveBranchConfiguration.Value.get -> GitVersion.Model.Configuration.EffectiveConfiguration! GitVersion.Model.Configuration.EffectiveConfiguration GitVersion.Model.Configuration.EffectiveConfiguration.AssemblyFileVersioningFormat.get -> string? GitVersion.Model.Configuration.EffectiveConfiguration.AssemblyFileVersioningScheme.get -> GitVersion.Extensions.AssemblyFileVersioningScheme @@ -673,13 +677,12 @@ GitVersion.Model.Configuration.EffectiveConfiguration.BuildMetaDataPadding.get - GitVersion.Model.Configuration.EffectiveConfiguration.CommitDateFormat.get -> string? GitVersion.Model.Configuration.EffectiveConfiguration.CommitMessageIncrementing.get -> GitVersion.VersionCalculation.CommitMessageIncrementMode GitVersion.Model.Configuration.EffectiveConfiguration.CommitsSinceVersionSourcePadding.get -> int -GitVersion.Model.Configuration.EffectiveConfiguration.Configuration.get -> GitVersion.Model.Configuration.Config! GitVersion.Model.Configuration.EffectiveConfiguration.ContinuousDeploymentFallbackTag.get -> string? -GitVersion.Model.Configuration.EffectiveConfiguration.EffectiveConfiguration(GitVersion.Extensions.AssemblyVersioningScheme assemblyVersioningScheme, GitVersion.Extensions.AssemblyFileVersioningScheme assemblyFileVersioningScheme, string? assemblyInformationalFormat, string? assemblyVersioningFormat, string? assemblyFileVersioningFormat, GitVersion.VersionCalculation.VersioningMode versioningMode, string? gitTagPrefix, string? tag, string? nextVersion, GitVersion.IncrementStrategy increment, string? branchPrefixToTrim, bool preventIncrementForMergedBranchVersion, string? tagNumberPattern, string? continuousDeploymentFallbackTag, bool trackMergeTarget, string? majorVersionBumpMessage, string? minorVersionBumpMessage, string? patchVersionBumpMessage, string? noBumpMessage, GitVersion.VersionCalculation.CommitMessageIncrementMode commitMessageIncrementing, int legacySemVerPaddding, int buildMetaDataPadding, int commitsSinceVersionSourcePadding, System.Collections.Generic.IEnumerable! versionFilters, bool tracksReleaseBranches, bool isCurrentBranchRelease, string? commitDateFormat, bool updateBuildNumber, int preReleaseWeight, int tagPreReleaseWeight) -> void +GitVersion.Model.Configuration.EffectiveConfiguration.EffectiveConfiguration(GitVersion.Extensions.AssemblyVersioningScheme assemblyVersioningScheme, GitVersion.Extensions.AssemblyFileVersioningScheme assemblyFileVersioningScheme, string? assemblyInformationalFormat, string? assemblyVersioningFormat, string? assemblyFileVersioningFormat, GitVersion.VersionCalculation.VersioningMode versioningMode, string? tagPrefix, string? tag, string? nextVersion, GitVersion.IncrementStrategy increment, string? branchPrefixToTrim, bool preventIncrementOfMergedBranchVersion, string? tagNumberPattern, string? continuousDeploymentFallbackTag, bool trackMergeTarget, string? majorVersionBumpMessage, string? minorVersionBumpMessage, string? patchVersionBumpMessage, string? noBumpMessage, GitVersion.VersionCalculation.CommitMessageIncrementMode commitMessageIncrementing, int legacySemVerPaddding, int buildMetaDataPadding, int commitsSinceVersionSourcePadding, System.Collections.Generic.IEnumerable! versionFilters, bool tracksReleaseBranches, bool isReleaseBranch, bool isMainline, string? commitDateFormat, bool updateBuildNumber, int preReleaseWeight, int tagPreReleaseWeight) -> void GitVersion.Model.Configuration.EffectiveConfiguration.EffectiveConfiguration(GitVersion.Model.Configuration.Config! configuration, GitVersion.Model.Configuration.BranchConfig! currentBranchConfig) -> void -GitVersion.Model.Configuration.EffectiveConfiguration.GitTagPrefix.get -> string? GitVersion.Model.Configuration.EffectiveConfiguration.Increment.get -> GitVersion.IncrementStrategy -GitVersion.Model.Configuration.EffectiveConfiguration.IsCurrentBranchRelease.get -> bool +GitVersion.Model.Configuration.EffectiveConfiguration.IsMainline.get -> bool +GitVersion.Model.Configuration.EffectiveConfiguration.IsReleaseBranch.get -> bool GitVersion.Model.Configuration.EffectiveConfiguration.LegacySemVerPadding.get -> int GitVersion.Model.Configuration.EffectiveConfiguration.MajorVersionBumpMessage.get -> string? GitVersion.Model.Configuration.EffectiveConfiguration.MinorVersionBumpMessage.get -> string? @@ -687,9 +690,10 @@ GitVersion.Model.Configuration.EffectiveConfiguration.NextVersion.get -> string? GitVersion.Model.Configuration.EffectiveConfiguration.NoBumpMessage.get -> string? GitVersion.Model.Configuration.EffectiveConfiguration.PatchVersionBumpMessage.get -> string? GitVersion.Model.Configuration.EffectiveConfiguration.PreReleaseWeight.get -> int -GitVersion.Model.Configuration.EffectiveConfiguration.PreventIncrementForMergedBranchVersion.get -> bool +GitVersion.Model.Configuration.EffectiveConfiguration.PreventIncrementOfMergedBranchVersion.get -> bool GitVersion.Model.Configuration.EffectiveConfiguration.Tag.get -> string? GitVersion.Model.Configuration.EffectiveConfiguration.TagNumberPattern.get -> string? +GitVersion.Model.Configuration.EffectiveConfiguration.TagPrefix.get -> string? GitVersion.Model.Configuration.EffectiveConfiguration.TagPreReleaseWeight.get -> int GitVersion.Model.Configuration.EffectiveConfiguration.TrackMergeTarget.get -> bool GitVersion.Model.Configuration.EffectiveConfiguration.TracksReleaseBranches.get -> bool @@ -843,7 +847,6 @@ GitVersion.RepositoryInfo.RepositoryInfo() -> void GitVersion.RepositoryInfo.TargetBranch -> string? GitVersion.RepositoryInfo.TargetUrl -> string? GitVersion.RepositoryStore -GitVersion.RepositoryStore.DetermineIncrementedField(GitVersion.VersionCalculation.BaseVersion! baseVersion, GitVersion.GitVersionContext! context) -> GitVersion.VersionField? GitVersion.RepositoryStore.ExcludingBranches(System.Collections.Generic.IEnumerable! branchesToExclude) -> System.Collections.Generic.IEnumerable! GitVersion.RepositoryStore.FindBranch(string? branchName) -> GitVersion.IBranch? GitVersion.RepositoryStore.FindCommitBranchWasBranchedFrom(GitVersion.IBranch? branch, GitVersion.Model.Configuration.Config! configuration, params GitVersion.IBranch![]! excludedBranches) -> GitVersion.BranchCommit @@ -856,7 +859,7 @@ GitVersion.RepositoryStore.GetBranchesForCommit(GitVersion.ICommit! commit) -> S GitVersion.RepositoryStore.GetChosenBranch(GitVersion.Model.Configuration.Config! configuration) -> GitVersion.IBranch? GitVersion.RepositoryStore.GetCommitLog(GitVersion.ICommit? baseVersionSource, GitVersion.ICommit? currentCommit) -> System.Collections.Generic.IEnumerable! GitVersion.RepositoryStore.GetCurrentCommit(GitVersion.IBranch! currentBranch, string? commitId) -> GitVersion.ICommit? -GitVersion.RepositoryStore.GetCurrentCommitTaggedVersion(GitVersion.ICommit? commit, GitVersion.Model.Configuration.EffectiveConfiguration! config) -> GitVersion.SemanticVersion! +GitVersion.RepositoryStore.GetCurrentCommitTaggedVersion(GitVersion.ICommit? commit, string? tagPrefix) -> GitVersion.SemanticVersion! GitVersion.RepositoryStore.GetExcludedInheritBranches(GitVersion.Model.Configuration.Config! configuration) -> System.Collections.Generic.IEnumerable! GitVersion.RepositoryStore.GetMainlineBranches(GitVersion.ICommit! commit, GitVersion.Model.Configuration.Config! configuration, System.Collections.Generic.IEnumerable>? mainlineBranchConfigs) -> System.Collections.Generic.IDictionary!>! GitVersion.RepositoryStore.GetMainlineCommitLog(GitVersion.ICommit? baseVersionSource, GitVersion.ICommit? mainlineTip) -> System.Collections.Generic.IEnumerable! @@ -867,8 +870,7 @@ GitVersion.RepositoryStore.GetTargetBranch(string? targetBranchName) -> GitVersi GitVersion.RepositoryStore.GetValidVersionTags(string? tagPrefixRegex, System.DateTimeOffset? olderThan = null) -> System.Collections.Generic.IEnumerable<(GitVersion.ITag! Tag, GitVersion.SemanticVersion! Semver, GitVersion.ICommit! Commit)>! GitVersion.RepositoryStore.GetVersionTagsOnBranch(GitVersion.IBranch! branch, string? tagPrefixRegex) -> System.Collections.Generic.IEnumerable! GitVersion.RepositoryStore.IsCommitOnBranch(GitVersion.ICommit? baseVersionSource, GitVersion.IBranch! branch, GitVersion.ICommit! firstMatchingCommit) -> bool -GitVersion.RepositoryStore.MaybeIncrement(GitVersion.VersionCalculation.BaseVersion! baseVersion, GitVersion.GitVersionContext! context) -> GitVersion.SemanticVersion! -GitVersion.RepositoryStore.RepositoryStore(GitVersion.Logging.ILog! log, GitVersion.IGitRepository! repository, GitVersion.VersionCalculation.IIncrementStrategyFinder! incrementStrategyFinder) -> void +GitVersion.RepositoryStore.RepositoryStore(GitVersion.Logging.ILog! log, GitVersion.IGitRepository! repository) -> void GitVersion.SemanticVersion GitVersion.SemanticVersion.BuildMetaData -> GitVersion.SemanticVersionBuildMetaData? GitVersion.SemanticVersion.CompareTo(GitVersion.SemanticVersion! value) -> int @@ -965,8 +967,8 @@ GitVersion.VersionCalculation.BaseVersion.SemanticVersion.get -> GitVersion.Sema GitVersion.VersionCalculation.BaseVersion.ShouldIncrement.get -> bool GitVersion.VersionCalculation.BaseVersion.Source.get -> string! GitVersion.VersionCalculation.BaseVersionCalculator -GitVersion.VersionCalculation.BaseVersionCalculator.BaseVersionCalculator(GitVersion.Logging.ILog! log, GitVersion.Common.IRepositoryStore! repositoryStore, System.Lazy! versionContext, System.Collections.Generic.IEnumerable! strategies) -> void -GitVersion.VersionCalculation.BaseVersionCalculator.GetBaseVersion() -> GitVersion.VersionCalculation.BaseVersion! +GitVersion.VersionCalculation.BaseVersionCalculator.BaseVersionCalculator(GitVersion.Logging.ILog! log, GitVersion.Common.IRepositoryStore! repositoryStore, GitVersion.Configuration.IBranchConfigurationCalculator! branchConfigurationCalculator, GitVersion.VersionCalculation.IIncrementStrategyFinder! incrementStrategyFinder, System.Lazy! versionContext, System.Collections.Generic.IEnumerable! strategies) -> void +GitVersion.VersionCalculation.BaseVersionCalculator.GetBaseVersion() -> (GitVersion.VersionCalculation.BaseVersion!, GitVersion.Model.Configuration.EffectiveBranchConfiguration!) GitVersion.VersionCalculation.Cache.GitVersionCache GitVersion.VersionCalculation.Cache.GitVersionCache.GetCacheDirectory() -> string! GitVersion.VersionCalculation.Cache.GitVersionCache.GitVersionCache(GitVersion.IFileSystem! fileSystem, GitVersion.Logging.ILog! log, GitVersion.IGitRepositoryInfo! repositoryInfo) -> void @@ -990,35 +992,43 @@ GitVersion.VersionCalculation.ConfigNextVersionVersionStrategy.ConfigNextVersion GitVersion.VersionCalculation.FallbackVersionStrategy GitVersion.VersionCalculation.FallbackVersionStrategy.FallbackVersionStrategy(GitVersion.Common.IRepositoryStore! repositoryStore, System.Lazy! versionContext) -> void GitVersion.VersionCalculation.IBaseVersionCalculator -GitVersion.VersionCalculation.IBaseVersionCalculator.GetBaseVersion() -> GitVersion.VersionCalculation.BaseVersion! +GitVersion.VersionCalculation.IBaseVersionCalculator.GetBaseVersion() -> (GitVersion.VersionCalculation.BaseVersion!, GitVersion.Model.Configuration.EffectiveBranchConfiguration!) GitVersion.VersionCalculation.IIncrementStrategyFinder -GitVersion.VersionCalculation.IIncrementStrategyFinder.DetermineIncrementedField(GitVersion.IGitRepository! repository, GitVersion.GitVersionContext! context, GitVersion.VersionCalculation.BaseVersion! baseVersion) -> GitVersion.VersionField? -GitVersion.VersionCalculation.IIncrementStrategyFinder.GetIncrementForCommits(GitVersion.GitVersionContext! context, System.Collections.Generic.IEnumerable! commits) -> GitVersion.VersionField? +GitVersion.VersionCalculation.IIncrementStrategyFinder.DetermineIncrementedField(GitVersion.GitVersionContext! context, GitVersion.VersionCalculation.BaseVersion! baseVersion, GitVersion.Model.Configuration.EffectiveConfiguration! configuration) -> GitVersion.VersionField +GitVersion.VersionCalculation.IIncrementStrategyFinder.GetIncrementForCommits(GitVersion.Model.Configuration.Config! configuration, System.Collections.Generic.IEnumerable! commits) -> GitVersion.VersionField? GitVersion.VersionCalculation.IMainlineVersionCalculator GitVersion.VersionCalculation.IMainlineVersionCalculator.CreateVersionBuildMetaData(GitVersion.ICommit? baseVersionSource) -> GitVersion.SemanticVersionBuildMetaData! GitVersion.VersionCalculation.IMainlineVersionCalculator.FindMainlineModeVersion(GitVersion.VersionCalculation.BaseVersion! baseVersion) -> GitVersion.SemanticVersion! GitVersion.VersionCalculation.IncrementStrategyFinder -GitVersion.VersionCalculation.IncrementStrategyFinder.DetermineIncrementedField(GitVersion.IGitRepository! repository, GitVersion.GitVersionContext! context, GitVersion.VersionCalculation.BaseVersion! baseVersion) -> GitVersion.VersionField? -GitVersion.VersionCalculation.IncrementStrategyFinder.GetIncrementForCommits(GitVersion.GitVersionContext! context, System.Collections.Generic.IEnumerable! commits) -> GitVersion.VersionField? -GitVersion.VersionCalculation.IncrementStrategyFinder.IncrementStrategyFinder() -> void +GitVersion.VersionCalculation.IncrementStrategyFinder.DetermineIncrementedField(GitVersion.GitVersionContext! context, GitVersion.VersionCalculation.BaseVersion! baseVersion, GitVersion.Model.Configuration.EffectiveConfiguration! configuration) -> GitVersion.VersionField +GitVersion.VersionCalculation.IncrementStrategyFinder.GetIncrementForCommits(GitVersion.Model.Configuration.Config! configuration, System.Collections.Generic.IEnumerable! commits) -> GitVersion.VersionField? +GitVersion.VersionCalculation.IncrementStrategyFinder.IncrementStrategyFinder(GitVersion.IGitRepository! repository) -> void GitVersion.VersionCalculation.INextVersionCalculator -GitVersion.VersionCalculation.INextVersionCalculator.FindVersion() -> GitVersion.SemanticVersion! +GitVersion.VersionCalculation.INextVersionCalculator.FindVersion() -> GitVersion.VersionCalculation.NextVersion! GitVersion.VersionCalculation.IVariableProvider GitVersion.VersionCalculation.IVariableProvider.GetVariablesFor(GitVersion.SemanticVersion! semanticVersion, GitVersion.Model.Configuration.EffectiveConfiguration! config, bool isCurrentCommitTagged) -> GitVersion.OutputVariables.VersionVariables! GitVersion.VersionCalculation.IVersionFilter GitVersion.VersionCalculation.IVersionFilter.Exclude(GitVersion.VersionCalculation.BaseVersion! version, out string? reason) -> bool GitVersion.VersionCalculation.IVersionStrategy -GitVersion.VersionCalculation.IVersionStrategy.GetVersions() -> System.Collections.Generic.IEnumerable! +GitVersion.VersionCalculation.IVersionStrategy.GetBaseVersions(GitVersion.Model.Configuration.EffectiveBranchConfiguration! configuration) -> System.Collections.Generic.IEnumerable! GitVersion.VersionCalculation.MergeMessageVersionStrategy GitVersion.VersionCalculation.MergeMessageVersionStrategy.MergeMessageVersionStrategy(GitVersion.Logging.ILog! log, System.Lazy! versionContext) -> void GitVersion.VersionCalculation.MinDateVersionFilter -GitVersion.VersionCalculation.MinDateVersionFilter.Exclude(GitVersion.VersionCalculation.BaseVersion? version, out string? reason) -> bool +GitVersion.VersionCalculation.MinDateVersionFilter.Exclude(GitVersion.VersionCalculation.BaseVersion! version, out string? reason) -> bool GitVersion.VersionCalculation.MinDateVersionFilter.MinDateVersionFilter(System.DateTimeOffset minimum) -> void +GitVersion.VersionCalculation.NextVersion +GitVersion.VersionCalculation.NextVersion.BaseVersion.get -> GitVersion.VersionCalculation.BaseVersion! +GitVersion.VersionCalculation.NextVersion.BaseVersion.set -> void +GitVersion.VersionCalculation.NextVersion.Branch.get -> GitVersion.IBranch! +GitVersion.VersionCalculation.NextVersion.Configuration.get -> GitVersion.Model.Configuration.EffectiveConfiguration! +GitVersion.VersionCalculation.NextVersion.IncrementedVersion.get -> GitVersion.SemanticVersion! +GitVersion.VersionCalculation.NextVersion.NextVersion(GitVersion.SemanticVersion! incrementedVersion, GitVersion.VersionCalculation.BaseVersion! baseVersion, GitVersion.IBranch! branch, GitVersion.Model.Configuration.EffectiveConfiguration! configuration) -> void +GitVersion.VersionCalculation.NextVersion.NextVersion(GitVersion.SemanticVersion! incrementedVersion, GitVersion.VersionCalculation.BaseVersion! baseVersion, GitVersion.Model.Configuration.EffectiveBranchConfiguration! configuration) -> void GitVersion.VersionCalculation.NextVersionCalculator -GitVersion.VersionCalculation.NextVersionCalculator.FindVersion() -> GitVersion.SemanticVersion! -GitVersion.VersionCalculation.NextVersionCalculator.NextVersionCalculator(GitVersion.Logging.ILog! log, GitVersion.VersionCalculation.IBaseVersionCalculator! baseVersionCalculator, GitVersion.VersionCalculation.IMainlineVersionCalculator! mainlineVersionCalculator, GitVersion.Common.IRepositoryStore! repositoryStore, System.Lazy! versionContext) -> void +GitVersion.VersionCalculation.NextVersionCalculator.FindVersion() -> GitVersion.VersionCalculation.NextVersion! +GitVersion.VersionCalculation.NextVersionCalculator.NextVersionCalculator(GitVersion.Logging.ILog! log, GitVersion.VersionCalculation.IBaseVersionCalculator! baseVersionCalculator, GitVersion.VersionCalculation.IMainlineVersionCalculator! mainlineVersionCalculator, GitVersion.Common.IRepositoryStore! repositoryStore, GitVersion.VersionCalculation.IIncrementStrategyFinder! incrementStrategyFinder, System.Lazy! versionContext) -> void GitVersion.VersionCalculation.ShaVersionFilter -GitVersion.VersionCalculation.ShaVersionFilter.Exclude(GitVersion.VersionCalculation.BaseVersion? version, out string? reason) -> bool +GitVersion.VersionCalculation.ShaVersionFilter.Exclude(GitVersion.VersionCalculation.BaseVersion! version, out string? reason) -> bool GitVersion.VersionCalculation.ShaVersionFilter.ShaVersionFilter(System.Collections.Generic.IEnumerable! shas) -> void GitVersion.VersionCalculation.TaggedCommitVersionStrategy GitVersion.VersionCalculation.TaggedCommitVersionStrategy.TaggedCommitVersionStrategy(GitVersion.Common.IRepositoryStore! repositoryStore, System.Lazy! versionContext) -> void @@ -1264,13 +1274,14 @@ override GitVersion.SemanticVersionPreReleaseTag.Equals(object? obj) -> bool override GitVersion.SemanticVersionPreReleaseTag.GetHashCode() -> int override GitVersion.SemanticVersionPreReleaseTag.ToString() -> string! override GitVersion.VersionCalculation.BaseVersion.ToString() -> string! -override GitVersion.VersionCalculation.ConfigNextVersionVersionStrategy.GetVersions() -> System.Collections.Generic.IEnumerable! -override GitVersion.VersionCalculation.FallbackVersionStrategy.GetVersions() -> System.Collections.Generic.IEnumerable! -override GitVersion.VersionCalculation.MergeMessageVersionStrategy.GetVersions() -> System.Collections.Generic.IEnumerable! -override GitVersion.VersionCalculation.TaggedCommitVersionStrategy.GetVersions() -> System.Collections.Generic.IEnumerable! +override GitVersion.VersionCalculation.ConfigNextVersionVersionStrategy.GetBaseVersions(GitVersion.Model.Configuration.EffectiveBranchConfiguration! configuration) -> System.Collections.Generic.IEnumerable! +override GitVersion.VersionCalculation.FallbackVersionStrategy.GetBaseVersions(GitVersion.Model.Configuration.EffectiveBranchConfiguration! configuration) -> System.Collections.Generic.IEnumerable! +override GitVersion.VersionCalculation.MergeMessageVersionStrategy.GetBaseVersions(GitVersion.Model.Configuration.EffectiveBranchConfiguration! configuration) -> System.Collections.Generic.IEnumerable! +override GitVersion.VersionCalculation.NextVersion.ToString() -> string! +override GitVersion.VersionCalculation.TaggedCommitVersionStrategy.GetBaseVersions(GitVersion.Model.Configuration.EffectiveBranchConfiguration! configuration) -> System.Collections.Generic.IEnumerable! override GitVersion.VersionCalculation.TaggedCommitVersionStrategy.VersionTaggedCommit.ToString() -> string! -override GitVersion.VersionCalculation.TrackReleaseBranchesVersionStrategy.GetVersions() -> System.Collections.Generic.IEnumerable! -override GitVersion.VersionCalculation.VersionInBranchNameVersionStrategy.GetVersions() -> System.Collections.Generic.IEnumerable! +override GitVersion.VersionCalculation.TrackReleaseBranchesVersionStrategy.GetBaseVersions(GitVersion.Model.Configuration.EffectiveBranchConfiguration! configuration) -> System.Collections.Generic.IEnumerable! +override GitVersion.VersionCalculation.VersionInBranchNameVersionStrategy.GetBaseVersions(GitVersion.Model.Configuration.EffectiveBranchConfiguration! configuration) -> System.Collections.Generic.IEnumerable! override GitVersion.VersionCalculation.VersionStrategyModule.RegisterTypes(Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> void readonly GitVersion.BuildAgents.BuildAgentBase.Log -> GitVersion.Logging.ILog! readonly GitVersion.Configuration.Init.Wizard.ConfigInitWizardStep.Console -> GitVersion.Logging.IConsole! @@ -1279,9 +1290,12 @@ readonly GitVersion.Configuration.Init.Wizard.ConfigInitWizardStep.Log -> GitVer readonly GitVersion.Configuration.Init.Wizard.ConfigInitWizardStep.StepFactory -> GitVersion.Configuration.Init.Wizard.IConfigInitStepFactory! static GitVersion.BranchCommit.operator !=(GitVersion.BranchCommit left, GitVersion.BranchCommit right) -> bool static GitVersion.BranchCommit.operator ==(GitVersion.BranchCommit left, GitVersion.BranchCommit right) -> bool +static GitVersion.Configuration.ConfigExtensions.GetBranchConfiguration(this GitVersion.Model.Configuration.Config! configuration, GitVersion.IBranch! branch) -> GitVersion.Model.Configuration.BranchConfig! +static GitVersion.Configuration.ConfigExtensions.GetBranchConfiguration(this GitVersion.Model.Configuration.Config! configuration, string! branchName) -> GitVersion.Model.Configuration.BranchConfig! static GitVersion.Configuration.ConfigExtensions.GetBranchSpecificTag(this GitVersion.Model.Configuration.EffectiveConfiguration! configuration, GitVersion.Logging.ILog! log, string? branchFriendlyName, string? branchNameOverride) -> string! -static GitVersion.Configuration.ConfigExtensions.GetConfigForBranch(this GitVersion.Model.Configuration.Config! config, string? branchName) -> GitVersion.Model.Configuration.BranchConfig? +static GitVersion.Configuration.ConfigExtensions.GetFallbackBranchConfiguration(this GitVersion.Model.Configuration.Config! configuration) -> GitVersion.Model.Configuration.BranchConfig! static GitVersion.Configuration.ConfigExtensions.GetReleaseBranchConfig(this GitVersion.Model.Configuration.Config! configuration) -> System.Collections.Generic.List>! +static GitVersion.Configuration.ConfigExtensions.GetUnknownBranchConfiguration(this GitVersion.Model.Configuration.Config! configuration) -> GitVersion.Model.Configuration.BranchConfig! static GitVersion.Configuration.ConfigExtensions.IsReleaseBranch(this GitVersion.Model.Configuration.Config! config, string! branchName) -> bool static GitVersion.Configuration.ConfigSerializer.Read(System.IO.TextReader! reader) -> GitVersion.Model.Configuration.Config! static GitVersion.Configuration.ConfigSerializer.Write(GitVersion.Model.Configuration.Config! config, System.IO.TextWriter! writer) -> void @@ -1292,6 +1306,8 @@ static GitVersion.Configuration.Init.StepResult.SaveAndExit() -> GitVersion.Conf static GitVersion.Extensions.AssemblyVersionsGeneratorExtensions.GetAssemblyFileVersion(this GitVersion.SemanticVersion! sv, GitVersion.Extensions.AssemblyFileVersioningScheme scheme) -> string? static GitVersion.Extensions.AssemblyVersionsGeneratorExtensions.GetAssemblyVersion(this GitVersion.SemanticVersion! sv, GitVersion.Extensions.AssemblyVersioningScheme scheme) -> string? static GitVersion.Extensions.CommonExtensions.NotNull(this T? value, string! name = "") -> T! +static GitVersion.Extensions.CommonExtensions.NotNullOrEmpty(this string? value, string! name = "") -> string! +static GitVersion.Extensions.CommonExtensions.NotNullOrWhitespace(this string? value, string! name = "") -> string! static GitVersion.Extensions.DictionaryExtensions.GetOrAdd(this System.Collections.Generic.IDictionary! dict, TKey key, System.Func! getValue) -> TValue static GitVersion.Extensions.EnumerableExtensions.OnlyOrDefault(this System.Collections.Generic.IEnumerable! source) -> T? static GitVersion.Extensions.GitExtensions.CreateGitLogArgs(int? maxCommits) -> string! @@ -1397,4 +1413,3 @@ virtual GitVersion.BuildAgents.BuildAgentBase.WriteIntegration(System.Action bool virtual GitVersion.Model.Configuration.IgnoreConfig.ToFilters() -> System.Collections.Generic.IEnumerable! virtual GitVersion.VersionCalculation.TaggedCommitVersionStrategy.FormatSource(GitVersion.VersionCalculation.TaggedCommitVersionStrategy.VersionTaggedCommit! version) -> string! -virtual GitVersion.VersionCalculation.VersionStrategyBase.GetVersions() -> System.Collections.Generic.IEnumerable! diff --git a/src/GitVersion.Core/VersionCalculation/Abstractions/IBaseVersionCalculator.cs b/src/GitVersion.Core/VersionCalculation/Abstractions/IBaseVersionCalculator.cs index b95118b1b0..7ed1497cd6 100644 --- a/src/GitVersion.Core/VersionCalculation/Abstractions/IBaseVersionCalculator.cs +++ b/src/GitVersion.Core/VersionCalculation/Abstractions/IBaseVersionCalculator.cs @@ -1,6 +1,8 @@ +using GitVersion.Model.Configuration; + namespace GitVersion.VersionCalculation; public interface IBaseVersionCalculator { - BaseVersion GetBaseVersion(); + (BaseVersion, EffectiveBranchConfiguration) GetBaseVersion(); } diff --git a/src/GitVersion.Core/VersionCalculation/Abstractions/IIncrementStrategyFinder.cs b/src/GitVersion.Core/VersionCalculation/Abstractions/IIncrementStrategyFinder.cs index f7fe1130fb..5616a13286 100644 --- a/src/GitVersion.Core/VersionCalculation/Abstractions/IIncrementStrategyFinder.cs +++ b/src/GitVersion.Core/VersionCalculation/Abstractions/IIncrementStrategyFinder.cs @@ -1,7 +1,10 @@ +using GitVersion.Model.Configuration; + namespace GitVersion.VersionCalculation; public interface IIncrementStrategyFinder { - VersionField? DetermineIncrementedField(IGitRepository repository, GitVersionContext context, BaseVersion baseVersion); - VersionField? GetIncrementForCommits(GitVersionContext context, IEnumerable commits); + VersionField DetermineIncrementedField(GitVersionContext context, BaseVersion baseVersion, EffectiveConfiguration configuration); + + VersionField? GetIncrementForCommits(Config configuration, IEnumerable commits); } diff --git a/src/GitVersion.Core/VersionCalculation/Abstractions/INextVersionCalculator.cs b/src/GitVersion.Core/VersionCalculation/Abstractions/INextVersionCalculator.cs index 03bc8082db..b1ee00577d 100644 --- a/src/GitVersion.Core/VersionCalculation/Abstractions/INextVersionCalculator.cs +++ b/src/GitVersion.Core/VersionCalculation/Abstractions/INextVersionCalculator.cs @@ -2,5 +2,5 @@ namespace GitVersion.VersionCalculation; public interface INextVersionCalculator { - SemanticVersion FindVersion(); + NextVersion FindVersion(); } diff --git a/src/GitVersion.Core/VersionCalculation/Abstractions/IVersionStrategy.cs b/src/GitVersion.Core/VersionCalculation/Abstractions/IVersionStrategy.cs index 02cc9b4b9f..a3b27fbc10 100644 --- a/src/GitVersion.Core/VersionCalculation/Abstractions/IVersionStrategy.cs +++ b/src/GitVersion.Core/VersionCalculation/Abstractions/IVersionStrategy.cs @@ -1,3 +1,5 @@ +using GitVersion.Model.Configuration; + namespace GitVersion.VersionCalculation; public interface IVersionStrategy @@ -8,5 +10,5 @@ public interface IVersionStrategy /// /// An of the base version values found by the strategy. /// - IEnumerable GetVersions(); + IEnumerable GetBaseVersions(EffectiveBranchConfiguration configuration); } diff --git a/src/GitVersion.Core/VersionCalculation/BaseVersionCalculator.cs b/src/GitVersion.Core/VersionCalculation/BaseVersionCalculator.cs index 62542bad17..c7af4273c3 100644 --- a/src/GitVersion.Core/VersionCalculation/BaseVersionCalculator.cs +++ b/src/GitVersion.Core/VersionCalculation/BaseVersionCalculator.cs @@ -2,6 +2,7 @@ using GitVersion.Configuration; using GitVersion.Extensions; using GitVersion.Logging; +using GitVersion.Model.Configuration; namespace GitVersion.VersionCalculation; @@ -9,36 +10,52 @@ public class BaseVersionCalculator : IBaseVersionCalculator { private readonly ILog log; private readonly IRepositoryStore repositoryStore; + private readonly IBranchConfigurationCalculator branchConfigurationCalculator; + private readonly IIncrementStrategyFinder incrementStrategyFinder; private readonly IVersionStrategy[] strategies; private readonly Lazy versionContext; private GitVersionContext context => this.versionContext.Value; - public BaseVersionCalculator(ILog log, IRepositoryStore repositoryStore, Lazy versionContext, IEnumerable strategies) + public BaseVersionCalculator(ILog log, IRepositoryStore repositoryStore, + IBranchConfigurationCalculator branchConfigurationCalculator, IIncrementStrategyFinder incrementStrategyFinder, Lazy versionContext, IEnumerable strategies) { this.log = log.NotNull(); this.repositoryStore = repositoryStore.NotNull(); + this.branchConfigurationCalculator = branchConfigurationCalculator.NotNull(); + this.incrementStrategyFinder = incrementStrategyFinder.NotNull(); this.strategies = strategies.ToArray(); this.versionContext = versionContext.NotNull(); } - public BaseVersion GetBaseVersion() + public (BaseVersion, EffectiveBranchConfiguration) GetBaseVersion() { using (this.log.IndentLog("Calculating base versions")) { + if (this.context.CurrentBranch.Tip == null) + throw new GitVersionException("No commits found on the current branch."); + + var currentBranchConfig = this.branchConfigurationCalculator.GetBranchConfiguration( + targetBranch: this.context.CurrentBranch, + currentCommit: this.context.CurrentCommit, + configuration: this.context.FullConfiguration + ); + var effectiveConfiguration = new EffectiveConfiguration(this.context.FullConfiguration, currentBranchConfig); + var effectiveBranchConfiguration = new EffectiveBranchConfiguration(this.context.CurrentBranch, effectiveConfiguration); + var allVersions = new List(); foreach (var strategy in this.strategies) { - var baseVersions = GetBaseVersions(strategy).ToList(); + var baseVersions = GetBaseVersions(strategy, effectiveBranchConfiguration).ToList(); allVersions.AddRange(baseVersions); } var versions = allVersions - .Select(baseVersion => new Versions { IncrementedVersion = this.repositoryStore.MaybeIncrement(baseVersion, context), Version = baseVersion }) + .Select(baseVersion => new Versions { IncrementedVersion = MaybeIncrement(baseVersion, effectiveConfiguration), Version = baseVersion }) .ToList(); FixTheBaseVersionSourceOfMergeMessageStrategyIfReleaseBranchWasMergedAndDeleted(versions); - if (context.Configuration.VersioningMode == VersioningMode.Mainline) + if (context.FullConfiguration.VersioningMode == VersioningMode.Mainline) { versions = versions .Where(b => b.IncrementedVersion.PreReleaseTag?.HasTag() != true) @@ -94,12 +111,25 @@ static Versions CompareVersions(Versions versions1, Versions version2) this.log.Info($"Base version used: {calculatedBase}"); - return calculatedBase; + return new(calculatedBase, effectiveBranchConfiguration); } } - private IEnumerable GetBaseVersions(IVersionStrategy strategy) + + private SemanticVersion MaybeIncrement(BaseVersion baseVersion, EffectiveConfiguration configuration) + { + var incrementStrategy = this.incrementStrategyFinder.DetermineIncrementedField( + context: context, + baseVersion: baseVersion, + configuration: configuration + ); + return incrementStrategy == VersionField.None + ? baseVersion.SemanticVersion + : baseVersion.SemanticVersion.IncrementVersion(incrementStrategy); + } + + private IEnumerable GetBaseVersions(IVersionStrategy strategy, EffectiveBranchConfiguration configuration) { - foreach (var version in strategy.GetVersions()) + foreach (var version in strategy.GetBaseVersions(configuration)) { if (version == null) continue; @@ -112,7 +142,7 @@ private IEnumerable GetBaseVersions(IVersionStrategy strategy) } private bool IncludeVersion(BaseVersion version) { - foreach (var filter in context.Configuration.VersionFilters) + foreach (var filter in context.FullConfiguration.Ignore.ToFilters()) { if (filter.Exclude(version, out var reason)) { diff --git a/src/GitVersion.Core/VersionCalculation/BaseVersionCalculators/ConfigNextVersionVersionStrategy.cs b/src/GitVersion.Core/VersionCalculation/BaseVersionCalculators/ConfigNextVersionVersionStrategy.cs index be3ad26160..f0945ecb35 100644 --- a/src/GitVersion.Core/VersionCalculation/BaseVersionCalculators/ConfigNextVersionVersionStrategy.cs +++ b/src/GitVersion.Core/VersionCalculation/BaseVersionCalculators/ConfigNextVersionVersionStrategy.cs @@ -1,4 +1,5 @@ using GitVersion.Extensions; +using GitVersion.Model.Configuration; namespace GitVersion.VersionCalculation; @@ -13,12 +14,13 @@ public ConfigNextVersionVersionStrategy(Lazy versionContext) { } - public override IEnumerable GetVersions() + public override IEnumerable GetBaseVersions(EffectiveBranchConfiguration configuration) { - var nextVersion = Context.Configuration.NextVersion; - if (nextVersion.IsNullOrEmpty() || Context.IsCurrentCommitTagged) - yield break; - var semanticVersion = SemanticVersion.Parse(nextVersion, Context.Configuration.GitTagPrefix); - yield return new BaseVersion("NextVersion in GitVersion configuration file", false, semanticVersion, null, null); + var nextVersion = Context.FullConfiguration.NextVersion; + if (!nextVersion.IsNullOrEmpty() && !Context.IsCurrentCommitTagged) + { + var semanticVersion = SemanticVersion.Parse(nextVersion, Context.FullConfiguration.TagPrefix); + yield return new BaseVersion("NextVersion in GitVersion configuration file", false, semanticVersion, null, null); + } } } diff --git a/src/GitVersion.Core/VersionCalculation/BaseVersionCalculators/FallbackVersionStrategy.cs b/src/GitVersion.Core/VersionCalculation/BaseVersionCalculators/FallbackVersionStrategy.cs index 3788d06b7e..e1e7f5ad46 100644 --- a/src/GitVersion.Core/VersionCalculation/BaseVersionCalculators/FallbackVersionStrategy.cs +++ b/src/GitVersion.Core/VersionCalculation/BaseVersionCalculators/FallbackVersionStrategy.cs @@ -1,4 +1,5 @@ using GitVersion.Common; +using GitVersion.Model.Configuration; namespace GitVersion.VersionCalculation; @@ -12,7 +13,8 @@ public class FallbackVersionStrategy : VersionStrategyBase private readonly IRepositoryStore repositoryStore; public FallbackVersionStrategy(IRepositoryStore repositoryStore, Lazy versionContext) : base(versionContext) => this.repositoryStore = repositoryStore; - public override IEnumerable GetVersions() + + public override IEnumerable GetBaseVersions(EffectiveBranchConfiguration configuration) { var currentBranchTip = Context.CurrentBranch.Tip; if (currentBranchTip == null) diff --git a/src/GitVersion.Core/VersionCalculation/BaseVersionCalculators/MergeMessageVersionStrategy.cs b/src/GitVersion.Core/VersionCalculation/BaseVersionCalculators/MergeMessageVersionStrategy.cs index 15a16312f9..12ae7565eb 100644 --- a/src/GitVersion.Core/VersionCalculation/BaseVersionCalculators/MergeMessageVersionStrategy.cs +++ b/src/GitVersion.Core/VersionCalculation/BaseVersionCalculators/MergeMessageVersionStrategy.cs @@ -3,21 +3,23 @@ using GitVersion.Configuration; using GitVersion.Extensions; using GitVersion.Logging; +using GitVersion.Model.Configuration; namespace GitVersion.VersionCalculation; /// /// Version is extracted from older commits' merge messages. /// BaseVersionSource is the commit where the message was found. -/// Increments if PreventIncrementForMergedBranchVersion (from the branch config) is false. +/// Increments if PreventIncrementOfMergedBranchVersion (from the branch config) is false. /// public class MergeMessageVersionStrategy : VersionStrategyBase { private readonly ILog log; - public MergeMessageVersionStrategy(ILog log, Lazy versionContext) : base(versionContext) => this.log = log.NotNull(); + public MergeMessageVersionStrategy(ILog log, Lazy versionContext) + : base(versionContext) => this.log = log.NotNull(); - public override IEnumerable GetVersions() + public override IEnumerable GetBaseVersions(EffectiveBranchConfiguration configuration) { if (Context.CurrentBranch.Commits == null || Context.CurrentCommit == null) return Enumerable.Empty(); @@ -31,7 +33,7 @@ public override IEnumerable GetVersions() Context.FullConfiguration.IsReleaseBranch(TrimRemote(mergeMessage.MergedBranch))) { this.log.Info($"Found commit [{Context.CurrentCommit}] matching merge message format: {mergeMessage.FormatName}"); - var shouldIncrement = Context.Configuration.PreventIncrementForMergedBranchVersion != true; + var shouldIncrement = !configuration.Value.PreventIncrementOfMergedBranchVersion; return new[] { new BaseVersion($"{MergeMessageStrategyPrefix} '{c.Message.Trim()}'", shouldIncrement, mergeMessage.Version, c, null) diff --git a/src/GitVersion.Core/VersionCalculation/BaseVersionCalculators/TaggedCommitVersionStrategy.cs b/src/GitVersion.Core/VersionCalculation/BaseVersionCalculators/TaggedCommitVersionStrategy.cs index 5da8e03887..9157b4a2a8 100644 --- a/src/GitVersion.Core/VersionCalculation/BaseVersionCalculators/TaggedCommitVersionStrategy.cs +++ b/src/GitVersion.Core/VersionCalculation/BaseVersionCalculators/TaggedCommitVersionStrategy.cs @@ -1,5 +1,6 @@ using GitVersion.Common; using GitVersion.Extensions; +using GitVersion.Model.Configuration; namespace GitVersion.VersionCalculation; @@ -12,16 +13,17 @@ public class TaggedCommitVersionStrategy : VersionStrategyBase { private readonly IRepositoryStore repositoryStore; - public TaggedCommitVersionStrategy(IRepositoryStore repositoryStore, Lazy versionContext) : base(versionContext) => this.repositoryStore = repositoryStore.NotNull(); + public TaggedCommitVersionStrategy(IRepositoryStore repositoryStore, Lazy versionContext) + : base(versionContext) => this.repositoryStore = repositoryStore.NotNull(); - public override IEnumerable GetVersions() => + public override IEnumerable GetBaseVersions(EffectiveBranchConfiguration configuration) => GetTaggedVersions(Context.CurrentBranch, Context.CurrentCommit?.When); - internal IEnumerable GetTaggedVersions(IBranch? currentBranch, DateTimeOffset? olderThan) + internal IEnumerable GetTaggedVersions(IBranch currentBranch, DateTimeOffset? olderThan) { if (currentBranch is null) return Enumerable.Empty(); - var versionTags = this.repositoryStore.GetValidVersionTags(Context.Configuration.GitTagPrefix, olderThan); + var versionTags = this.repositoryStore.GetValidVersionTags(Context.FullConfiguration.TagPrefix, olderThan); var versionTagsByCommit = versionTags.ToLookup(vt => vt.Item3.Id.Sha); var commitsOnBranch = currentBranch.Commits; if (commitsOnBranch == null) diff --git a/src/GitVersion.Core/VersionCalculation/BaseVersionCalculators/TrackReleaseBranchesVersionStrategy.cs b/src/GitVersion.Core/VersionCalculation/BaseVersionCalculators/TrackReleaseBranchesVersionStrategy.cs index 6cbdfd4ad0..2053c2aaa8 100644 --- a/src/GitVersion.Core/VersionCalculation/BaseVersionCalculators/TrackReleaseBranchesVersionStrategy.cs +++ b/src/GitVersion.Core/VersionCalculation/BaseVersionCalculators/TrackReleaseBranchesVersionStrategy.cs @@ -1,6 +1,7 @@ using GitVersion.Common; using GitVersion.Configuration; using GitVersion.Extensions; +using GitVersion.Model.Configuration; namespace GitVersion.VersionCalculation; @@ -22,11 +23,10 @@ namespace GitVersion.VersionCalculation; /// public class TrackReleaseBranchesVersionStrategy : VersionStrategyBase { - private readonly IRepositoryStore repositoryStore; private readonly VersionInBranchNameVersionStrategy releaseVersionStrategy; private readonly TaggedCommitVersionStrategy taggedCommitVersionStrategy; - private readonly Lazy context; + private readonly IRepositoryStore repositoryStore; public TrackReleaseBranchesVersionStrategy(IRepositoryStore repositoryStore, Lazy versionContext) : base(versionContext) @@ -34,21 +34,18 @@ public TrackReleaseBranchesVersionStrategy(IRepositoryStore repositoryStore, Laz this.repositoryStore = repositoryStore.NotNull(); this.releaseVersionStrategy = new VersionInBranchNameVersionStrategy(repositoryStore, versionContext); this.taggedCommitVersionStrategy = new TaggedCommitVersionStrategy(repositoryStore, versionContext); - this.context = versionContext.NotNull(); } - public override IEnumerable GetVersions() => - Context.Configuration.TracksReleaseBranches - ? ReleaseBranchBaseVersions().Union(MainTagsVersions()) - : Array.Empty(); + public override IEnumerable GetBaseVersions(EffectiveBranchConfiguration configuration) => + configuration.Value.TracksReleaseBranches ? ReleaseBranchBaseVersions().Union(MainTagsVersions()) : Array.Empty(); private IEnumerable MainTagsVersions() { - var configuration = this.context.Value.Configuration.Configuration; - var main = this.repositoryStore.FindMainBranch(configuration); + var configuration = Context.FullConfiguration; + var mainBranch = this.repositoryStore.FindMainBranch(configuration); - return main != null - ? this.taggedCommitVersionStrategy.GetTaggedVersions(main, null) + return mainBranch != null + ? this.taggedCommitVersionStrategy.GetTaggedVersions(mainBranch, null) : Array.Empty(); } @@ -61,7 +58,7 @@ private IEnumerable ReleaseBranchBaseVersions() var releaseBranches = this.repositoryStore.GetReleaseBranches(releaseBranchConfig); return releaseBranches - .SelectMany(b => GetReleaseVersion(Context, b)) + .SelectMany(b => GetReleaseVersion(b)) .Select(baseVersion => { // Need to drop branch overrides and give a bit more context about @@ -76,20 +73,19 @@ private IEnumerable ReleaseBranchBaseVersions() .ToList(); } - private IEnumerable GetReleaseVersion(GitVersionContext context, IBranch? releaseBranch) + private IEnumerable GetReleaseVersion(IBranch releaseBranch) { - var tagPrefixRegex = context.Configuration.GitTagPrefix; - // Find the commit where the child branch was created. - var baseSource = this.repositoryStore.FindMergeBase(releaseBranch, context.CurrentBranch); - if (Equals(baseSource, context.CurrentCommit)) + var baseSource = this.repositoryStore.FindMergeBase(releaseBranch, Context.CurrentBranch); + if (Equals(baseSource, Context.CurrentCommit)) { // Ignore the branch if it has no commits. return Array.Empty(); } + var configuration = Context.GetEffectiveConfiguration(releaseBranch); return this.releaseVersionStrategy - .GetVersions(tagPrefixRegex, releaseBranch) + .GetBaseVersions(new(releaseBranch, configuration)) .Select(b => new BaseVersion(b.Source, true, b.SemanticVersion, baseSource, b.BranchNameOverride)); } } diff --git a/src/GitVersion.Core/VersionCalculation/BaseVersionCalculators/VersionInBranchNameVersionStrategy.cs b/src/GitVersion.Core/VersionCalculation/BaseVersionCalculators/VersionInBranchNameVersionStrategy.cs index 72a3a639c4..85fb716945 100644 --- a/src/GitVersion.Core/VersionCalculation/BaseVersionCalculators/VersionInBranchNameVersionStrategy.cs +++ b/src/GitVersion.Core/VersionCalculation/BaseVersionCalculators/VersionInBranchNameVersionStrategy.cs @@ -1,6 +1,7 @@ using GitVersion.Common; using GitVersion.Configuration; using GitVersion.Extensions; +using GitVersion.Model.Configuration; namespace GitVersion.VersionCalculation; @@ -13,30 +14,21 @@ public class VersionInBranchNameVersionStrategy : VersionStrategyBase { private readonly IRepositoryStore repositoryStore; - public VersionInBranchNameVersionStrategy(IRepositoryStore repositoryStore, Lazy versionContext) : base(versionContext) => this.repositoryStore = repositoryStore.NotNull(); + public VersionInBranchNameVersionStrategy(IRepositoryStore repositoryStore, Lazy versionContext) + : base(versionContext) => this.repositoryStore = repositoryStore.NotNull(); - public override IEnumerable GetVersions() + public override IEnumerable GetBaseVersions(EffectiveBranchConfiguration configuration) { - var currentBranch = Context.CurrentBranch; - var tagPrefixRegex = Context.Configuration.GitTagPrefix; - return GetVersions(tagPrefixRegex, currentBranch); - } - - internal IEnumerable GetVersions(string? tagPrefixRegex, IBranch? currentBranch) - { - if (currentBranch == null || - Context.FullConfiguration.IsReleaseBranch(NameWithoutOrigin(currentBranch)) != true) - { - yield break; - } - - var branchName = currentBranch.Name.Friendly; - var versionInBranch = GetVersionInBranch(branchName, tagPrefixRegex); - if (versionInBranch != null) + string nameWithoutOrigin = NameWithoutOrigin(configuration.Branch); + if (Context.FullConfiguration.IsReleaseBranch(nameWithoutOrigin)) { - var commitBranchWasBranchedFrom = this.repositoryStore.FindCommitBranchWasBranchedFrom(currentBranch, Context.FullConfiguration); - var branchNameOverride = branchName.RegexReplace("[-/]" + versionInBranch.Item1, string.Empty); - yield return new BaseVersion("Version in branch name", false, versionInBranch.Item2, commitBranchWasBranchedFrom.Commit, branchNameOverride); + var versionInBranch = GetVersionInBranch(configuration.Branch.Name.Friendly, Context.FullConfiguration.TagPrefix); + if (versionInBranch != null) + { + var commitBranchWasBranchedFrom = this.repositoryStore.FindCommitBranchWasBranchedFrom(configuration.Branch, Context.FullConfiguration); + var branchNameOverride = Context.CurrentBranch.Name.Friendly.RegexReplace("[-/]" + versionInBranch.Item1, string.Empty); + yield return new BaseVersion("Version in branch name", false, versionInBranch.Item2, commitBranchWasBranchedFrom.Commit, branchNameOverride); + } } } diff --git a/src/GitVersion.Core/VersionCalculation/BaseVersionCalculators/VersionStrategyBase.cs b/src/GitVersion.Core/VersionCalculation/BaseVersionCalculators/VersionStrategyBase.cs index 6ef7c5ab7e..8161fdb518 100644 --- a/src/GitVersion.Core/VersionCalculation/BaseVersionCalculators/VersionStrategyBase.cs +++ b/src/GitVersion.Core/VersionCalculation/BaseVersionCalculators/VersionStrategyBase.cs @@ -1,12 +1,15 @@ using GitVersion.Extensions; +using GitVersion.Model.Configuration; namespace GitVersion.VersionCalculation; -public class VersionStrategyBase : IVersionStrategy +public abstract class VersionStrategyBase : IVersionStrategy { private readonly Lazy versionContext; + protected GitVersionContext Context => this.versionContext.Value; protected VersionStrategyBase(Lazy versionContext) => this.versionContext = versionContext.NotNull(); - public virtual IEnumerable GetVersions() => throw new NotImplementedException(); + + public abstract IEnumerable GetBaseVersions(EffectiveBranchConfiguration configuration); } diff --git a/src/GitVersion.Core/VersionCalculation/BaseVersionCalculators/VersionStrategyModule.cs b/src/GitVersion.Core/VersionCalculation/BaseVersionCalculators/VersionStrategyModule.cs index 9bac7bf5c4..aa5b8a6d26 100644 --- a/src/GitVersion.Core/VersionCalculation/BaseVersionCalculators/VersionStrategyModule.cs +++ b/src/GitVersion.Core/VersionCalculation/BaseVersionCalculators/VersionStrategyModule.cs @@ -6,7 +6,8 @@ public class VersionStrategyModule : GitVersionModule { public override void RegisterTypes(IServiceCollection services) { - var versionStrategies = FindAllDerivedTypes(Assembly.GetAssembly(GetType())).Where(x => x != typeof(VersionStrategyBase)); + var versionStrategies = FindAllDerivedTypes(Assembly.GetAssembly(GetType())) + .Where(x => !x.IsAbstract && !x.IsInterface); foreach (var versionStrategy in versionStrategies) { diff --git a/src/GitVersion.Core/VersionCalculation/IncrementStrategyFinder.cs b/src/GitVersion.Core/VersionCalculation/IncrementStrategyFinder.cs index 17d63c2c58..66d53e85ed 100644 --- a/src/GitVersion.Core/VersionCalculation/IncrementStrategyFinder.cs +++ b/src/GitVersion.Core/VersionCalculation/IncrementStrategyFinder.cs @@ -1,6 +1,7 @@ using System.Collections.Concurrent; using System.Text.RegularExpressions; using GitVersion.Extensions; +using GitVersion.Model.Configuration; namespace GitVersion.VersionCalculation; @@ -21,16 +22,22 @@ public class IncrementStrategyFinder : IIncrementStrategyFinder private static readonly Regex DefaultPatchPatternRegex = new(DefaultPatchPattern, RegexOptions.Compiled | RegexOptions.IgnoreCase); private static readonly Regex DefaultNoBumpPatternRegex = new(DefaultNoBumpPattern, RegexOptions.Compiled | RegexOptions.IgnoreCase); - public VersionField? DetermineIncrementedField(IGitRepository repository, GitVersionContext context, BaseVersion baseVersion) + private readonly IGitRepository repository; + + public IncrementStrategyFinder(IGitRepository repository) => this.repository = repository.NotNull(); + + public VersionField DetermineIncrementedField(GitVersionContext context, BaseVersion baseVersion, EffectiveConfiguration configuration) { - var commitMessageIncrement = FindCommitMessageIncrement(repository, context, baseVersion.BaseVersionSource); + configuration.NotNull(); + + var commitMessageIncrement = FindCommitMessageIncrement(this.repository, context, configuration, baseVersion.BaseVersionSource); - var defaultIncrement = context.Configuration.Increment.ToVersionField(); + var defaultIncrement = configuration.Increment.ToVersionField(); // use the default branch config increment strategy if there are no commit message overrides if (commitMessageIncrement == null) { - return baseVersion.ShouldIncrement ? defaultIncrement : null; + return baseVersion.ShouldIncrement ? defaultIncrement : VersionField.None; } // cap the commit message severity to minor for alpha versions @@ -46,15 +53,15 @@ public class IncrementStrategyFinder : IIncrementStrategyFinder return defaultIncrement; } - return commitMessageIncrement; + return commitMessageIncrement ?? VersionField.None; } - public VersionField? GetIncrementForCommits(GitVersionContext context, IEnumerable commits) + public VersionField? GetIncrementForCommits(Config configuration, IEnumerable commits) { - var majorRegex = TryGetRegexOrDefault(context.Configuration.MajorVersionBumpMessage, DefaultMajorPatternRegex); - var minorRegex = TryGetRegexOrDefault(context.Configuration.MinorVersionBumpMessage, DefaultMinorPatternRegex); - var patchRegex = TryGetRegexOrDefault(context.Configuration.PatchVersionBumpMessage, DefaultPatchPatternRegex); - var none = TryGetRegexOrDefault(context.Configuration.NoBumpMessage, DefaultNoBumpPatternRegex); + var majorRegex = TryGetRegexOrDefault(configuration.MajorVersionBumpMessage, DefaultMajorPatternRegex); + var minorRegex = TryGetRegexOrDefault(configuration.MinorVersionBumpMessage, DefaultMinorPatternRegex); + var patchRegex = TryGetRegexOrDefault(configuration.PatchVersionBumpMessage, DefaultPatchPatternRegex); + var none = TryGetRegexOrDefault(configuration.NoBumpMessage, DefaultNoBumpPatternRegex); var increments = commits .Select(c => GetIncrementFromCommit(c, majorRegex, minorRegex, patchRegex, none)) @@ -66,11 +73,12 @@ public class IncrementStrategyFinder : IIncrementStrategyFinder : null; } - private VersionField? FindCommitMessageIncrement(IGitRepository repository, GitVersionContext context, ICommit? baseCommit) + private VersionField? FindCommitMessageIncrement(IGitRepository repository, GitVersionContext context, + EffectiveConfiguration configuration, ICommit? baseCommit) { if (baseCommit == null) return null; - if (context.Configuration.CommitMessageIncrementing == CommitMessageIncrementMode.Disabled) + if (configuration.CommitMessageIncrementing == CommitMessageIncrementMode.Disabled) { return null; } @@ -84,12 +92,12 @@ public class IncrementStrategyFinder : IIncrementStrategyFinder .TakeWhile(x => !tags.Contains(x.Sha)) .Reverse(); - if (context.Configuration.CommitMessageIncrementing == CommitMessageIncrementMode.MergeMessageOnly) + if (configuration.CommitMessageIncrementing == CommitMessageIncrementMode.MergeMessageOnly) { commits = commits.Where(c => c.Parents.Count() > 1); } - return GetIncrementForCommits(context, commits); + return GetIncrementForCommits(context.FullConfiguration, commits); } private static Regex TryGetRegexOrDefault(string? messageRegex, Regex defaultRegex) => @@ -98,35 +106,35 @@ private static Regex TryGetRegexOrDefault(string? messageRegex, Regex defaultReg : CompiledRegexCache.GetOrAdd(messageRegex, pattern => new Regex(pattern, RegexOptions.Compiled | RegexOptions.IgnoreCase)); /// - /// Get the sequence of commits in a between a (exclusive) + /// Get the sequence of commits in a between a (exclusive) /// and a particular (inclusive) /// - private IEnumerable GetIntermediateCommits(IGitRepository repo, IGitObject baseCommit, ICommit? headCommit) + private IEnumerable GetIntermediateCommits(IGitRepository repository, IGitObject baseCommit, ICommit? headCommit) { - var map = GetHeadCommitsMap(repo, headCommit); + var map = GetHeadCommitsMap(repository, headCommit); if (!map.TryGetValue(baseCommit.Sha, out var baseIndex)) return Enumerable.Empty(); var commitAfterBaseIndex = baseIndex + 1; - var headCommits = GetHeadCommits(repo, headCommit); + var headCommits = GetHeadCommits(repository, headCommit); return new ArraySegment(headCommits, commitAfterBaseIndex, headCommits.Length - commitAfterBaseIndex); } /// /// Get a mapping of commit shas to their zero-based position in the sequence of commits from the beginning of a - /// to a particular + /// to a particular /// - private Dictionary GetHeadCommitsMap(IGitRepository repo, ICommit? headCommit) => + private Dictionary GetHeadCommitsMap(IGitRepository repository, ICommit? headCommit) => this.headCommitsMapCache.GetOrAdd(headCommit?.Sha ?? "NULL", () => - GetHeadCommits(repo, headCommit) + GetHeadCommits(repository, headCommit) .Select((commit, index) => (commit.Sha, Index: index)) .ToDictionary(t => t.Sha, t => t.Index)); /// - /// Get the sequence of commits from the beginning of a to a particular + /// Get the sequence of commits from the beginning of a to a particular /// (inclusive) /// - private ICommit[] GetHeadCommits(IGitRepository repo, ICommit? headCommit) => + private ICommit[] GetHeadCommits(IGitRepository repository, ICommit? headCommit) => this.headCommitsCache.GetOrAdd(headCommit?.Sha ?? "NULL", () => - GetCommitsReacheableFromHead(repo, headCommit).ToArray()); + GetCommitsReacheableFromHead(repository, headCommit).ToArray()); private VersionField? GetIncrementFromCommit(ICommit commit, Regex majorRegex, Regex minorRegex, Regex patchRegex, Regex none) => this.commitIncrementCache.GetOrAdd(commit.Sha, () => diff --git a/src/GitVersion.Core/VersionCalculation/MainlineVersionCalculator.cs b/src/GitVersion.Core/VersionCalculation/MainlineVersionCalculator.cs index 102cb4e366..fd1c9d8b15 100644 --- a/src/GitVersion.Core/VersionCalculation/MainlineVersionCalculator.cs +++ b/src/GitVersion.Core/VersionCalculation/MainlineVersionCalculator.cs @@ -52,7 +52,7 @@ public SemanticVersion FindMainlineModeVersion(BaseVersion baseVersion) var mainlineCommitLog = this.repositoryStore.GetMainlineCommitLog(baseVersion.BaseVersionSource, mainlineTip).ToList(); var directCommits = new List(mainlineCommitLog.Count); - var nextVersion = context.Configuration.NextVersion; + var nextVersion = context.FullConfiguration.NextVersion; if (nextVersion.IsNullOrEmpty()) { // Scans commit log in reverse, aggregating merge commits @@ -259,7 +259,7 @@ private SemanticVersion IncrementForEachCommit(IEnumerable directCommit { foreach (var directCommit in directCommits) { - var directCommitIncrement = this.incrementStrategyFinder.GetIncrementForCommits(context, new[] { directCommit }) + var directCommitIncrement = this.incrementStrategyFinder.GetIncrementForCommits(context.FullConfiguration, new[] { directCommit }) ?? FindDefaultIncrementForBranch(context, mainline.Name.Friendly); mainlineVersion = mainlineVersion.IncrementVersion(directCommitIncrement); this.log.Info($"Direct commit on main {directCommit} incremented base versions {directCommitIncrement}, now {mainlineVersion}"); @@ -272,7 +272,7 @@ private VersionField FindMessageIncrement(ICommit? mergeCommit, ICommit? mergedH { var commits = this.repositoryStore.GetMergeBaseCommits(mergeCommit, mergedHead, findMergeBase); commitLog.RemoveAll(c => commits.Any(c1 => c1.Sha == c.Sha)); - return this.incrementStrategyFinder.GetIncrementForCommits(context, commits) ?? TryFindIncrementFromMergeMessage(mergeCommit); + return this.incrementStrategyFinder.GetIncrementForCommits(context.FullConfiguration, commits) ?? TryFindIncrementFromMergeMessage(mergeCommit); } private VersionField TryFindIncrementFromMergeMessage(ICommit? mergeCommit) @@ -280,7 +280,7 @@ private VersionField TryFindIncrementFromMergeMessage(ICommit? mergeCommit) if (mergeCommit != null) { var mergeMessage = new MergeMessage(mergeCommit.Message, context.FullConfiguration); - var config = context.FullConfiguration.GetConfigForBranch(mergeMessage.MergedBranch); + var config = context.FullConfiguration.GetBranchConfiguration(mergeMessage.MergedBranch); if (config?.Increment != null && config.Increment != IncrementStrategy.Inherit) { return config.Increment.Value.ToVersionField(); @@ -291,9 +291,9 @@ private VersionField TryFindIncrementFromMergeMessage(ICommit? mergeCommit) return FindDefaultIncrementForBranch(context); } - private static VersionField FindDefaultIncrementForBranch(GitVersionContext context, string? branch = null) + private static VersionField FindDefaultIncrementForBranch(GitVersionContext context, string? branchName = null) { - var config = context.FullConfiguration.GetConfigForBranch(branch ?? context.CurrentBranch.Name.WithoutRemote); + var config = context.FullConfiguration.GetBranchConfiguration(branchName ?? context.CurrentBranch.Name.WithoutRemote); if (config?.Increment != null && config.Increment != IncrementStrategy.Inherit) { return config.Increment.Value.ToVersionField(); diff --git a/src/GitVersion.Core/VersionCalculation/MinDateVersionFilter.cs b/src/GitVersion.Core/VersionCalculation/MinDateVersionFilter.cs index c8729fa9ed..2e611b0c5d 100644 --- a/src/GitVersion.Core/VersionCalculation/MinDateVersionFilter.cs +++ b/src/GitVersion.Core/VersionCalculation/MinDateVersionFilter.cs @@ -8,7 +8,7 @@ public class MinDateVersionFilter : IVersionFilter public MinDateVersionFilter(DateTimeOffset minimum) => this.minimum = minimum; - public bool Exclude(BaseVersion? version, [NotNullWhen(true)] out string? reason) + public bool Exclude(BaseVersion version, [NotNullWhen(true)] out string? reason) { if (version == null) throw new ArgumentNullException(nameof(version)); diff --git a/src/GitVersion.Core/VersionCalculation/NextVersion.cs b/src/GitVersion.Core/VersionCalculation/NextVersion.cs new file mode 100644 index 0000000000..4d23c16e0d --- /dev/null +++ b/src/GitVersion.Core/VersionCalculation/NextVersion.cs @@ -0,0 +1,30 @@ +using GitVersion.Extensions; +using GitVersion.Model.Configuration; + +namespace GitVersion.VersionCalculation; + +public class NextVersion +{ + public BaseVersion BaseVersion { get; set; } + + public SemanticVersion IncrementedVersion { get; } + + public IBranch Branch { get; } + + public EffectiveConfiguration Configuration { get; } + + public NextVersion(SemanticVersion incrementedVersion, BaseVersion baseVersion, EffectiveBranchConfiguration configuration) + : this(incrementedVersion, baseVersion, configuration.NotNull().Branch, configuration.NotNull().Value) + { + } + + public NextVersion(SemanticVersion incrementedVersion, BaseVersion baseVersion, IBranch branch, EffectiveConfiguration configuration) + { + IncrementedVersion = incrementedVersion.NotNull(); + BaseVersion = baseVersion.NotNull(); + Configuration = configuration.NotNull(); + Branch = branch.NotNull(); + } + + public override string ToString() => $"{BaseVersion} | {IncrementedVersion}"; +} diff --git a/src/GitVersion.Core/VersionCalculation/NextVersionCalculator.cs b/src/GitVersion.Core/VersionCalculation/NextVersionCalculator.cs index ef02b18ff8..93d38e3799 100644 --- a/src/GitVersion.Core/VersionCalculation/NextVersionCalculator.cs +++ b/src/GitVersion.Core/VersionCalculation/NextVersionCalculator.cs @@ -2,6 +2,7 @@ using GitVersion.Configuration; using GitVersion.Extensions; using GitVersion.Logging; +using GitVersion.Model.Configuration; namespace GitVersion.VersionCalculation; @@ -11,48 +12,55 @@ public class NextVersionCalculator : INextVersionCalculator private readonly IBaseVersionCalculator baseVersionCalculator; private readonly IMainlineVersionCalculator mainlineVersionCalculator; private readonly IRepositoryStore repositoryStore; + private readonly IIncrementStrategyFinder incrementStrategyFinder; private readonly Lazy versionContext; - private GitVersionContext context => this.versionContext.Value; - public NextVersionCalculator(ILog log, IBaseVersionCalculator baseVersionCalculator, - IMainlineVersionCalculator mainlineVersionCalculator, IRepositoryStore repositoryStore, + private GitVersionContext Context => this.versionContext.Value; + + public NextVersionCalculator( + ILog log, + IBaseVersionCalculator baseVersionCalculator, + IMainlineVersionCalculator mainlineVersionCalculator, + IRepositoryStore repositoryStore, + IIncrementStrategyFinder incrementStrategyFinder, Lazy versionContext) { this.log = log.NotNull(); this.baseVersionCalculator = baseVersionCalculator.NotNull(); this.mainlineVersionCalculator = mainlineVersionCalculator.NotNull(); this.repositoryStore = repositoryStore.NotNull(); + this.incrementStrategyFinder = incrementStrategyFinder.NotNull(); this.versionContext = versionContext.NotNull(); } - public SemanticVersion FindVersion() + public NextVersion FindVersion() { - this.log.Info($"Running against branch: {context.CurrentBranch} ({context.CurrentCommit?.ToString() ?? "-"})"); - if (context.IsCurrentCommitTagged) + this.log.Info($"Running against branch: {Context.CurrentBranch} ({Context.CurrentCommit?.ToString() ?? "-"})"); + if (Context.IsCurrentCommitTagged) { - this.log.Info($"Current commit is tagged with version {context.CurrentCommitTaggedVersion}, " + "version calculation is for metadata only."); + this.log.Info($"Current commit is tagged with version {Context.CurrentCommitTaggedVersion}, " + "version calculation is for metadata only."); } else { - EnsureHeadIsNotDetached(context); + EnsureHeadIsNotDetached(Context); } SemanticVersion? taggedSemanticVersion = null; - if (context.IsCurrentCommitTagged) + if (Context.IsCurrentCommitTagged) { // Will always be 0, don't bother with the +0 on tags - var semanticVersionBuildMetaData = this.mainlineVersionCalculator.CreateVersionBuildMetaData(context.CurrentCommit); + var semanticVersionBuildMetaData = this.mainlineVersionCalculator.CreateVersionBuildMetaData(Context.CurrentCommit); semanticVersionBuildMetaData.CommitsSinceTag = null; - var semanticVersion = new SemanticVersion(context.CurrentCommitTaggedVersion) { BuildMetaData = semanticVersionBuildMetaData }; + var semanticVersion = new SemanticVersion(Context.CurrentCommitTaggedVersion) { BuildMetaData = semanticVersionBuildMetaData }; taggedSemanticVersion = semanticVersion; } - var baseVersion = this.baseVersionCalculator.GetBaseVersion(); + var (baseVersion, configuration) = this.baseVersionCalculator.GetBaseVersion(); baseVersion.SemanticVersion.BuildMetaData = this.mainlineVersionCalculator.CreateVersionBuildMetaData(baseVersion.BaseVersionSource); SemanticVersion semver; - if (context.Configuration.VersioningMode == VersioningMode.Mainline) + if (Context.FullConfiguration.VersioningMode == VersioningMode.Mainline) { semver = this.mainlineVersionCalculator.FindMainlineModeVersion(baseVersion); } @@ -60,7 +68,7 @@ public SemanticVersion FindVersion() { if (taggedSemanticVersion?.BuildMetaData == null || (taggedSemanticVersion.BuildMetaData?.Sha != baseVersion.SemanticVersion.BuildMetaData.Sha)) { - semver = PerformIncrement(baseVersion); + semver = PerformIncrement(baseVersion, configuration.Value); semver.BuildMetaData = this.mainlineVersionCalculator.CreateVersionBuildMetaData(baseVersion.BaseVersionSource); } else @@ -70,14 +78,12 @@ public SemanticVersion FindVersion() } var hasPreReleaseTag = semver.PreReleaseTag?.HasTag() == true; - var tag = context.Configuration.Tag; + var tag = configuration.Value.Tag; var branchConfigHasPreReleaseTagConfigured = !tag.IsNullOrEmpty(); -#pragma warning disable CS8602 // Dereference of a possibly null reference. // context.Configuration.Tag not null when branchConfigHasPreReleaseTagConfigured is true var preReleaseTagDoesNotMatchConfiguration = hasPreReleaseTag && branchConfigHasPreReleaseTagConfigured && semver.PreReleaseTag?.Name != tag; -#pragma warning restore CS8602 // Dereference of a possibly null reference. if (semver.PreReleaseTag?.HasTag() != true && branchConfigHasPreReleaseTagConfigured || preReleaseTagDoesNotMatchConfiguration) { - UpdatePreReleaseTag(semver, baseVersion.BranchNameOverride); + UpdatePreReleaseTag(configuration.Value, semver, baseVersion.BranchNameOverride); } if (taggedSemanticVersion != null) @@ -94,29 +100,26 @@ public SemanticVersion FindVersion() } } - return taggedSemanticVersion ?? semver; + var incrementedVersion = taggedSemanticVersion ?? semver; + return new(incrementedVersion, baseVersion, configuration); } - private SemanticVersion PerformIncrement(BaseVersion baseVersion) + private SemanticVersion PerformIncrement(BaseVersion baseVersion, EffectiveConfiguration configuration) { var semver = baseVersion.SemanticVersion; - var increment = this.repositoryStore.DetermineIncrementedField(baseVersion, context); - if (increment != null) - { - semver = semver.IncrementVersion(increment.Value); - } - else this.log.Info("Skipping version increment"); + var increment = this.incrementStrategyFinder.DetermineIncrementedField(Context, baseVersion, configuration); + semver = semver.IncrementVersion(increment); return semver; } - private void UpdatePreReleaseTag(SemanticVersion semanticVersion, string? branchNameOverride) + private void UpdatePreReleaseTag(EffectiveConfiguration configuration, SemanticVersion semanticVersion, string? branchNameOverride) { - var tagToUse = context.Configuration.GetBranchSpecificTag(this.log, context.CurrentBranch.Name.Friendly, branchNameOverride); + var tagToUse = configuration.GetBranchSpecificTag(this.log, Context.CurrentBranch.Name.Friendly, branchNameOverride); long? number = null; var lastTag = this.repositoryStore - .GetVersionTagsOnBranch(context.CurrentBranch, context.Configuration.GitTagPrefix) + .GetVersionTagsOnBranch(Context.CurrentBranch, Context.FullConfiguration.TagPrefix) .FirstOrDefault(v => v.PreReleaseTag?.Name?.IsEquivalentTo(tagToUse) == true); if (lastTag != null && MajorMinorPatchEqual(lastTag, semanticVersion) && lastTag.PreReleaseTag?.HasTag() == true) diff --git a/src/GitVersion.Core/VersionCalculation/SemanticVersioning/SemanticVersion.cs b/src/GitVersion.Core/VersionCalculation/SemanticVersioning/SemanticVersion.cs index 4ee0e84908..a16317b618 100644 --- a/src/GitVersion.Core/VersionCalculation/SemanticVersioning/SemanticVersion.cs +++ b/src/GitVersion.Core/VersionCalculation/SemanticVersioning/SemanticVersion.cs @@ -307,11 +307,3 @@ public SemanticVersion IncrementVersion(VersionField incrementStrategy) return incremented; } } - -public enum VersionField -{ - None, - Patch, - Minor, - Major -} diff --git a/src/GitVersion.Core/VersionCalculation/SemanticVersioning/VersionField.cs b/src/GitVersion.Core/VersionCalculation/SemanticVersioning/VersionField.cs new file mode 100644 index 0000000000..b76adb3c05 --- /dev/null +++ b/src/GitVersion.Core/VersionCalculation/SemanticVersioning/VersionField.cs @@ -0,0 +1,9 @@ +namespace GitVersion; + +public enum VersionField +{ + None, + Patch, + Minor, + Major +} diff --git a/src/GitVersion.Core/VersionCalculation/ShaVersionFilter.cs b/src/GitVersion.Core/VersionCalculation/ShaVersionFilter.cs index 13c6bfc356..cf2d48ec26 100644 --- a/src/GitVersion.Core/VersionCalculation/ShaVersionFilter.cs +++ b/src/GitVersion.Core/VersionCalculation/ShaVersionFilter.cs @@ -9,7 +9,7 @@ public class ShaVersionFilter : IVersionFilter public ShaVersionFilter(IEnumerable shas) => this.shas = shas.NotNull(); - public bool Exclude(BaseVersion? version, [NotNullWhen(true)] out string? reason) + public bool Exclude(BaseVersion version, [NotNullWhen(true)] out string? reason) { if (version == null) throw new ArgumentNullException(nameof(version));