diff --git a/src/GitVersionCore.Tests/AssemblyInfoFileUpdaterTests.cs b/src/GitVersionCore.Tests/AssemblyInfoFileUpdaterTests.cs index bc4c1fa87d..f2e491b267 100644 --- a/src/GitVersionCore.Tests/AssemblyInfoFileUpdaterTests.cs +++ b/src/GitVersionCore.Tests/AssemblyInfoFileUpdaterTests.cs @@ -6,6 +6,7 @@ using GitVersion.Extensions.VersionAssemblyInfoResources; using GitVersion.Logging; using GitVersion.OutputVariables; +using GitVersion.VersionCalculation; using GitVersionCore.Tests.Helpers; using Microsoft.Extensions.DependencyInjection; using NSubstitute; diff --git a/src/GitVersionCore.Tests/BuildServers/BuildServerBaseTests.cs b/src/GitVersionCore.Tests/BuildServers/BuildServerBaseTests.cs index ce597003a9..03295b5160 100644 --- a/src/GitVersionCore.Tests/BuildServers/BuildServerBaseTests.cs +++ b/src/GitVersionCore.Tests/BuildServers/BuildServerBaseTests.cs @@ -3,6 +3,7 @@ using GitVersion; using GitVersion.Logging; using GitVersion.OutputVariables; +using GitVersion.VersionCalculation; using GitVersionCore.Tests.Helpers; using Microsoft.Extensions.DependencyInjection; using NUnit.Framework; diff --git a/src/GitVersionCore.Tests/BuildServers/CodeBuildTests.cs b/src/GitVersionCore.Tests/BuildServers/CodeBuildTests.cs index 7756ecc4a8..261fbff528 100644 --- a/src/GitVersionCore.Tests/BuildServers/CodeBuildTests.cs +++ b/src/GitVersionCore.Tests/BuildServers/CodeBuildTests.cs @@ -4,7 +4,7 @@ using System.Reflection; using GitVersion; using GitVersion.BuildServers; -using GitVersion.OutputVariables; +using GitVersion.VersionCalculation; using GitVersionCore.Tests.Helpers; using Microsoft.Extensions.DependencyInjection; using NUnit.Framework; diff --git a/src/GitVersionCore.Tests/BuildServers/GitLabCiTests.cs b/src/GitVersionCore.Tests/BuildServers/GitLabCiTests.cs index 3f454416e1..497812684e 100644 --- a/src/GitVersionCore.Tests/BuildServers/GitLabCiTests.cs +++ b/src/GitVersionCore.Tests/BuildServers/GitLabCiTests.cs @@ -4,7 +4,7 @@ using System.Reflection; using GitVersion; using GitVersion.BuildServers; -using GitVersion.OutputVariables; +using GitVersion.VersionCalculation; using GitVersionCore.Tests.Helpers; using Microsoft.Extensions.DependencyInjection; using NUnit.Framework; diff --git a/src/GitVersionCore.Tests/BuildServers/JenkinsTests.cs b/src/GitVersionCore.Tests/BuildServers/JenkinsTests.cs index 46062d821d..c0f5f56c81 100644 --- a/src/GitVersionCore.Tests/BuildServers/JenkinsTests.cs +++ b/src/GitVersionCore.Tests/BuildServers/JenkinsTests.cs @@ -4,7 +4,7 @@ using System.Reflection; using GitVersion; using GitVersion.BuildServers; -using GitVersion.OutputVariables; +using GitVersion.VersionCalculation; using GitVersionCore.Tests.Helpers; using Microsoft.Extensions.DependencyInjection; using NUnit.Framework; diff --git a/src/GitVersionCore.Tests/CommitDateTests.cs b/src/GitVersionCore.Tests/CommitDateTests.cs index 45cb209e49..fa3f8c2c78 100644 --- a/src/GitVersionCore.Tests/CommitDateTests.cs +++ b/src/GitVersionCore.Tests/CommitDateTests.cs @@ -4,7 +4,6 @@ using GitVersion.Configuration; using GitVersion.Extensions; using GitVersion.VersionCalculation; -using GitVersion.VersionFilters; using GitVersionCore.Tests.Helpers; using NUnit.Framework; diff --git a/src/GitVersionCore.Tests/DefaultConfigFileLocatorTests.cs b/src/GitVersionCore.Tests/DefaultConfigFileLocatorTests.cs index a7032879e5..76307f8267 100644 --- a/src/GitVersionCore.Tests/DefaultConfigFileLocatorTests.cs +++ b/src/GitVersionCore.Tests/DefaultConfigFileLocatorTests.cs @@ -1,7 +1,6 @@ using System.IO; using GitVersion; using GitVersion.Configuration; -using GitVersion.Exceptions; using GitVersionCore.Tests.Helpers; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; diff --git a/src/GitVersionCore.Tests/DynamicRepositoryTests.cs b/src/GitVersionCore.Tests/DynamicRepositoryTests.cs index 5c25719f56..33f0a8255f 100644 --- a/src/GitVersionCore.Tests/DynamicRepositoryTests.cs +++ b/src/GitVersionCore.Tests/DynamicRepositoryTests.cs @@ -80,9 +80,10 @@ public void FindsVersionInDynamicRepo(string name, string url, string targetBran }); var gitPreparer = sp.GetService(); + gitPreparer.Prepare(); + var gitVersionCalculator = sp.GetService(); - gitPreparer.Prepare(); var versionVariables = gitVersionCalculator.CalculateVersionVariables(); Assert.AreEqual(expectedFullSemVer, versionVariables.FullSemVer); diff --git a/src/GitVersionCore.Tests/GitRepoMetadataProviderTests.cs b/src/GitVersionCore.Tests/GitRepoMetadataProviderTests.cs index a5f19914d5..5548eab4d0 100644 --- a/src/GitVersionCore.Tests/GitRepoMetadataProviderTests.cs +++ b/src/GitVersionCore.Tests/GitRepoMetadataProviderTests.cs @@ -1,7 +1,6 @@ using System; using GitTools.Testing; using GitVersion; -using GitVersion.Configuration; using GitVersion.Extensions; using GitVersion.Logging; using GitVersionCore.Tests.Helpers; @@ -16,13 +15,11 @@ namespace GitVersionCore.Tests public class GitRepoMetadataProviderTests : TestBase { private readonly ILog log; - private readonly Config configuration; public GitRepoMetadataProviderTests() { var sp = ConfigureServices(); log = sp.GetService(); - configuration = new Config(); } [Test] @@ -30,7 +27,7 @@ public void FindsCorrectMergeBaseForForwardMerge() { //*9dfb8b4 49 minutes ago(develop) //*54f21b2 53 minutes ago - // |\ + // |\ // | | *a219831 51 minutes ago(HEAD -> release-2.0.0) // | |/ // | *4441531 54 minutes ago @@ -61,16 +58,16 @@ public void FindsCorrectMergeBaseForForwardMerge() // Make new commit on develop fixture.Checkout("develop"); - // Checkout to release (no new commits) + // Checkout to release (no new commits) fixture.Checkout("release-2.0.0"); var develop = fixture.Repository.FindBranch("develop"); var release = fixture.Repository.FindBranch("release-2.0.0"); - var releaseBranchMergeBase = new GitRepoMetadataProvider(fixture.Repository, log, configuration) - .FindMergeBase(release, develop); + var gitRepoMetadataProvider = new GitRepoMetadataProvider(log, fixture.Repository); - var developMergeBase = new GitRepoMetadataProvider(fixture.Repository, log, configuration) - .FindMergeBase(develop, release); + var releaseBranchMergeBase = gitRepoMetadataProvider.FindMergeBase(release, develop); + + var developMergeBase = gitRepoMetadataProvider.FindMergeBase(develop, release); fixture.Repository.DumpGraph(Console.WriteLine); @@ -83,7 +80,7 @@ public void FindsCorrectMergeBaseForForwardMergeMovesOn() { //*9dfb8b4 49 minutes ago(develop) //*54f21b2 53 minutes ago - // |\ + // |\ // | | *a219831 51 minutes ago(HEAD -> release-2.0.0) // | |/ // | *4441531 54 minutes ago @@ -113,19 +110,19 @@ public void FindsCorrectMergeBaseForForwardMergeMovesOn() // Make new commit on develop fixture.Checkout("develop"); - // Checkout to release (no new commits) + // Checkout to release (no new commits) fixture.MakeACommit("develop after merge"); - // Checkout to release (no new commits) + // Checkout to release (no new commits) fixture.Checkout("release-2.0.0"); var develop = fixture.Repository.FindBranch("develop"); var release = fixture.Repository.FindBranch("release-2.0.0"); - var releaseBranchMergeBase = new GitRepoMetadataProvider(fixture.Repository, log, configuration) - .FindMergeBase(release, develop); + var gitRepoMetadataProvider = new GitRepoMetadataProvider(log, fixture.Repository); + + var releaseBranchMergeBase = gitRepoMetadataProvider.FindMergeBase(release, develop); - var developMergeBase = new GitRepoMetadataProvider(fixture.Repository, log, configuration) - .FindMergeBase(develop, release); + var developMergeBase = gitRepoMetadataProvider.FindMergeBase(develop, release); fixture.Repository.DumpGraph(Console.WriteLine); @@ -137,13 +134,13 @@ public void FindsCorrectMergeBaseForForwardMergeMovesOn() public void FindsCorrectMergeBaseForMultipleForwardMerges() { //*403b294 44 minutes ago(develop) - //|\ + //|\ //| *306b243 45 minutes ago(HEAD -> release-2.0.0) //| *4cf5969 47 minutes ago //| *4814083 51 minutes ago //* | cddd3cc 49 minutes ago //* | 2b2b52a 53 minutes ago - //|\ \ + //|\ \ //| |/ //| *8113776 54 minutes ago //| *3c0235e 56 minutes ago @@ -172,12 +169,12 @@ public void FindsCorrectMergeBaseForMultipleForwardMerges() // Make new commit on develop fixture.Checkout("develop"); - // Checkout to release (no new commits) + // Checkout to release (no new commits) fixture.Checkout("release-2.0.0"); fixture.Checkout("develop"); fixture.Repository.MakeACommit("develop after merge"); - // Checkout to release (no new commits) + // Checkout to release (no new commits) fixture.Checkout("release-2.0.0"); // Make some new commit on release @@ -189,17 +186,17 @@ public void FindsCorrectMergeBaseForMultipleForwardMerges() fixture.Checkout("develop"); fixture.MergeNoFF("release-2.0.0"); - // Checkout to release (no new commits) + // Checkout to release (no new commits) fixture.Checkout("release-2.0.0"); var develop = fixture.Repository.FindBranch("develop"); var release = fixture.Repository.FindBranch("release-2.0.0"); - var releaseBranchMergeBase = new GitRepoMetadataProvider(fixture.Repository, log, configuration) - .FindMergeBase(release, develop); + var gitRepoMetadataProvider = new GitRepoMetadataProvider(log, fixture.Repository); + + var releaseBranchMergeBase = gitRepoMetadataProvider.FindMergeBase(release, develop); - var developMergeBase = new GitRepoMetadataProvider(fixture.Repository, log, configuration) - .FindMergeBase(develop, release); + var developMergeBase = gitRepoMetadataProvider.FindMergeBase(develop, release); fixture.Repository.DumpGraph(Console.WriteLine); diff --git a/src/GitVersionCore.Tests/GitToolsTestingExtensions.cs b/src/GitVersionCore.Tests/GitToolsTestingExtensions.cs index 122a28ec46..90686cffae 100644 --- a/src/GitVersionCore.Tests/GitToolsTestingExtensions.cs +++ b/src/GitVersionCore.Tests/GitToolsTestingExtensions.cs @@ -3,7 +3,6 @@ using GitVersion; using GitVersion.Configuration; using GitVersion.Extensions; -using GitVersion.Logging; using GitVersion.OutputVariables; using GitVersion.VersionCalculation; using GitVersionCore.Tests.Helpers; @@ -16,10 +15,6 @@ namespace GitVersionCore.Tests { public static class GitToolsTestingExtensions { - private static readonly IServiceProvider sp; - - static GitToolsTestingExtensions() => sp = ConfigureService(); - public static VersionVariables GetVersion(this RepositoryFixtureBase fixture, Config configuration = null, IRepository repository = null, string commitId = null, bool onlyTrackedBranches = true, string branch = null) { if (configuration == null) @@ -28,35 +23,46 @@ public static VersionVariables GetVersion(this RepositoryFixtureBase fixture, Co configuration.Reset(); } - var log = sp.GetService(); + repository ??= fixture.Repository; + + var options = Options.Create(new Arguments + { + OverrideConfig = configuration, + TargetPath = repository.GetRepositoryDirectory(), + TargetBranch = branch, + CommitId = commitId, + OnlyTrackedBranches = onlyTrackedBranches + }); + + var sp = ConfigureServices(services => + { + services.AddSingleton(options); + }); + var variableProvider = sp.GetService(); var nextVersionCalculator = sp.GetService(); + var contextOptions = sp.GetService>(); + + var context = contextOptions.Value; - repository ??= fixture.Repository; - var targetBranch = repository.GetTargetBranch(branch); - var gitVersionContext = new GitVersionContext(repository, log, targetBranch, configuration, onlyTrackedBranches, commitId); try { - var executeGitVersion = nextVersionCalculator.FindVersion(gitVersionContext); - var variables = variableProvider.GetVariablesFor(executeGitVersion, gitVersionContext.Configuration, gitVersionContext.IsCurrentCommitTagged); + var executeGitVersion = nextVersionCalculator.FindVersion(); + var variables = variableProvider.GetVariablesFor(executeGitVersion, context.Configuration, context.IsCurrentCommitTagged); return variables; } catch (Exception) { Console.WriteLine("Test failing, dumping repository graph"); - gitVersionContext.Repository.DumpGraph(); + repository.DumpGraph(); throw; } } - public static void AssertFullSemver(this RepositoryFixtureBase fixture, string fullSemver, IRepository repository = null, string commitId = null, bool onlyTrackedBranches = true, string targetBranch = null) - { - fixture.AssertFullSemver(new Config(), fullSemver, repository, commitId, onlyTrackedBranches, targetBranch); - } - - public static void AssertFullSemver(this RepositoryFixtureBase fixture, Config configuration, string fullSemver, IRepository repository = null, string commitId = null, bool onlyTrackedBranches = true, string targetBranch = null) + public static void AssertFullSemver(this RepositoryFixtureBase fixture, string fullSemver, Config configuration = null, IRepository repository = null, string commitId = null, bool onlyTrackedBranches = true, string targetBranch = null) { + configuration ??= new Config(); configuration.Reset(); Console.WriteLine("---------"); @@ -88,7 +94,7 @@ public static void InitializeRepo(this RemoteRepositoryFixture fixture) }; var options = Options.Create(arguments); - var serviceProvider = ConfigureService(services => + var serviceProvider = ConfigureServices(services => { services.AddSingleton(options); }); @@ -97,7 +103,7 @@ public static void InitializeRepo(this RemoteRepositoryFixture fixture) gitPreparer?.PrepareInternal(true, null); } - private static IServiceProvider ConfigureService(Action servicesOverrides = null) + private static IServiceProvider ConfigureServices(Action servicesOverrides = null) { var services = new ServiceCollection() .AddModule(new GitVersionCoreTestModule()); diff --git a/src/GitVersionCore.Tests/GitVersionContextBuilder.cs b/src/GitVersionCore.Tests/GitVersionContextBuilder.cs index 9acbdc2ed3..0a27cd2e30 100644 --- a/src/GitVersionCore.Tests/GitVersionContextBuilder.cs +++ b/src/GitVersionCore.Tests/GitVersionContextBuilder.cs @@ -1,26 +1,38 @@ +using System; using GitTools.Testing; using GitVersion; using GitVersion.Configuration; -using GitVersion.Logging; +using GitVersion.Extensions; +using GitVersionCore.Tests.Helpers; using GitVersionCore.Tests.Mocks; using LibGit2Sharp; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Options; namespace GitVersionCore.Tests { public class GitVersionContextBuilder { private IRepository repository; - private Config config; + private Config configuration; + public IServiceProvider ServicesProvider; + private Action overrideServices; - public GitVersionContextBuilder WithRepository(IRepository repository) + public GitVersionContextBuilder WithRepository(IRepository gitRepository) { - this.repository = repository; + repository = gitRepository; return this; } public GitVersionContextBuilder WithConfig(Config config) { - this.config = config; + this.configuration = config; + return this; + } + + public GitVersionContextBuilder OverrideServices(Action overrides = null) + { + this.overrideServices = overrides; return this; } @@ -43,13 +55,13 @@ public GitVersionContextBuilder WithDevelopBranch() return WithBranch("develop"); } - public GitVersionContextBuilder WithBranch(string branchName) + private GitVersionContextBuilder WithBranch(string branchName) { repository = CreateRepository(); return AddBranch(branchName); } - public GitVersionContextBuilder AddBranch(string branchName) + private GitVersionContextBuilder AddBranch(string branchName) { var mockBranch = new MockBranch(branchName) { @@ -60,15 +72,24 @@ public GitVersionContextBuilder AddBranch(string branchName) return this; } - public GitVersionContext Build() + public void Build() { - var configuration = config ?? new Config(); - configuration.Reset(); var repo = repository ?? CreateRepository(); - return new GitVersionContext(repo, new NullLog(), repo.Head, configuration); + var config = configuration ?? new Config(); + + config.Reset(); + + var options = Options.Create(new Arguments { OverrideConfig = config }); + + ServicesProvider = ConfigureServices(services => + { + services.AddSingleton(options); + services.AddSingleton(repo); + overrideServices?.Invoke(services); + }); } - private IRepository CreateRepository() + private static IRepository CreateRepository() { var mockBranch = new MockBranch("master") { new MockCommit { CommitterEx = Generate.SignatureNow() } }; var mockRepository = new MockRepository @@ -83,5 +104,15 @@ private IRepository CreateRepository() return mockRepository; } + + private static IServiceProvider ConfigureServices(Action overrideServices = null) + { + var services = new ServiceCollection() + .AddModule(new GitVersionCoreTestModule()); + + overrideServices?.Invoke(services); + + return services.BuildServiceProvider(); + } } } diff --git a/src/GitVersionCore.Tests/GitVersionContextTests.cs b/src/GitVersionCore.Tests/GitVersionContextTests.cs index 2b71463a45..fefb4f1195 100644 --- a/src/GitVersionCore.Tests/GitVersionContextTests.cs +++ b/src/GitVersionCore.Tests/GitVersionContextTests.cs @@ -1,14 +1,13 @@ - using System.Collections.Generic; using GitTools.Testing; using GitVersion; using GitVersion.Configuration; -using GitVersion.Logging; using GitVersion.VersionCalculation; using GitVersionCore.Tests.Helpers; using GitVersionCore.Tests.Mocks; using LibGit2Sharp; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Options; using NUnit.Framework; using Shouldly; @@ -16,14 +15,6 @@ namespace GitVersionCore.Tests { public class GitVersionContextTests : TestBase { - private ILog log; - - public GitVersionContextTests() - { - var sp = ConfigureServices(); - log = sp.GetService(); - } - [Test] [Theory] public void CanInheritVersioningMode(VersioningMode mode) @@ -34,16 +25,19 @@ public void CanInheritVersioningMode(VersioningMode mode) }; config.Reset(); - var mockBranch = new MockBranch("master") { new MockCommit { CommitterEx = Generate.SignatureNow() } }; + var branchName = "master"; + var mockBranch = new MockBranch(branchName) { new MockCommit { CommitterEx = Generate.SignatureNow() } }; var mockRepository = new MockRepository { + Head = mockBranch, Branches = new MockBranchCollection { mockBranch } }; - var context = new GitVersionContext(mockRepository, log, mockBranch, config); + var context = GetGitVersionContext(mockRepository, branchName, config); + context.Configuration.VersioningMode.ShouldBe(mode); } @@ -68,20 +62,22 @@ public void CanInheritIncrement(IncrementStrategy increment, IncrementStrategy? fixture.BranchTo(dummyBranchName); fixture.MakeACommit(); - var context = new GitVersionContext(fixture.Repository, log, fixture.Repository.Branches[dummyBranchName], config); + var context = GetGitVersionContext(fixture.Repository, dummyBranchName, config); + context.Configuration.Increment.ShouldBe(alternateExpected ?? increment); } [Test] public void UsesBranchSpecificConfigOverTopLevelDefaults() { + var branchName = "develop"; var config = new Config { VersioningMode = VersioningMode.ContinuousDelivery, Branches = { { - "develop", new BranchConfig + branchName, new BranchConfig { VersioningMode = VersioningMode.ContinuousDeployment, Tag = "alpha" @@ -90,31 +86,44 @@ public void UsesBranchSpecificConfigOverTopLevelDefaults() } }; config.Reset(); - var develop = new MockBranch("develop") { new MockCommit { CommitterEx = Generate.SignatureNow() } }; + var develop = new MockBranch(branchName) { new MockCommit { CommitterEx = Generate.SignatureNow() } }; var mockRepository = new MockRepository { + Head = develop, Branches = new MockBranchCollection { new MockBranch("master") { new MockCommit { CommitterEx = Generate.SignatureNow() } }, develop } }; - var context = new GitVersionContext(mockRepository, log, develop, config); + + var context = GetGitVersionContext(mockRepository, branchName, config); + context.Configuration.Tag.ShouldBe("alpha"); } [Test] public void UsesFirstBranchConfigWhenMultipleMatch() { + var branchConfig = new BranchConfig + { + VersioningMode = VersioningMode.Mainline, + Increment = IncrementStrategy.None, + PreventIncrementOfMergedBranchVersion = false, + TrackMergeTarget = false, + TracksReleaseBranches = false, + IsReleaseBranch = false, + SourceBranches = new List() + }; var config = new Config { VersioningMode = VersioningMode.ContinuousDelivery, Branches = { - { "release/latest", new BranchConfig { Increment = IncrementStrategy.None, Regex = "release/latest", SourceBranches = new List() } }, - { "release", new BranchConfig { Increment = IncrementStrategy.Patch, Regex = "releases?[/-]", SourceBranches = new List() } } + { "release/latest", new BranchConfig(branchConfig) { Increment = IncrementStrategy.None, Regex = "release/latest" } }, + { "release", new BranchConfig(branchConfig) { Increment = IncrementStrategy.Patch, Regex = "releases?[/-]" } } } - }.ApplyDefaults(); + }; var releaseLatestBranch = new MockBranch("release/latest") { new MockCommit { CommitterEx = Generate.SignatureNow() } }; var releaseVersionBranch = new MockBranch("release/1.0.0") { new MockCommit { CommitterEx = Generate.SignatureNow() } }; @@ -125,13 +134,15 @@ public void UsesFirstBranchConfigWhenMultipleMatch() { releaseLatestBranch, releaseVersionBranch - } + }, + Head = releaseLatestBranch }; - var latestContext = new GitVersionContext(mockRepository, log, releaseLatestBranch, config); + var latestContext = GetGitVersionContext(mockRepository, releaseLatestBranch.CanonicalName, config); latestContext.Configuration.Increment.ShouldBe(IncrementStrategy.None); - var versionContext = new GitVersionContext(mockRepository, log, releaseVersionBranch, config); + mockRepository.Head = releaseVersionBranch; + var versionContext = GetGitVersionContext(mockRepository, releaseVersionBranch.CanonicalName, config); versionContext.Configuration.Increment.ShouldBe(IncrementStrategy.Patch); } @@ -155,8 +166,37 @@ public void CanFindParentBranchForInheritingIncrementStrategy() Commands.Checkout(repo.Repository, featureBranch); repo.Repository.MakeACommit(); - var context = new GitVersionContext(repo.Repository, log, repo.Repository.Head, config); + var context = GetGitVersionContext(repo.Repository, "develop", config); + context.Configuration.Increment.ShouldBe(IncrementStrategy.Major); } + + private static GitVersionContext GetGitVersionContext(IRepository repository, string branch, Config config = null) + { + config ??= new Config().ApplyDefaults(); + var options = Options.Create(new Arguments { OverrideConfig = config, TargetBranch = branch }); + + var sp = ConfigureServices(services => + { + services.AddSingleton(options); + services.AddSingleton(repository); + }); + + return sp.GetService>().Value; + } + + private static IGitVersionContextFactory GetGitVersionContextFactory(IRepository repository, Config config = null) + { + config ??= new Config().ApplyDefaults(); + var options = Options.Create(new Arguments { OverrideConfig = config }); + + var sp = ConfigureServices(services => + { + services.AddSingleton(options); + services.AddSingleton(repository); + }); + + return sp.GetService(); + } } } diff --git a/src/GitVersionCore.Tests/GitVersionExecutorTests.cs b/src/GitVersionCore.Tests/GitVersionExecutorTests.cs index 34686402b0..cd4e9cff48 100644 --- a/src/GitVersionCore.Tests/GitVersionExecutorTests.cs +++ b/src/GitVersionCore.Tests/GitVersionExecutorTests.cs @@ -3,9 +3,9 @@ using System.Text; using GitTools.Testing; using GitVersion; -using GitVersion.Cache; using GitVersion.Configuration; using GitVersion.Logging; +using GitVersion.VersionCalculation.Cache; using GitVersionCore.Tests.Helpers; using LibGit2Sharp; using Microsoft.Extensions.DependencyInjection; @@ -66,7 +66,7 @@ public void GitPreparerShouldNotFailWhenTargetPathNotInitialized() { sp = GetServiceProvider(arguments); - _ = sp.GetService(); + sp.GetService(); }); } @@ -214,7 +214,9 @@ public void CacheFileExistsOnDiskWhenOverrideConfigIsSpecifiedVersionShouldBeDyn var cacheDirectoryTimestamp = fileSystem.GetLastDirectoryWrite(cacheDirectory); - arguments = new Arguments { TargetPath = fixture.RepositoryPath, OverrideConfig = new Config { TagPrefix = "prefix" } }; + var config = new Config { TagPrefix = "prefix" }; + config.Reset(); + arguments = new Arguments { TargetPath = fixture.RepositoryPath, OverrideConfig = config }; gitVersionCalculator = GetGitVersionCalculator(arguments); versionVariables = gitVersionCalculator.CalculateVersionVariables(); @@ -238,9 +240,9 @@ public void CacheFileIsMissing() var arguments = new Arguments { TargetPath = fixture.RepositoryPath }; - var gitVersionCalculator = GetGitVersionCalculator(arguments, log); - fixture.Repository.MakeACommit(); + var gitVersionCalculator = GetGitVersionCalculator(arguments, log, fixture.Repository); + gitVersionCalculator.CalculateVersionVariables(); var logsMessages = stringBuilder.ToString(); @@ -288,9 +290,9 @@ public void ConfigChangeInvalidatesCache() var arguments = new Arguments { TargetPath = fixture.RepositoryPath }; - var gitVersionCalculator = GetGitVersionCalculator(arguments); - fixture.Repository.MakeACommit(); + + var gitVersionCalculator = GetGitVersionCalculator(arguments); var versionVariables = gitVersionCalculator.CalculateVersionVariables(); versionVariables.AssemblySemVer.ShouldBe("0.1.0.0"); @@ -304,6 +306,8 @@ public void ConfigChangeInvalidatesCache() var configPath = Path.Combine(fixture.RepositoryPath, DefaultConfigFileLocator.DefaultFileName); fileSystem.WriteAllText(configPath, "next-version: 5.0"); + gitVersionCalculator = GetGitVersionCalculator(arguments, fs: fileSystem); + versionVariables = gitVersionCalculator.CalculateVersionVariables(); versionVariables.AssemblySemVer.ShouldBe("5.0.0.0"); } @@ -349,9 +353,9 @@ public void NoCacheBypassesCache() var arguments = new Arguments { TargetPath = fixture.RepositoryPath }; + fixture.Repository.MakeACommit(); var gitVersionCalculator = GetGitVersionCalculator(arguments); - fixture.Repository.MakeACommit(); var versionVariables = gitVersionCalculator.CalculateVersionVariables(); versionVariables.AssemblySemVer.ShouldBe("0.1.0.0"); @@ -371,9 +375,12 @@ public void WorkingDirectoryWithoutGit() { var arguments = new Arguments { TargetPath = Environment.SystemDirectory }; - var gitVersionCalculator = GetGitVersionCalculator(arguments); - var exception = Assert.Throws(() => gitVersionCalculator.CalculateVersionVariables()); + var exception = Assert.Throws(() => + { + var gitVersionCalculator = GetGitVersionCalculator(arguments); + gitVersionCalculator.CalculateVersionVariables(); + }); exception.Message.ShouldContain("Can't find the .git directory in"); } @@ -432,6 +439,8 @@ public void GetProjectRootDirectoryNoWorktree() public void DynamicRepositoriesShouldNotErrorWithFailedToFindGitDirectory() { using var fixture = new EmptyRepositoryFixture(); + fixture.Repository.MakeACommit(); + var arguments = new Arguments { TargetPath = fixture.RepositoryPath, @@ -439,7 +448,7 @@ public void DynamicRepositoriesShouldNotErrorWithFailedToFindGitDirectory() TargetBranch = "refs/head/master" }; - var gitVersionCalculator = GetGitVersionCalculator(arguments); + var gitVersionCalculator = GetGitVersionCalculator(arguments, repository: fixture.Repository); gitPreparer.Prepare(); gitVersionCalculator.CalculateVersionVariables(); } @@ -496,9 +505,9 @@ public void GetDotGitDirectoryWorktree() } } - private IGitVersionCalculator GetGitVersionCalculator(Arguments arguments, ILog logger = null) + private IGitVersionCalculator GetGitVersionCalculator(Arguments arguments, ILog logger = null, IRepository repository = null, IFileSystem fs = null) { - sp = GetServiceProvider(arguments, logger); + sp = GetServiceProvider(arguments, logger, repository, fs); fileSystem = sp.GetService(); log = sp.GetService(); @@ -508,11 +517,13 @@ private IGitVersionCalculator GetGitVersionCalculator(Arguments arguments, ILog return sp.GetService(); } - private static IServiceProvider GetServiceProvider(Arguments arguments, ILog log = null) + private static IServiceProvider GetServiceProvider(Arguments arguments, ILog log = null, IRepository repository = null, IFileSystem fileSystem = null) { return ConfigureServices(services => { if (log != null) services.AddSingleton(log); + if (fileSystem != null) services.AddSingleton(fileSystem); + if (repository != null) services.AddSingleton(repository); services.AddSingleton(Options.Create(arguments)); }); } diff --git a/src/GitVersionCore.Tests/GitVersionInformationGeneratorTests.cs b/src/GitVersionCore.Tests/GitVersionInformationGeneratorTests.cs index 3005199912..aa3b1c50d4 100644 --- a/src/GitVersionCore.Tests/GitVersionInformationGeneratorTests.cs +++ b/src/GitVersionCore.Tests/GitVersionInformationGeneratorTests.cs @@ -2,7 +2,7 @@ using System.IO; using GitVersion; using GitVersion.Extensions.GitVersionInformationResources; -using GitVersion.OutputVariables; +using GitVersion.VersionCalculation; using GitVersionCore.Tests.Helpers; using Microsoft.Extensions.DependencyInjection; using NUnit.Framework; diff --git a/src/GitVersionCore.Tests/Helpers/TestBase.cs b/src/GitVersionCore.Tests/Helpers/TestBase.cs index 3d5ce8b839..95ad498501 100644 --- a/src/GitVersionCore.Tests/Helpers/TestBase.cs +++ b/src/GitVersionCore.Tests/Helpers/TestBase.cs @@ -6,8 +6,8 @@ namespace GitVersionCore.Tests.Helpers { public class TestBase { - public const string NoMonoDescription = "Won't run on Mono due to source information not being available for ShouldMatchApproved."; - public const string NoMono = "NoMono"; + protected const string NoMonoDescription = "Won't run on Mono due to source information not being available for ShouldMatchApproved."; + protected const string NoMono = "NoMono"; protected static IServiceProvider ConfigureServices(Action overrideServices = null) { diff --git a/src/GitVersionCore.Tests/Helpers/TestEffectiveConfiguration.cs b/src/GitVersionCore.Tests/Helpers/TestEffectiveConfiguration.cs index 8e8f8fcd15..ef5cc3d237 100644 --- a/src/GitVersionCore.Tests/Helpers/TestEffectiveConfiguration.cs +++ b/src/GitVersionCore.Tests/Helpers/TestEffectiveConfiguration.cs @@ -4,7 +4,6 @@ using GitVersion.Configuration; using GitVersion.Extensions; using GitVersion.VersionCalculation; -using GitVersion.VersionFilters; namespace GitVersionCore.Tests.Helpers { diff --git a/src/GitVersionCore.Tests/IntegrationTests/BranchWithoutCommitScenarios.cs b/src/GitVersionCore.Tests/IntegrationTests/BranchWithoutCommitScenarios.cs index 152b40f91a..095a634ca0 100644 --- a/src/GitVersionCore.Tests/IntegrationTests/BranchWithoutCommitScenarios.cs +++ b/src/GitVersionCore.Tests/IntegrationTests/BranchWithoutCommitScenarios.cs @@ -17,7 +17,7 @@ public void CanTakeVersionFromReleaseBranch() fixture.Repository.CreateBranch("release-4.0.123"); fixture.Checkout(commit.Sha); - fixture.AssertFullSemver("4.0.123-beta.1+0", fixture.Repository, commit.Sha, false, "release-4.0.123"); + fixture.AssertFullSemver("4.0.123-beta.1+0", null, fixture.Repository, commit.Sha, onlyTrackedBranches: false, targetBranch: "release-4.0.123"); } [Test] diff --git a/src/GitVersionCore.Tests/IntegrationTests/DevelopScenarios.cs b/src/GitVersionCore.Tests/IntegrationTests/DevelopScenarios.cs index 0cea1c5d2b..ef4684c3bd 100644 --- a/src/GitVersionCore.Tests/IntegrationTests/DevelopScenarios.cs +++ b/src/GitVersionCore.Tests/IntegrationTests/DevelopScenarios.cs @@ -72,7 +72,7 @@ public void CanChangeDevelopTagViaConfig() fixture.Repository.MakeATaggedCommit("1.0.0"); Commands.Checkout(fixture.Repository, fixture.Repository.CreateBranch("develop")); fixture.Repository.MakeACommit(); - fixture.AssertFullSemver(config, "1.1.0-alpha.1"); + fixture.AssertFullSemver("1.1.0-alpha.1", config); } [Test] @@ -130,7 +130,7 @@ public void CanHandleContinuousDelivery() fixture.Repository.MakeATaggedCommit("1.0.0"); Commands.Checkout(fixture.Repository, fixture.Repository.CreateBranch("develop")); fixture.Repository.MakeATaggedCommit("1.1.0-alpha7"); - fixture.AssertFullSemver(config, "1.1.0-alpha.7"); + fixture.AssertFullSemver("1.1.0-alpha.7", config); } [Test] @@ -240,7 +240,7 @@ public void CommitsSinceVersionSourceShouldNotGoDownUponGitFlowReleaseFinish() fixture.Repository.Branches.Remove("release/1.2.0"); var expectedFullSemVer = "1.3.0-alpha.9"; - fixture.AssertFullSemver(config, expectedFullSemVer); + fixture.AssertFullSemver(expectedFullSemVer, config); } [Test] @@ -272,7 +272,7 @@ public void CommitsSinceVersionSourceShouldNotGoDownUponMergingFeatureOnlyToDeve fixture.Repository.Branches.Remove("release/1.2.0"); var expectedFullSemVer = "1.3.0-alpha.5"; - fixture.AssertFullSemver(config, expectedFullSemVer); + fixture.AssertFullSemver(expectedFullSemVer, config); } [Test] diff --git a/src/GitVersionCore.Tests/IntegrationTests/FeatureBranchScenarios.cs b/src/GitVersionCore.Tests/IntegrationTests/FeatureBranchScenarios.cs index 5c6473d4be..fb768872da 100644 --- a/src/GitVersionCore.Tests/IntegrationTests/FeatureBranchScenarios.cs +++ b/src/GitVersionCore.Tests/IntegrationTests/FeatureBranchScenarios.cs @@ -77,7 +77,7 @@ public void BranchCreatedAfterFastForwardMergeShouldInheritCorrectly() Commands.Checkout(fixture.Repository, "feature/JIRA-124"); fixture.Repository.MakeCommits(1); - fixture.AssertFullSemver(config, "1.1.0-JIRA-124.1+2"); + fixture.AssertFullSemver("1.1.0-JIRA-124.1+2", config); } [Test] @@ -170,7 +170,7 @@ public void ShouldBePossibleToMergeDevelopForALongRunningBranchWhereDevelopAndMa fixture.Repository.Merge(fixture.Repository.Branches["develop"], Generate.SignatureNow()); var configuration = new Config { VersioningMode = VersioningMode.ContinuousDeployment }; - fixture.AssertFullSemver(configuration, "1.2.0-longrunning.2"); + fixture.AssertFullSemver("1.2.0-longrunning.2", configuration); } [Test] @@ -193,7 +193,7 @@ public void CanUseBranchNameOffAReleaseBranch() fixture.BranchTo("feature/PROJ-1"); fixture.MakeACommit(); - fixture.AssertFullSemver(config, "0.3.0-PROJ-1.1+2"); + fixture.AssertFullSemver("0.3.0-PROJ-1.1+2", config); } [TestCase("alpha", "JIRA-123", "alpha")] @@ -217,7 +217,7 @@ public void ShouldUseConfiguredTag(string tag, string featureName, string preRel fixture.Repository.MakeCommits(5); var expectedFullSemVer = $"1.0.1-{preReleaseTagName}.1+5"; - fixture.AssertFullSemver(config, expectedFullSemVer); + fixture.AssertFullSemver(expectedFullSemVer, config); } [Test] @@ -322,11 +322,11 @@ public void ShouldPickUpVersionFromMasterAfterReleaseBranchCreated() fixture.MakeACommit(); fixture.Checkout("master"); fixture.MakeACommit(); - fixture.AssertFullSemver(config, "1.0.1+1"); + fixture.AssertFullSemver("1.0.1+1", config); // create a feature branch from master and verify the version fixture.BranchTo("feature/test"); - fixture.AssertFullSemver(config, "1.0.1-test.1+1"); + fixture.AssertFullSemver("1.0.1-test.1+1", config); } [Test] @@ -355,11 +355,11 @@ public void ShouldPickUpVersionFromMasterAfterReleaseBranchMergedBack() // merge release into master fixture.Checkout("master"); fixture.MergeNoFF("release/1.0"); - fixture.AssertFullSemver(config, "1.0.1+2"); + fixture.AssertFullSemver("1.0.1+2", config); // create a feature branch from master and verify the version fixture.BranchTo("feature/test"); - fixture.AssertFullSemver(config, "1.0.1-test.1+2"); + fixture.AssertFullSemver("1.0.1-test.1+2", config); } } @@ -432,11 +432,11 @@ public void ShouldPickUpVersionFromMasterAfterReleaseBranchCreated() fixture.MakeACommit(); fixture.Checkout("master"); fixture.MakeACommit(); - fixture.AssertFullSemver(config, "1.0.1+1"); + fixture.AssertFullSemver("1.0.1+1", config); // create a misnamed feature branch (i.e. it uses the default config) from master and verify the version fixture.BranchTo("misnamed"); - fixture.AssertFullSemver(config, "1.0.1-misnamed.1+1"); + fixture.AssertFullSemver("1.0.1-misnamed.1+1", config); } [Test] @@ -465,11 +465,11 @@ public void ShouldPickUpVersionFromMasterAfterReleaseBranchMergedBack() // merge release into master fixture.Checkout("master"); fixture.MergeNoFF("release/1.0"); - fixture.AssertFullSemver(config, "1.0.1+2"); + fixture.AssertFullSemver("1.0.1+2", config); // create a misnamed feature branch (i.e. it uses the default config) from master and verify the version fixture.BranchTo("misnamed"); - fixture.AssertFullSemver(config, "1.0.1-misnamed.1+2"); + fixture.AssertFullSemver("1.0.1-misnamed.1+2", config); } } } @@ -506,16 +506,16 @@ public void PickUpVersionFromMasterMarkedWithIsTracksReleaseBranches() fixture.BranchTo("release/0.10.0"); fixture.MakeACommit(); fixture.MakeACommit(); - fixture.AssertFullSemver(config, "0.10.0-rc.1+2"); + fixture.AssertFullSemver("0.10.0-rc.1+2", config); // switch to master and verify the version fixture.Checkout("master"); fixture.MakeACommit(); - fixture.AssertFullSemver(config, "0.10.1-pre.1+1"); + fixture.AssertFullSemver("0.10.1-pre.1+1", config); // create a feature branch from master and verify the version fixture.BranchTo("MyFeatureD"); - fixture.AssertFullSemver(config, "0.10.1-MyFeatureD.1+1"); + fixture.AssertFullSemver("0.10.1-MyFeatureD.1+1", config); } [Test] @@ -558,7 +558,7 @@ public void ShouldHaveAGreaterSemVerAfterDevelopIsMergedIntoFeature() fixture.MakeACommit(); fixture.Checkout("feature/featX"); fixture.MergeNoFF("develop"); - fixture.AssertFullSemver(config, "16.24.0-feat-featX.4"); + fixture.AssertFullSemver("16.24.0-feat-featX.4", config); } } } diff --git a/src/GitVersionCore.Tests/IntegrationTests/HotfixBranchScenarios.cs b/src/GitVersionCore.Tests/IntegrationTests/HotfixBranchScenarios.cs index 5aa2fa2d39..7bfb360dd8 100644 --- a/src/GitVersionCore.Tests/IntegrationTests/HotfixBranchScenarios.cs +++ b/src/GitVersionCore.Tests/IntegrationTests/HotfixBranchScenarios.cs @@ -148,7 +148,7 @@ public void FeatureOnHotfixFeatureBranchDeleted() // create release branch fixture.Repository.CreateBranch(release450); Commands.Checkout(fixture.Repository, release450); - fixture.AssertFullSemver(config, "4.5.0-beta.0"); + fixture.AssertFullSemver("4.5.0-beta.0", config); fixture.Repository.MakeACommit("blabla"); Commands.Checkout(fixture.Repository, "develop"); fixture.Repository.MergeNoFF(release450, Generate.SignatureNow()); @@ -159,7 +159,7 @@ public void FeatureOnHotfixFeatureBranchDeleted() fixture.Repository.CreateBranch(support45); Commands.Checkout(fixture.Repository, support45); fixture.Repository.ApplyTag(tag450); - fixture.AssertFullSemver(config, "4.5.0"); + fixture.AssertFullSemver("4.5.0", config); // create hotfix branch fixture.Repository.CreateBranch(hotfix451); @@ -172,7 +172,7 @@ public void FeatureOnHotfixFeatureBranchDeleted() Commands.Checkout(fixture.Repository, hotfix451); fixture.Repository.MergeNoFF(featureBranch, Generate.SignatureNow()); // commit 2 fixture.Repository.Branches.Remove(featureBranch); - fixture.AssertFullSemver(config, "4.5.1-beta.2"); + fixture.AssertFullSemver("4.5.1-beta.2", config); } /// @@ -201,7 +201,7 @@ public void FeatureOnHotfixFeatureBranchNotDeleted() // create release branch fixture.Repository.CreateBranch(release450); Commands.Checkout(fixture.Repository, release450); - fixture.AssertFullSemver(config, "4.5.0-beta.0"); + fixture.AssertFullSemver("4.5.0-beta.0", config); fixture.Repository.MakeACommit("blabla"); Commands.Checkout(fixture.Repository, "develop"); fixture.Repository.MergeNoFF(release450, Generate.SignatureNow()); @@ -212,7 +212,7 @@ public void FeatureOnHotfixFeatureBranchNotDeleted() fixture.Repository.CreateBranch(support45); Commands.Checkout(fixture.Repository, support45); fixture.Repository.ApplyTag(tag450); - fixture.AssertFullSemver(config, "4.5.0"); + fixture.AssertFullSemver("4.5.0", config); // create hotfix branch fixture.Repository.CreateBranch(hotfix451); @@ -224,7 +224,7 @@ public void FeatureOnHotfixFeatureBranchNotDeleted() fixture.Repository.MakeACommit("blabla"); // commit 1 Commands.Checkout(fixture.Repository, hotfix451); fixture.Repository.MergeNoFF(featureBranch, Generate.SignatureNow()); // commit 2 - fixture.AssertFullSemver(config, "4.5.1-beta.2"); + fixture.AssertFullSemver("4.5.1-beta.2", config); } } diff --git a/src/GitVersionCore.Tests/IntegrationTests/MainlineDevelopmentMode.cs b/src/GitVersionCore.Tests/IntegrationTests/MainlineDevelopmentMode.cs index 145fc70828..6938d1a9ec 100644 --- a/src/GitVersionCore.Tests/IntegrationTests/MainlineDevelopmentMode.cs +++ b/src/GitVersionCore.Tests/IntegrationTests/MainlineDevelopmentMode.cs @@ -29,20 +29,20 @@ public void MergedFeatureBranchesToMasterImpliesRelease() fixture.BranchTo("feature/foo", "foo"); fixture.MakeACommit("2"); - fixture.AssertFullSemver(config, "1.0.1-foo.1"); + fixture.AssertFullSemver("1.0.1-foo.1", config); fixture.MakeACommit("2.1"); - fixture.AssertFullSemver(config, "1.0.1-foo.2"); + fixture.AssertFullSemver("1.0.1-foo.2", config); fixture.Checkout("master"); fixture.MergeNoFF("feature/foo"); - fixture.AssertFullSemver(config, "1.0.1"); + fixture.AssertFullSemver("1.0.1", config); fixture.BranchTo("feature/foo2", "foo2"); fixture.MakeACommit("3 +semver: minor"); - fixture.AssertFullSemver(config, "1.1.0-foo2.1"); + fixture.AssertFullSemver("1.1.0-foo2.1", config); fixture.Checkout("master"); fixture.MergeNoFF("feature/foo2"); - fixture.AssertFullSemver(config, "1.1.0"); + fixture.AssertFullSemver("1.1.0", config); fixture.BranchTo("feature/foo3", "foo3"); fixture.MakeACommit("4"); @@ -55,37 +55,37 @@ public void MergedFeatureBranchesToMasterImpliesRelease() { AmendPreviousCommit = true }); - fixture.AssertFullSemver(config, "1.2.0"); + fixture.AssertFullSemver("1.2.0", config); fixture.BranchTo("feature/foo4", "foo4"); fixture.MakeACommit("5 +semver: major"); - fixture.AssertFullSemver(config, "2.0.0-foo4.1"); + fixture.AssertFullSemver("2.0.0-foo4.1", config); fixture.Checkout("master"); fixture.MergeNoFF("feature/foo4"); - fixture.AssertFullSemver(config, "2.0.0"); + fixture.AssertFullSemver("2.0.0", config); // We should evaluate any commits not included in merge commit calculations for direct commit/push or squash to merge commits fixture.MakeACommit("6 +semver: major"); - fixture.AssertFullSemver(config, "3.0.0"); + fixture.AssertFullSemver("3.0.0", config); fixture.MakeACommit("7 +semver: minor"); - fixture.AssertFullSemver(config, "3.1.0"); + fixture.AssertFullSemver("3.1.0", config); fixture.MakeACommit("8"); - fixture.AssertFullSemver(config, "3.1.1"); + fixture.AssertFullSemver("3.1.1", config); // Finally verify that the merge commits still function properly fixture.BranchTo("feature/foo5", "foo5"); fixture.MakeACommit("9 +semver: minor"); - fixture.AssertFullSemver(config, "3.2.0-foo5.1"); + fixture.AssertFullSemver("3.2.0-foo5.1", config); fixture.Checkout("master"); fixture.MergeNoFF("feature/foo5"); - fixture.AssertFullSemver(config, "3.2.0"); + fixture.AssertFullSemver("3.2.0", config); // One more direct commit for good measure fixture.MakeACommit("10 +semver: minor"); - fixture.AssertFullSemver(config, "3.3.0"); + fixture.AssertFullSemver("3.3.0", config); // And we can commit without bumping semver fixture.MakeACommit("11 +semver: none"); - fixture.AssertFullSemver(config, "3.3.0"); + fixture.AssertFullSemver("3.3.0", config); Console.WriteLine(fixture.SequenceDiagram.GetDiagram()); } @@ -96,14 +96,14 @@ public void VerifyPullRequestsActLikeContinuousDelivery() fixture.Repository.MakeACommit("1"); fixture.MakeATaggedCommit("1.0.0"); fixture.MakeACommit(); - fixture.AssertFullSemver(config, "1.0.1"); + fixture.AssertFullSemver("1.0.1", config); fixture.BranchTo("feature/foo", "foo"); - fixture.AssertFullSemver(config, "1.0.2-foo.0"); + fixture.AssertFullSemver("1.0.2-foo.0", config); fixture.MakeACommit(); fixture.MakeACommit(); fixture.Repository.CreatePullRequestRef("feature/foo", "master", normalise: true, prNumber: 8); - fixture.AssertFullSemver(config, "1.0.2-PullRequest0008.3"); + fixture.AssertFullSemver("1.0.2-PullRequest0008.3", config); } [Test] @@ -114,29 +114,29 @@ public void SupportBranches() fixture.MakeATaggedCommit("1.0.0"); fixture.MakeACommit(); // 1.0.1 fixture.MakeACommit(); // 1.0.2 - fixture.AssertFullSemver(config, "1.0.2"); + fixture.AssertFullSemver("1.0.2", config); fixture.BranchTo("support/1.0", "support10"); - fixture.AssertFullSemver(config, "1.0.3"); + fixture.AssertFullSemver("1.0.3", config); // Move master on fixture.Checkout("master"); fixture.MakeACommit("+semver: major"); // 2.0.0 (on master) - fixture.AssertFullSemver(config, "2.0.0"); + fixture.AssertFullSemver("2.0.0", config); // Continue on support/1.0 fixture.Checkout("support/1.0"); fixture.MakeACommit(); // 1.0.4 fixture.MakeACommit(); // 1.0.5 - fixture.AssertFullSemver(config, "1.0.5"); + fixture.AssertFullSemver("1.0.5", config); fixture.BranchTo("feature/foo", "foo"); - fixture.AssertFullSemver(config, "1.0.5-foo.0"); + fixture.AssertFullSemver("1.0.5-foo.0", config); fixture.MakeACommit(); - fixture.AssertFullSemver(config, "1.0.5-foo.1"); + fixture.AssertFullSemver("1.0.5-foo.1", config); fixture.MakeACommit(); - fixture.AssertFullSemver(config, "1.0.5-foo.2"); + fixture.AssertFullSemver("1.0.5-foo.2", config); fixture.Repository.CreatePullRequestRef("feature/foo", "support/1.0", normalise: true, prNumber: 7); - fixture.AssertFullSemver(config, "1.0.5-PullRequest0007.3"); + fixture.AssertFullSemver("1.0.5-PullRequest0007.3", config); } [Test] @@ -149,20 +149,20 @@ public void VerifyForwardMerge() fixture.BranchTo("feature/foo", "foo"); fixture.MakeACommit(); - fixture.AssertFullSemver(config, "1.0.2-foo.1"); + fixture.AssertFullSemver("1.0.2-foo.1", config); fixture.MakeACommit(); - fixture.AssertFullSemver(config, "1.0.2-foo.2"); + fixture.AssertFullSemver("1.0.2-foo.2", config); fixture.Checkout("master"); fixture.MakeACommit(); - fixture.AssertFullSemver(config, "1.0.2"); + fixture.AssertFullSemver("1.0.2", config); fixture.Checkout("feature/foo"); // This may seem surprising, but this happens because we branched off mainline // and incremented. Mainline has then moved on. We do not follow mainline // in feature branches, you need to merge mainline in to get the mainline version - fixture.AssertFullSemver(config, "1.0.2-foo.2"); + fixture.AssertFullSemver("1.0.2-foo.2", config); fixture.MergeNoFF("master"); - fixture.AssertFullSemver(config, "1.0.3-foo.3"); + fixture.AssertFullSemver("1.0.3-foo.3", config); } [Test] @@ -179,18 +179,18 @@ public void VerifySupportForwardMerge() fixture.Checkout("master"); fixture.MakeACommit("+semver: minor"); - fixture.AssertFullSemver(config, "1.1.0"); + fixture.AssertFullSemver("1.1.0", config); fixture.MergeNoFF("support/1.0"); - fixture.AssertFullSemver(config, "1.1.1"); + fixture.AssertFullSemver("1.1.1", config); fixture.MakeACommit(); - fixture.AssertFullSemver(config, "1.1.2"); + fixture.AssertFullSemver("1.1.2", config); fixture.Checkout("support/1.0"); - fixture.AssertFullSemver(config, "1.0.4"); + fixture.AssertFullSemver("1.0.4", config); fixture.BranchTo("feature/foo", "foo"); fixture.MakeACommit(); fixture.MakeACommit(); - fixture.AssertFullSemver(config, "1.0.4-foo.2"); // TODO This probably should be 1.0.5 + fixture.AssertFullSemver("1.0.4-foo.2", config); // TODO This probably should be 1.0.5 } [Test] @@ -203,31 +203,31 @@ public void VerifyDevelopTracksMasterVersion() // branching increments the version fixture.BranchTo("develop"); - fixture.AssertFullSemver(config, "1.1.0-alpha.0"); + fixture.AssertFullSemver("1.1.0-alpha.0", config); fixture.MakeACommit(); - fixture.AssertFullSemver(config, "1.1.0-alpha.1"); + fixture.AssertFullSemver("1.1.0-alpha.1", config); // merging develop into master increments minor version on master fixture.Checkout("master"); fixture.MergeNoFF("develop"); - fixture.AssertFullSemver(config, "1.1.0"); + fixture.AssertFullSemver("1.1.0", config); // a commit on develop before the merge still has the same version number fixture.Checkout("develop"); - fixture.AssertFullSemver(config, "1.1.0-alpha.1"); + fixture.AssertFullSemver("1.1.0-alpha.1", config); // moving on to further work on develop tracks master's version from the merge fixture.MakeACommit(); - fixture.AssertFullSemver(config, "1.2.0-alpha.1"); + fixture.AssertFullSemver("1.2.0-alpha.1", config); // adding a commit to master increments patch fixture.Checkout("master"); fixture.MakeACommit(); - fixture.AssertFullSemver(config, "1.1.1"); + fixture.AssertFullSemver("1.1.1", config); // adding a commit to master doesn't change develop's version fixture.Checkout("develop"); - fixture.AssertFullSemver(config, "1.2.0-alpha.1"); + fixture.AssertFullSemver("1.2.0-alpha.1", config); } [Test] @@ -240,41 +240,41 @@ public void VerifyDevelopFeatureTracksMasterVersion() // branching increments the version fixture.BranchTo("develop"); - fixture.AssertFullSemver(config, "1.1.0-alpha.0"); + fixture.AssertFullSemver("1.1.0-alpha.0", config); fixture.MakeACommit(); - fixture.AssertFullSemver(config, "1.1.0-alpha.1"); + fixture.AssertFullSemver("1.1.0-alpha.1", config); // merging develop into master increments minor version on master fixture.Checkout("master"); fixture.MergeNoFF("develop"); - fixture.AssertFullSemver(config, "1.1.0"); + fixture.AssertFullSemver("1.1.0", config); // a commit on develop before the merge still has the same version number fixture.Checkout("develop"); - fixture.AssertFullSemver(config, "1.1.0-alpha.1"); + fixture.AssertFullSemver("1.1.0-alpha.1", config); // a branch from develop before the merge tracks the pre-merge version from master // (note: the commit on develop looks like a commit to this branch, thus the .1) fixture.BranchTo("feature/foo"); - fixture.AssertFullSemver(config, "1.0.2-foo.1"); + fixture.AssertFullSemver("1.0.2-foo.1", config); // further work on the branch tracks the merged version from master fixture.MakeACommit(); - fixture.AssertFullSemver(config, "1.1.1-foo.1"); + fixture.AssertFullSemver("1.1.1-foo.1", config); // adding a commit to master increments patch fixture.Checkout("master"); fixture.MakeACommit(); - fixture.AssertFullSemver(config, "1.1.1"); + fixture.AssertFullSemver("1.1.1", config); // adding a commit to master doesn't change the feature's version fixture.Checkout("feature/foo"); - fixture.AssertFullSemver(config, "1.1.1-foo.1"); + fixture.AssertFullSemver("1.1.1-foo.1", config); // merging the feature to develop increments develop fixture.Checkout("develop"); fixture.MergeNoFF("feature/foo"); - fixture.AssertFullSemver(config, "1.2.0-alpha.2"); + fixture.AssertFullSemver("1.2.0-alpha.2", config); } [Test] @@ -297,7 +297,7 @@ public void VerifyMergingMasterToFeatureDoesNotCauseBranchCommitsToIncrementVers fixture.MakeATaggedCommit("1.0.0"); fixture.MergeNoFF("feature/foo"); - fixture.AssertFullSemver(config, "1.0.1"); + fixture.AssertFullSemver("1.0.1", config); } [Test] @@ -319,7 +319,7 @@ public void VerifyMergingMasterToFeatureDoesNotStopMasterCommitsIncrementingVers fixture.Checkout("master"); fixture.MergeNoFF("feature/foo"); - fixture.AssertFullSemver(config, "1.0.2"); + fixture.AssertFullSemver("1.0.2", config); } [Test] @@ -334,7 +334,7 @@ public void VerifyIssue1154CanForwardMergeMasterToFeatureBranch() fixture.Checkout("master"); fixture.MergeNoFF("feature/branch1"); - fixture.AssertFullSemver(config, "0.1.1"); + fixture.AssertFullSemver("0.1.1", config); fixture.Checkout("feature/branch2"); fixture.MakeACommit(); @@ -342,7 +342,7 @@ public void VerifyIssue1154CanForwardMergeMasterToFeatureBranch() fixture.MakeACommit(); fixture.MergeNoFF("master"); - fixture.AssertFullSemver(config, "0.1.2-branch2.4"); + fixture.AssertFullSemver("0.1.2-branch2.4", config); } [Test] @@ -373,7 +373,7 @@ public void VerifyMergingMasterIntoAFeatureBranchWorksWithMultipleBranches() fixture.MergeNoFF("feature/foo"); fixture.MergeNoFF("feature/bar"); - fixture.AssertFullSemver(config, "1.0.2"); + fixture.AssertFullSemver("1.0.2", config); } [Test] @@ -397,16 +397,16 @@ public void MergingFeatureBranchThatIncrementsMinorNumberIncrementsMinorVersionO using var fixture = new EmptyRepositoryFixture(); fixture.MakeACommit("first in master"); fixture.MakeATaggedCommit("1.0.0"); - fixture.AssertFullSemver(currentConfig, "1.0.0"); + fixture.AssertFullSemver("1.0.0", currentConfig); fixture.BranchTo("feature/foo", "foo"); fixture.MakeACommit("first in foo"); fixture.MakeACommit("second in foo"); - fixture.AssertFullSemver(currentConfig, "1.1.0-foo.2"); + fixture.AssertFullSemver("1.1.0-foo.2", currentConfig); fixture.Checkout("master"); fixture.MergeNoFF("feature/foo"); - fixture.AssertFullSemver(currentConfig, "1.1.0"); + fixture.AssertFullSemver("1.1.0", currentConfig); } [Test] @@ -445,20 +445,20 @@ public void VerifyIncrementConfigIsHonoured() fixture.BranchTo("feature/foo", "foo"); fixture.MakeACommit("2"); - fixture.AssertFullSemver(minorIncrementConfig, "1.1.0-foo.1"); + fixture.AssertFullSemver("1.1.0-foo.1", minorIncrementConfig); fixture.MakeACommit("2.1"); - fixture.AssertFullSemver(minorIncrementConfig, "1.1.0-foo.2"); + fixture.AssertFullSemver("1.1.0-foo.2", minorIncrementConfig); fixture.Checkout("master"); fixture.MergeNoFF("feature/foo"); - fixture.AssertFullSemver(minorIncrementConfig, "1.1.0"); + fixture.AssertFullSemver("1.1.0", minorIncrementConfig); fixture.BranchTo("feature/foo2", "foo2"); fixture.MakeACommit("3 +semver: patch"); - fixture.AssertFullSemver(minorIncrementConfig, "1.1.1-foo2.1"); + fixture.AssertFullSemver("1.1.1-foo2.1", minorIncrementConfig); fixture.Checkout("master"); fixture.MergeNoFF("feature/foo2"); - fixture.AssertFullSemver(minorIncrementConfig, "1.1.1"); + fixture.AssertFullSemver("1.1.1", minorIncrementConfig); fixture.BranchTo("feature/foo3", "foo3"); fixture.MakeACommit("4"); @@ -471,37 +471,37 @@ public void VerifyIncrementConfigIsHonoured() { AmendPreviousCommit = true }); - fixture.AssertFullSemver(minorIncrementConfig, "1.1.2"); + fixture.AssertFullSemver("1.1.2", minorIncrementConfig); fixture.BranchTo("feature/foo4", "foo4"); fixture.MakeACommit("5 +semver: major"); - fixture.AssertFullSemver(minorIncrementConfig, "2.0.0-foo4.1"); + fixture.AssertFullSemver("2.0.0-foo4.1", minorIncrementConfig); fixture.Checkout("master"); fixture.MergeNoFF("feature/foo4"); - fixture.AssertFullSemver(config, "2.0.0"); + fixture.AssertFullSemver("2.0.0", config); // We should evaluate any commits not included in merge commit calculations for direct commit/push or squash to merge commits fixture.MakeACommit("6 +semver: major"); - fixture.AssertFullSemver(minorIncrementConfig, "3.0.0"); + fixture.AssertFullSemver("3.0.0", minorIncrementConfig); fixture.MakeACommit("7"); - fixture.AssertFullSemver(minorIncrementConfig, "3.1.0"); + fixture.AssertFullSemver("3.1.0", minorIncrementConfig); fixture.MakeACommit("8 +semver: patch"); - fixture.AssertFullSemver(minorIncrementConfig, "3.1.1"); + fixture.AssertFullSemver("3.1.1", minorIncrementConfig); // Finally verify that the merge commits still function properly fixture.BranchTo("feature/foo5", "foo5"); fixture.MakeACommit("9 +semver: patch"); - fixture.AssertFullSemver(minorIncrementConfig, "3.1.2-foo5.1"); + fixture.AssertFullSemver("3.1.2-foo5.1", minorIncrementConfig); fixture.Checkout("master"); fixture.MergeNoFF("feature/foo5"); - fixture.AssertFullSemver(minorIncrementConfig, "3.1.2"); + fixture.AssertFullSemver("3.1.2", minorIncrementConfig); // One more direct commit for good measure fixture.MakeACommit("10 +semver: patch"); - fixture.AssertFullSemver(minorIncrementConfig, "3.1.3"); + fixture.AssertFullSemver("3.1.3", minorIncrementConfig); // And we can commit without bumping semver fixture.MakeACommit("11 +semver: none"); - fixture.AssertFullSemver(minorIncrementConfig, "3.1.3"); + fixture.AssertFullSemver("3.1.3", minorIncrementConfig); Console.WriteLine(fixture.SequenceDiagram.GetDiagram()); } } diff --git a/src/GitVersionCore.Tests/IntegrationTests/MasterScenarios.cs b/src/GitVersionCore.Tests/IntegrationTests/MasterScenarios.cs index 64f6523b94..ea16e07c01 100644 --- a/src/GitVersionCore.Tests/IntegrationTests/MasterScenarios.cs +++ b/src/GitVersionCore.Tests/IntegrationTests/MasterScenarios.cs @@ -28,7 +28,7 @@ public void CanHandleContinuousDelivery() using var fixture = new EmptyRepositoryFixture(); fixture.Repository.MakeATaggedCommit("1.0.0"); fixture.Repository.MakeCommits(2); - fixture.AssertFullSemver(config, "1.0.1+2"); + fixture.AssertFullSemver("1.0.1+2", config); } [Test] @@ -49,7 +49,7 @@ public void CanHandleContinuousDeployment() using var fixture = new EmptyRepositoryFixture(); fixture.Repository.MakeATaggedCommit("1.0.0"); fixture.Repository.MakeCommits(2); - fixture.AssertFullSemver(config, "1.0.1-ci.2"); + fixture.AssertFullSemver("1.0.1-ci.2", config); } [Test] @@ -106,7 +106,7 @@ public void GivenARepositoryWithTagAndNextVersionInConfigVersionShouldMatchVersi fixture.Repository.MakeATaggedCommit(taggedVersion); fixture.Repository.MakeCommits(5); - fixture.AssertFullSemver(config, "1.1.0+5"); + fixture.AssertFullSemver("1.1.0+5", config); } [Test] @@ -116,7 +116,7 @@ public void GivenARepositoryWithTagAndANextVersionTxtFileAndNoCommitsVersionShou const string taggedVersion = "1.0.3"; fixture.Repository.MakeATaggedCommit(taggedVersion); - fixture.AssertFullSemver(new Config { NextVersion = "1.1.0" }, "1.0.3"); + fixture.AssertFullSemver("1.0.3", new Config { NextVersion = "1.1.0" }); } [Test] @@ -148,7 +148,7 @@ public void GivenARepositoryWithTagAndOldNextVersionConfigVersionShouldBeTagWith fixture.Repository.MakeATaggedCommit(taggedVersion); fixture.Repository.MakeCommits(5); - fixture.AssertFullSemver(new Config { NextVersion = "1.0.0" }, "1.1.1+5"); + fixture.AssertFullSemver("1.1.1+5", new Config { NextVersion = "1.0.0" }); } [Test] @@ -158,7 +158,7 @@ public void GivenARepositoryWithTagAndOldNextVersionConfigAndNoCommitsVersionSho const string taggedVersion = "1.1.0"; fixture.Repository.MakeATaggedCommit(taggedVersion); - fixture.AssertFullSemver(new Config { NextVersion = "1.0.0" }, "1.1.0"); + fixture.AssertFullSemver("1.1.0", new Config { NextVersion = "1.0.0" }); } [Test] @@ -169,7 +169,7 @@ public void CanSpecifyTagPrefixes() fixture.Repository.MakeATaggedCommit(taggedVersion); fixture.Repository.MakeCommits(5); - fixture.AssertFullSemver(new Config { TagPrefix = "version-" }, "1.0.4+5"); + fixture.AssertFullSemver("1.0.4+5", new Config { TagPrefix = "version-" }); } [Test] @@ -181,13 +181,13 @@ public void CanSpecifyTagPrefixesAsRegex() fixture.Repository.MakeATaggedCommit(taggedVersion); fixture.Repository.MakeCommits(5); - fixture.AssertFullSemver(config, "1.0.4+5"); + fixture.AssertFullSemver("1.0.4+5", config); taggedVersion = "version-1.0.5"; fixture.Repository.MakeATaggedCommit(taggedVersion); fixture.Repository.MakeCommits(5); - fixture.AssertFullSemver(config, "1.0.6+5"); + fixture.AssertFullSemver("1.0.6+5", config); } [Test] @@ -199,12 +199,12 @@ public void AreTagsNotAdheringToTagPrefixIgnored() fixture.Repository.MakeATaggedCommit(taggedVersion); fixture.Repository.MakeCommits(5); - fixture.AssertFullSemver(config, "0.1.0+5"); //Fallback version + 5 commits since tag + fixture.AssertFullSemver("0.1.0+5", config); //Fallback version + 5 commits since tag taggedVersion = "bad/1.0.3"; fixture.Repository.MakeATaggedCommit(taggedVersion); - fixture.AssertFullSemver(config, "0.1.0+6"); //Fallback version + 6 commits since tag + fixture.AssertFullSemver("0.1.0+6", config); //Fallback version + 6 commits since tag } } } diff --git a/src/GitVersionCore.Tests/IntegrationTests/OtherScenarios.cs b/src/GitVersionCore.Tests/IntegrationTests/OtherScenarios.cs index 98a3706eb4..729afe9fe8 100644 --- a/src/GitVersionCore.Tests/IntegrationTests/OtherScenarios.cs +++ b/src/GitVersionCore.Tests/IntegrationTests/OtherScenarios.cs @@ -78,7 +78,7 @@ public void AllowHavingMainInsteadOfMaster() Commands.Checkout(fixture.Repository, fixture.Repository.CreateBranch("main")); fixture.Repository.Branches.Remove(fixture.Repository.Branches["master"]); - fixture.AssertFullSemver(config, "0.1.0+0"); + fixture.AssertFullSemver("0.1.0+0", config); } [Test] diff --git a/src/GitVersionCore.Tests/IntegrationTests/ReleaseBranchScenarios.cs b/src/GitVersionCore.Tests/IntegrationTests/ReleaseBranchScenarios.cs index 22d359c5b9..b6052204dd 100644 --- a/src/GitVersionCore.Tests/IntegrationTests/ReleaseBranchScenarios.cs +++ b/src/GitVersionCore.Tests/IntegrationTests/ReleaseBranchScenarios.cs @@ -94,9 +94,9 @@ public void ReleaseBranchWithNextVersionSetInConfig() fixture.Repository.MakeCommits(5); fixture.BranchTo("release-2.0.0"); - fixture.AssertFullSemver(config, "2.0.0-beta.1+0"); + fixture.AssertFullSemver("2.0.0-beta.1+0", config); fixture.Repository.MakeCommits(2); - fixture.AssertFullSemver(config, "2.0.0-beta.1+2"); + fixture.AssertFullSemver("2.0.0-beta.1+2", config); } [Test] @@ -115,9 +115,9 @@ public void CanTakeVersionFromReleaseBranchWithTagOverridden() fixture.Repository.CreateBranch("release-2.0.0"); fixture.Checkout("release-2.0.0"); - fixture.AssertFullSemver(config, "2.0.0-rc.1+0"); + fixture.AssertFullSemver("2.0.0-rc.1+0", config); fixture.Repository.MakeCommits(2); - fixture.AssertFullSemver(config, "2.0.0-rc.1+2"); + fixture.AssertFullSemver("2.0.0-rc.1+2", config); } [Test] @@ -315,12 +315,12 @@ public void HotfixOffReleaseBranchShouldNotResetCount() fixture.Checkout("release-2.0.0"); fixture.Repository.MakeCommits(1); - fixture.AssertFullSemver(config, "2.0.0-beta.1"); + fixture.AssertFullSemver("2.0.0-beta.1", config); //tag it to bump to beta 2 fixture.Repository.MakeCommits(4); - fixture.AssertFullSemver(config, "2.0.0-beta.5"); + fixture.AssertFullSemver("2.0.0-beta.5", config); //merge down to develop fixture.Repository.CreateBranch("hotfix-2.0.0"); @@ -330,7 +330,7 @@ public void HotfixOffReleaseBranchShouldNotResetCount() fixture.Checkout("release-2.0.0"); fixture.Repository.MergeNoFF("hotfix-2.0.0", Generate.SignatureNow()); fixture.Repository.Branches.Remove(fixture.Repository.Branches["hotfix-2.0.0"]); - fixture.AssertFullSemver(config, "2.0.0-beta.7"); + fixture.AssertFullSemver("2.0.0-beta.7", config); } [Test] @@ -353,14 +353,14 @@ public void MergeOnReleaseBranchShouldNotResetCount() fixture.Repository.CreateBranch("release/2.0.0-xxx"); fixture.Checkout("release/2.0.0-xxx"); fixture.Repository.MakeACommit(); - fixture.AssertFullSemver(config, "2.0.0-beta.1"); + fixture.AssertFullSemver("2.0.0-beta.1", config); fixture.Checkout("release/2.0.0"); fixture.Repository.MakeACommit(); - fixture.AssertFullSemver(config, "2.0.0-beta.1"); + fixture.AssertFullSemver("2.0.0-beta.1", config); fixture.Repository.MergeNoFF("release/2.0.0-xxx"); - fixture.AssertFullSemver(config, "2.0.0-beta.2"); + fixture.AssertFullSemver("2.0.0-beta.2", config); } [Test] @@ -377,12 +377,12 @@ public void CommitOnDevelopAfterReleaseBranchMergeToDevelopShouldNotResetCount() // Create release from develop fixture.BranchTo("release-2.0.0"); - fixture.AssertFullSemver(config, "2.0.0-beta.0"); + fixture.AssertFullSemver("2.0.0-beta.0", config); // Make some commits on release fixture.MakeACommit("release 1"); fixture.MakeACommit("release 2"); - fixture.AssertFullSemver(config, "2.0.0-beta.2"); + fixture.AssertFullSemver("2.0.0-beta.2", config); // First forward merge release to develop fixture.Checkout("develop"); @@ -391,24 +391,24 @@ public void CommitOnDevelopAfterReleaseBranchMergeToDevelopShouldNotResetCount() // Make some new commit on release fixture.Checkout("release-2.0.0"); fixture.Repository.MakeACommit("release 3 - after first merge"); - fixture.AssertFullSemver(config, "2.0.0-beta.3"); + fixture.AssertFullSemver("2.0.0-beta.3", config); // Make new commit on develop fixture.Checkout("develop"); // Checkout to release (no new commits) fixture.Checkout("release-2.0.0"); - fixture.AssertFullSemver(config, "2.0.0-beta.3"); + fixture.AssertFullSemver("2.0.0-beta.3", config); fixture.Checkout("develop"); fixture.Repository.MakeACommit("develop after merge"); // Checkout to release (no new commits) fixture.Checkout("release-2.0.0"); - fixture.AssertFullSemver(config, "2.0.0-beta.3"); + fixture.AssertFullSemver("2.0.0-beta.3", config); // Make some new commit on release fixture.Repository.MakeACommit("release 4"); fixture.Repository.MakeACommit("release 5"); - fixture.AssertFullSemver(config, "2.0.0-beta.5"); + fixture.AssertFullSemver("2.0.0-beta.5", config); // Second merge release to develop fixture.Checkout("develop"); @@ -416,7 +416,7 @@ public void CommitOnDevelopAfterReleaseBranchMergeToDevelopShouldNotResetCount() // Checkout to release (no new commits) fixture.Checkout("release-2.0.0"); - fixture.AssertFullSemver(config, "2.0.0-beta.5"); + fixture.AssertFullSemver("2.0.0-beta.5", config); } [Test] @@ -433,12 +433,12 @@ public void CommitBeetweenMergeReleaseToDevelopShouldNotResetCount() Commands.Checkout(fixture.Repository, "develop"); fixture.Repository.CreateBranch("release-2.0.0"); Commands.Checkout(fixture.Repository, "release-2.0.0"); - fixture.AssertFullSemver(config, "2.0.0-beta.0"); + fixture.AssertFullSemver("2.0.0-beta.0", config); // Make some commits on release var commit1 = fixture.Repository.MakeACommit(); fixture.Repository.MakeACommit(); - fixture.AssertFullSemver(config, "2.0.0-beta.2"); + fixture.AssertFullSemver("2.0.0-beta.2", config); // Merge release to develop - emulate commit beetween other person release commit push and this commit merge to develop Commands.Checkout(fixture.Repository, "develop"); @@ -447,12 +447,12 @@ public void CommitBeetweenMergeReleaseToDevelopShouldNotResetCount() // Check version on release after merge to develop Commands.Checkout(fixture.Repository, "release-2.0.0"); - fixture.AssertFullSemver(config, "2.0.0-beta.2"); + fixture.AssertFullSemver("2.0.0-beta.2", config); // Check version on release after making some new commits fixture.Repository.MakeACommit(); fixture.Repository.MakeACommit(); - fixture.AssertFullSemver(config, "2.0.0-beta.4"); + fixture.AssertFullSemver("2.0.0-beta.4", config); } public void ReleaseBranchShouldUseBranchNameVersionDespiteBumpInPreviousCommit() @@ -508,11 +508,11 @@ public void FeatureFromReleaseBranchShouldNotResetCount() Commands.Checkout(fixture.Repository, "develop"); fixture.Repository.CreateBranch("release-2.0.0"); Commands.Checkout(fixture.Repository, "release-2.0.0"); - fixture.AssertFullSemver(config, "2.0.0-beta.0"); + fixture.AssertFullSemver("2.0.0-beta.0", config); // Make some commits on release fixture.Repository.MakeCommits(10); - fixture.AssertFullSemver(config, "2.0.0-beta.10"); + fixture.AssertFullSemver("2.0.0-beta.10", config); // Create feature from release fixture.BranchTo("feature/xxx"); @@ -521,9 +521,9 @@ public void FeatureFromReleaseBranchShouldNotResetCount() // Check version on release Commands.Checkout(fixture.Repository, "release-2.0.0"); - fixture.AssertFullSemver(config, "2.0.0-beta.10"); + fixture.AssertFullSemver("2.0.0-beta.10", config); fixture.Repository.MakeACommit("release 11"); - fixture.AssertFullSemver(config, "2.0.0-beta.11"); + fixture.AssertFullSemver("2.0.0-beta.11", config); // Make new commit on feature Commands.Checkout(fixture.Repository, "feature/xxx"); @@ -531,14 +531,14 @@ public void FeatureFromReleaseBranchShouldNotResetCount() // Checkout to release (no new commits) Commands.Checkout(fixture.Repository, "release-2.0.0"); - fixture.AssertFullSemver(config, "2.0.0-beta.11"); + fixture.AssertFullSemver("2.0.0-beta.11", config); // Merge feature to release fixture.Repository.MergeNoFF("feature/xxx", Generate.SignatureNow()); - fixture.AssertFullSemver(config, "2.0.0-beta.15"); + fixture.AssertFullSemver("2.0.0-beta.15", config); fixture.Repository.MakeACommit("release 13 - after feature merge"); - fixture.AssertFullSemver(config, "2.0.0-beta.16"); + fixture.AssertFullSemver("2.0.0-beta.16", config); } [Test] @@ -606,7 +606,7 @@ public void FeatureOnReleaseFeatureBranchDeleted() // begin the release branch fixture.Repository.CreateBranch(release450); Commands.Checkout(fixture.Repository, release450); - fixture.AssertFullSemver(config, "4.5.0-beta.0"); + fixture.AssertFullSemver("4.5.0-beta.0", config); fixture.Repository.CreateBranch(featureBranch); Commands.Checkout(fixture.Repository, featureBranch); @@ -615,7 +615,7 @@ public void FeatureOnReleaseFeatureBranchDeleted() fixture.Repository.MergeNoFF(featureBranch, Generate.SignatureNow()); // commit 2 fixture.Repository.Branches.Remove(featureBranch); - fixture.AssertFullSemver(config, "4.5.0-beta.2"); + fixture.AssertFullSemver("4.5.0-beta.2", config); } /// @@ -641,7 +641,7 @@ public void FeatureOnReleaseFeatureBranchNotDeleted() // begin the release branch fixture.Repository.CreateBranch(release450); Commands.Checkout(fixture.Repository, release450); - fixture.AssertFullSemver(config, "4.5.0-beta.0"); + fixture.AssertFullSemver("4.5.0-beta.0", config); fixture.Repository.CreateBranch(featureBranch); Commands.Checkout(fixture.Repository, featureBranch); @@ -649,7 +649,7 @@ public void FeatureOnReleaseFeatureBranchNotDeleted() Commands.Checkout(fixture.Repository, release450); fixture.Repository.MergeNoFF(featureBranch, Generate.SignatureNow()); // commit 2 - fixture.AssertFullSemver(config, "4.5.0-beta.2"); + fixture.AssertFullSemver("4.5.0-beta.2", config); } } } diff --git a/src/GitVersionCore.Tests/IntegrationTests/RemoteRepositoryScenarios.cs b/src/GitVersionCore.Tests/IntegrationTests/RemoteRepositoryScenarios.cs index 4b53f6ee79..f91f7ea72a 100644 --- a/src/GitVersionCore.Tests/IntegrationTests/RemoteRepositoryScenarios.cs +++ b/src/GitVersionCore.Tests/IntegrationTests/RemoteRepositoryScenarios.cs @@ -1,7 +1,6 @@ using System; using GitTools.Testing; using GitVersion; -using GitVersion.Exceptions; using GitVersion.Helpers; using GitVersion.Logging; using GitVersionCore.Tests.Helpers; @@ -19,7 +18,7 @@ public void GivenARemoteGitRepositoryWithCommitsThenClonedLocalShouldMatchRemote { using var fixture = new RemoteRepositoryFixture(); fixture.AssertFullSemver("0.1.0+4"); - fixture.AssertFullSemver("0.1.0+4", fixture.LocalRepositoryFixture.Repository); + fixture.AssertFullSemver("0.1.0+4", repository: fixture.LocalRepositoryFixture.Repository); } [Test] @@ -45,7 +44,7 @@ public void GivenARemoteGitRepositoryWithCommitsAndBranchesThenClonedLocalShould GitRepositoryHelper.NormalizeGitDirectory(new NullLog(), new TestEnvironment(), fixture.LocalRepositoryFixture.RepositoryPath, new AuthenticationInfo(), noFetch: false, currentBranch: string.Empty, isDynamicRepository: true); fixture.AssertFullSemver("1.0.0-beta.1+5"); - fixture.AssertFullSemver("1.0.0-beta.1+5", fixture.LocalRepositoryFixture.Repository); + fixture.AssertFullSemver("1.0.0-beta.1+5", repository: fixture.LocalRepositoryFixture.Repository); } [Test] @@ -54,10 +53,10 @@ public void GivenARemoteGitRepositoryAheadOfLocalRepositoryThenChangesShouldPull using var fixture = new RemoteRepositoryFixture(); fixture.Repository.MakeACommit(); fixture.AssertFullSemver("0.1.0+5"); - fixture.AssertFullSemver("0.1.0+4", fixture.LocalRepositoryFixture.Repository); + fixture.AssertFullSemver("0.1.0+4", repository: fixture.LocalRepositoryFixture.Repository); var buildSignature = fixture.LocalRepositoryFixture.Repository.Config.BuildSignature(new DateTimeOffset(DateTime.Now)); Commands.Pull((Repository)fixture.LocalRepositoryFixture.Repository, buildSignature, new PullOptions()); - fixture.AssertFullSemver("0.1.0+5", fixture.LocalRepositoryFixture.Repository); + fixture.AssertFullSemver("0.1.0+5", repository: fixture.LocalRepositoryFixture.Repository); } [Test] @@ -68,7 +67,7 @@ public void GivenARemoteGitRepositoryWhenCheckingOutDetachedheadUsingExistingImp fixture.LocalRepositoryFixture.Repository, fixture.LocalRepositoryFixture.Repository.Head.Tip); - Should.Throw(() => fixture.AssertFullSemver("0.1.0+4", fixture.LocalRepositoryFixture.Repository, onlyTrackedBranches: false), + Should.Throw(() => fixture.AssertFullSemver("0.1.0+4", repository: fixture.LocalRepositoryFixture.Repository, onlyTrackedBranches: false), $"It looks like the branch being examined is a detached Head pointing to commit '{fixture.LocalRepositoryFixture.Repository.Head.Tip.Id.ToString(7)}'. Without a proper branch name GitVersion cannot determine the build version."); } @@ -78,7 +77,7 @@ public void GivenARemoteGitRepositoryWhenCheckingOutDetachedheadUsingTrackingBra using var fixture = new RemoteRepositoryFixture(); Commands.Checkout(fixture.LocalRepositoryFixture.Repository, fixture.LocalRepositoryFixture.Repository.Head.Tip); - fixture.AssertFullSemver("0.1.0+4", fixture.LocalRepositoryFixture.Repository); + fixture.AssertFullSemver("0.1.0+4", repository: fixture.LocalRepositoryFixture.Repository); } } } diff --git a/src/GitVersionCore.Tests/IntegrationTests/VersionBumpingScenarios.cs b/src/GitVersionCore.Tests/IntegrationTests/VersionBumpingScenarios.cs index 0de356e677..11fa44f441 100644 --- a/src/GitVersionCore.Tests/IntegrationTests/VersionBumpingScenarios.cs +++ b/src/GitVersionCore.Tests/IntegrationTests/VersionBumpingScenarios.cs @@ -30,7 +30,7 @@ public void AppliedPrereleaseTagCausesBump() fixture.Repository.MakeATaggedCommit("1.0.0-pre.1"); fixture.Repository.MakeACommit(); - fixture.AssertFullSemver(configuration, "1.0.0-pre.2+1"); + fixture.AssertFullSemver("1.0.0-pre.2+1", configuration); } [Test] diff --git a/src/GitVersionCore.Tests/IntegrationTests/VersionInCurrentBranchNameScenarios.cs b/src/GitVersionCore.Tests/IntegrationTests/VersionInCurrentBranchNameScenarios.cs index cc1eb1eb7b..a6463f8d10 100644 --- a/src/GitVersionCore.Tests/IntegrationTests/VersionInCurrentBranchNameScenarios.cs +++ b/src/GitVersionCore.Tests/IntegrationTests/VersionInCurrentBranchNameScenarios.cs @@ -40,7 +40,7 @@ public void TakesVersionFromNameOfBranchThatIsReleaseByConfig() using var fixture = new BaseGitFlowRepositoryFixture("1.0.0"); fixture.BranchTo("support/2.0.0"); - fixture.AssertFullSemver(config, "2.0.0+1"); + fixture.AssertFullSemver("2.0.0+1", config); } [Test] diff --git a/src/GitVersionCore.Tests/IntegrationTests/VersionInMergedBranchNameScenarios.cs b/src/GitVersionCore.Tests/IntegrationTests/VersionInMergedBranchNameScenarios.cs index 6d8360041b..4f6bcb7d6d 100644 --- a/src/GitVersionCore.Tests/IntegrationTests/VersionInMergedBranchNameScenarios.cs +++ b/src/GitVersionCore.Tests/IntegrationTests/VersionInMergedBranchNameScenarios.cs @@ -41,7 +41,7 @@ public void TakesVersionFromNameOfBranchThatIsReleaseByConfig() using var fixture = new BaseGitFlowRepositoryFixture("1.0.0"); fixture.CreateAndMergeBranchIntoDevelop("support/2.0.0"); - fixture.AssertFullSemver(config, "2.1.0-alpha.2"); + fixture.AssertFullSemver("2.1.0-alpha.2", config); } [Test] diff --git a/src/GitVersionCore.Tests/JsonVersionBuilderTests.cs b/src/GitVersionCore.Tests/JsonVersionBuilderTests.cs index f54a50678e..613cc99fb9 100644 --- a/src/GitVersionCore.Tests/JsonVersionBuilderTests.cs +++ b/src/GitVersionCore.Tests/JsonVersionBuilderTests.cs @@ -1,6 +1,6 @@ using System; using GitVersion; -using GitVersion.OutputVariables; +using GitVersion.VersionCalculation; using GitVersionCore.Tests.Helpers; using Microsoft.Extensions.DependencyInjection; using NUnit.Framework; diff --git a/src/GitVersionCore.Tests/NamedConfigFileLocatorTests.cs b/src/GitVersionCore.Tests/NamedConfigFileLocatorTests.cs index 58a038a6a0..ffa7d9a416 100644 --- a/src/GitVersionCore.Tests/NamedConfigFileLocatorTests.cs +++ b/src/GitVersionCore.Tests/NamedConfigFileLocatorTests.cs @@ -2,7 +2,6 @@ using System.IO; using GitVersion; using GitVersion.Configuration; -using GitVersion.Exceptions; using GitVersion.Logging; using GitVersionCore.Tests.Helpers; using Microsoft.Extensions.DependencyInjection; diff --git a/src/GitVersionCore.Tests/VariableProviderTests.cs b/src/GitVersionCore.Tests/VariableProviderTests.cs index 99fc7e6e5d..3772eeeacd 100644 --- a/src/GitVersionCore.Tests/VariableProviderTests.cs +++ b/src/GitVersionCore.Tests/VariableProviderTests.cs @@ -2,7 +2,6 @@ using System.Collections.Generic; using GitVersion; using GitVersion.Logging; -using GitVersion.OutputVariables; using GitVersion.VersionCalculation; using GitVersionCore.Tests.Helpers; using Microsoft.Extensions.DependencyInjection; diff --git a/src/GitVersionCore.Tests/VersionCalculation/BaseVersionCalculatorTests.cs b/src/GitVersionCore.Tests/VersionCalculation/BaseVersionCalculatorTests.cs index b8c97e87ea..9f800e5d8d 100644 --- a/src/GitVersionCore.Tests/VersionCalculation/BaseVersionCalculatorTests.cs +++ b/src/GitVersionCore.Tests/VersionCalculation/BaseVersionCalculatorTests.cs @@ -5,7 +5,6 @@ using GitVersion.Configuration; using GitVersion.Extensions; using GitVersion.VersionCalculation; -using GitVersion.VersionFilters; using GitVersionCore.Tests.Helpers; using GitVersionCore.Tests.Mocks; using LibGit2Sharp; @@ -22,19 +21,18 @@ public class BaseVersionCalculatorTests : TestBase [Test] public void ChoosesHighestVersionReturnedFromStrategies() { - var context = new GitVersionContextBuilder().Build(); var dateTimeOffset = DateTimeOffset.Now; - - var sp = ConfigureServices(services => + var versionCalculator = GetBaseVersionCalculator(contextBuilder => { - services.RemoveAll(); - services.AddSingleton(new V1Strategy(DateTimeOffset.Now)); - services.AddSingleton(new V2Strategy(dateTimeOffset)); + contextBuilder.OverrideServices(services => + { + services.RemoveAll(); + services.AddSingleton(new V1Strategy(DateTimeOffset.Now)); + services.AddSingleton(new V2Strategy(dateTimeOffset)); + }); }); - var versionCalculator = sp.GetService(); - - var baseVersion = versionCalculator.GetBaseVersion(context); + var baseVersion = versionCalculator.GetBaseVersion(); baseVersion.SemanticVersion.ToString().ShouldBe("2.0.0"); baseVersion.ShouldIncrement.ShouldBe(true); @@ -44,19 +42,19 @@ public void ChoosesHighestVersionReturnedFromStrategies() [Test] public void UsesWhenFromNextBestMatchIfHighestDoesntHaveWhen() { - var context = new GitVersionContextBuilder().Build(); var when = DateTimeOffset.Now; - var sp = ConfigureServices(services => + var versionCalculator = GetBaseVersionCalculator(contextBuilder => { - services.RemoveAll(); - services.AddSingleton(new V1Strategy(when)); - services.AddSingleton(new V2Strategy(null)); + contextBuilder.OverrideServices(services => + { + services.RemoveAll(); + services.AddSingleton(new V1Strategy(when)); + services.AddSingleton(new V2Strategy(null)); + }); }); - var versionCalculator = sp.GetService(); - - var baseVersion = versionCalculator.GetBaseVersion(context); + var baseVersion = versionCalculator.GetBaseVersion(); baseVersion.SemanticVersion.ToString().ShouldBe("2.0.0"); baseVersion.ShouldIncrement.ShouldBe(true); @@ -66,19 +64,19 @@ public void UsesWhenFromNextBestMatchIfHighestDoesntHaveWhen() [Test] public void UsesWhenFromNextBestMatchIfHighestDoesntHaveWhenReversedOrder() { - var context = new GitVersionContextBuilder().Build(); var when = DateTimeOffset.Now; - var sp = ConfigureServices(services => + var versionCalculator = GetBaseVersionCalculator(contextBuilder => { - services.RemoveAll(); - services.AddSingleton(new V1Strategy(null)); - services.AddSingleton(new V2Strategy(when)); + contextBuilder.OverrideServices(services => + { + services.RemoveAll(); + services.AddSingleton(new V1Strategy(null)); + services.AddSingleton(new V2Strategy(when)); + }); }); - var versionCalculator = sp.GetService(); - - var baseVersion = versionCalculator.GetBaseVersion(context); + var baseVersion = versionCalculator.GetBaseVersion(); baseVersion.SemanticVersion.ToString().ShouldBe("2.0.0"); baseVersion.ShouldIncrement.ShouldBe(true); @@ -89,19 +87,20 @@ public void UsesWhenFromNextBestMatchIfHighestDoesntHaveWhenReversedOrder() public void ShouldNotFilterVersion() { var fakeIgnoreConfig = new TestIgnoreConfig(new ExcludeSourcesContainingExclude()); - var context = new GitVersionContextBuilder().WithConfig(new Config - { Ignore = fakeIgnoreConfig }).Build(); - var version = new BaseVersion(context, "dummy", false, new SemanticVersion(2), new MockCommit(), null); + var version = new BaseVersion("dummy", false, new SemanticVersion(2), new MockCommit(), null); - var sp = ConfigureServices(services => + var versionCalculator = GetBaseVersionCalculator(contextBuilder => { - services.RemoveAll(); - services.AddSingleton(new TestVersionStrategy(version)); + contextBuilder + .WithConfig(new Config { Ignore = fakeIgnoreConfig }) + .OverrideServices(services => + { + services.RemoveAll(); + services.AddSingleton(new TestVersionStrategy(version)); + }); }); - var versionCalculator = sp.GetService(); - - var baseVersion = versionCalculator.GetBaseVersion(context); + var baseVersion = versionCalculator.GetBaseVersion(); baseVersion.Source.ShouldBe(version.Source); baseVersion.ShouldIncrement.ShouldBe(version.ShouldIncrement); @@ -112,20 +111,21 @@ public void ShouldNotFilterVersion() public void ShouldFilterVersion() { var fakeIgnoreConfig = new TestIgnoreConfig(new ExcludeSourcesContainingExclude()); - var context = new GitVersionContextBuilder().WithConfig(new Config - { Ignore = fakeIgnoreConfig }).Build(); - var higherVersion = new BaseVersion(context, "exclude", false, new SemanticVersion(2), new MockCommit(), null); - var lowerVersion = new BaseVersion(context, "dummy", false, new SemanticVersion(1), new MockCommit(), null); - var sp = ConfigureServices(services => + var higherVersion = new BaseVersion("exclude", false, new SemanticVersion(2), new MockCommit(), null); + var lowerVersion = new BaseVersion("dummy", false, new SemanticVersion(1), new MockCommit(), null); + + var versionCalculator = GetBaseVersionCalculator(contextBuilder => { - services.RemoveAll(); - services.AddSingleton(new TestVersionStrategy(higherVersion, lowerVersion)); + contextBuilder + .WithConfig(new Config { Ignore = fakeIgnoreConfig }) + .OverrideServices(services => + { + services.RemoveAll(); + services.AddSingleton(new TestVersionStrategy(higherVersion, lowerVersion)); + }); }); - - var versionCalculator = sp.GetService(); - - var baseVersion = versionCalculator.GetBaseVersion(context); + var baseVersion = versionCalculator.GetBaseVersion(); baseVersion.Source.ShouldNotBe(higherVersion.Source); baseVersion.SemanticVersion.ShouldNotBe(higherVersion.SemanticVersion); @@ -133,6 +133,16 @@ public void ShouldFilterVersion() baseVersion.SemanticVersion.ShouldBe(lowerVersion.SemanticVersion); } + private static IBaseVersionCalculator GetBaseVersionCalculator(Action contextBuilderAction) + { + var contextBuilder = new GitVersionContextBuilder(); + contextBuilderAction?.Invoke(contextBuilder); + + contextBuilder.Build(); + + return contextBuilder.ServicesProvider.GetService(); + } + private class TestIgnoreConfig : IgnoreConfig { private readonly IVersionFilter filter; @@ -172,9 +182,9 @@ public V1Strategy(DateTimeOffset? when) this.when = when == null ? null : new MockCommit { CommitterEx = Generate.Signature(when.Value) }; } - public IEnumerable GetVersions(GitVersionContext context) + public IEnumerable GetVersions() { - yield return new BaseVersion(context, "Source 1", false, new SemanticVersion(1), when, null); + yield return new BaseVersion("Source 1", false, new SemanticVersion(1), when, null); } } @@ -187,9 +197,9 @@ public V2Strategy(DateTimeOffset? when) this.when = when == null ? null : new MockCommit { CommitterEx = Generate.Signature(when.Value) }; } - public IEnumerable GetVersions(GitVersionContext context) + public IEnumerable GetVersions() { - yield return new BaseVersion(context, "Source 2", true, new SemanticVersion(2), when, null); + yield return new BaseVersion("Source 2", true, new SemanticVersion(2), when, null); } } @@ -202,7 +212,7 @@ public TestVersionStrategy(params BaseVersion[] versions) this.versions = versions; } - public IEnumerable GetVersions(GitVersionContext context) + public IEnumerable GetVersions() { return versions; } diff --git a/src/GitVersionCore.Tests/VersionCalculation/NextVersionCalculatorTests.cs b/src/GitVersionCore.Tests/VersionCalculation/NextVersionCalculatorTests.cs index 49c7ea770b..265a6305c8 100644 --- a/src/GitVersionCore.Tests/VersionCalculation/NextVersionCalculatorTests.cs +++ b/src/GitVersionCore.Tests/VersionCalculation/NextVersionCalculatorTests.cs @@ -21,18 +21,21 @@ public void ShouldIncrementVersionBasedOnConfig() { var semanticVersionBuildMetaData = new SemanticVersionBuildMetaData("ef7d0d7e1e700f1c7c9fa01ea6791bb778a5c37c", 1, "master", "b1a34edbd80e141f7cc046c074f109be7d022074", "b1a34e", DateTimeOffset.Now); - var sp = ConfigureServices(services => - { - services.AddSingleton(new TestBaseVersionCalculator(true, new SemanticVersion(1), new MockCommit())); - services.AddSingleton(new TestMetaDataCalculator(semanticVersionBuildMetaData)); - }); + var contextBuilder = new GitVersionContextBuilder(); - var nextVersionCalculator = sp.GetService() as NextVersionCalculator; - nextVersionCalculator.ShouldNotBeNull(); + contextBuilder + .OverrideServices(services => + { + services.AddSingleton(new TestBaseVersionCalculator(true, new SemanticVersion(1), new MockCommit())); + services.AddSingleton(new TestMainlineVersionCalculator(semanticVersionBuildMetaData)); + }) + .WithConfig(new Config()) + .Build(); - var context = new GitVersionContextBuilder().WithConfig(new Config()).Build(); + var nextVersionCalculator = contextBuilder.ServicesProvider.GetService() as NextVersionCalculator; + nextVersionCalculator.ShouldNotBeNull(); - var version = nextVersionCalculator.FindVersionInternal(context); + var version = nextVersionCalculator.FindVersionInternal(); version.ToString().ShouldBe("1.0.1"); } @@ -41,18 +44,23 @@ public void ShouldIncrementVersionBasedOnConfig() public void DoesNotIncrementWhenBaseVersionSaysNotTo() { var semanticVersionBuildMetaData = new SemanticVersionBuildMetaData("ef7d0d7e1e700f1c7c9fa01ea6791bb778a5c37c", 1, "master", "b1a34edbd80e141f7cc046c074f109be7d022074", "b1a34e", DateTimeOffset.Now); - var sp = ConfigureServices(services => - { - services.AddSingleton(new TestBaseVersionCalculator(false, new SemanticVersion(1), new MockCommit())); - services.AddSingleton(new TestMetaDataCalculator(semanticVersionBuildMetaData)); - }); - var nextVersionCalculator = sp.GetService() as NextVersionCalculator; + var contextBuilder = new GitVersionContextBuilder(); + + contextBuilder + .OverrideServices(services => + { + services.AddSingleton(new TestBaseVersionCalculator(false, new SemanticVersion(1), new MockCommit())); + services.AddSingleton(new TestMainlineVersionCalculator(semanticVersionBuildMetaData)); + }) + .WithConfig(new Config()) + .Build(); + + var nextVersionCalculator = contextBuilder.ServicesProvider.GetService() as NextVersionCalculator; nextVersionCalculator.ShouldNotBeNull(); - var context = new GitVersionContextBuilder().WithConfig(new Config()).Build(); - var version = nextVersionCalculator.FindVersionInternal(context); + var version = nextVersionCalculator.FindVersionInternal(); version.ToString().ShouldBe("1.0.0"); } @@ -61,21 +69,21 @@ public void DoesNotIncrementWhenBaseVersionSaysNotTo() public void AppliesBranchPreReleaseTag() { var semanticVersionBuildMetaData = new SemanticVersionBuildMetaData("ef7d0d7e1e700f1c7c9fa01ea6791bb778a5c37c", 2, "develop", "b1a34edbd80e141f7cc046c074f109be7d022074", "b1a34e", DateTimeOffset.Now); + var contextBuilder = new GitVersionContextBuilder(); - var sp = ConfigureServices(services => - { - services.AddSingleton(new TestBaseVersionCalculator(false, new SemanticVersion(1), new MockCommit())); - services.AddSingleton(new TestMetaDataCalculator(semanticVersionBuildMetaData)); - }); - - var nextVersionCalculator = sp.GetService() as NextVersionCalculator; - nextVersionCalculator.ShouldNotBeNull(); - - var context = new GitVersionContextBuilder() + contextBuilder + .OverrideServices(services => + { + services.AddSingleton(new TestBaseVersionCalculator(false, new SemanticVersion(1), new MockCommit())); + services.AddSingleton(new TestMainlineVersionCalculator(semanticVersionBuildMetaData)); + }) .WithDevelopBranch() .Build(); - var version = nextVersionCalculator.FindVersionInternal(context); + var nextVersionCalculator = contextBuilder.ServicesProvider.GetService() as NextVersionCalculator; + nextVersionCalculator.ShouldNotBeNull(); + + var version = nextVersionCalculator.FindVersionInternal(); version.ToString("f").ShouldBe("1.0.0-alpha.1+2"); } @@ -106,7 +114,7 @@ public void PreReleaseTagCanUseBranchName() fixture.BranchTo("custom/foo"); fixture.MakeACommit(); - fixture.AssertFullSemver(config, "1.0.0-foo.1+2"); + fixture.AssertFullSemver("1.0.0-foo.1+2", config); } [Test] @@ -135,7 +143,7 @@ public void PreReleaseTagCanUseBranchNameVariable() fixture.BranchTo("custom/foo"); fixture.MakeACommit(); - fixture.AssertFullSemver(config, "1.0.0-alpha.foo.1+2"); + fixture.AssertFullSemver("1.0.0-alpha.foo.1+2", config); } [Test] @@ -163,12 +171,12 @@ public void PreReleaseNumberShouldBeScopeToPreReleaseLabelInContinuousDelivery() fixture.Repository.MakeATaggedCommit("0.1.0-test.1"); fixture.Repository.MakeACommit(); - fixture.AssertFullSemver(config, "0.1.0-test.2+2"); + fixture.AssertFullSemver("0.1.0-test.2+2", config); Commands.Checkout(fixture.Repository, "master"); fixture.Repository.Merge(fixture.Repository.FindBranch("feature/test"), Generate.SignatureNow()); - fixture.AssertFullSemver(config, "0.1.0-beta.1+2"); + fixture.AssertFullSemver("0.1.0-beta.1+2", config); } } } diff --git a/src/GitVersionCore.Tests/VersionCalculation/Strategies/ConfigNextVersionBaseVersionStrategyTests.cs b/src/GitVersionCore.Tests/VersionCalculation/Strategies/ConfigNextVersionBaseVersionStrategyTests.cs index 9a71f7b148..e9b8f6cf98 100644 --- a/src/GitVersionCore.Tests/VersionCalculation/Strategies/ConfigNextVersionBaseVersionStrategyTests.cs +++ b/src/GitVersionCore.Tests/VersionCalculation/Strategies/ConfigNextVersionBaseVersionStrategyTests.cs @@ -1,7 +1,11 @@ using System.Linq; +using GitVersion; using GitVersion.Configuration; using GitVersion.VersionCalculation; using GitVersionCore.Tests.Helpers; +using LibGit2Sharp; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Options; using NUnit.Framework; using Shouldly; @@ -10,81 +14,44 @@ namespace GitVersionCore.Tests.VersionCalculation.Strategies [TestFixture] public class ConfigNextVersionBaseVersionStrategyTests : TestBase { - private IVersionStrategy strategy; - private GitVersionContextBuilder contextBuilder; - - [SetUp] - public void SetUp() - { - strategy = new ConfigNextVersionVersionStrategy(); - contextBuilder = new GitVersionContextBuilder(); - } - - [Test] - public void ShouldNotBeIncremented() - { - var gitVersionContext = contextBuilder - .WithConfig(new Config - { - NextVersion = "1.0.0" - }).Build(); - - var baseVersion = strategy.GetVersions(gitVersionContext).Single(); - - baseVersion.ShouldIncrement.ShouldBe(false); - baseVersion.SemanticVersion.ToString().ShouldBe("1.0.0"); - } - [Test] public void ReturnsNullWhenNoNextVersionIsInConfig() { - var gitVersionContext = contextBuilder.Build(); - - var baseVersion = strategy.GetVersions(gitVersionContext).SingleOrDefault(); + var baseVersion = GetBaseVersion(); baseVersion.ShouldBe(null); } - [Test] - public void NextVersionCanBeInteger() + [TestCase("1.0.0", "1.0.0")] + [TestCase("2", "2.0.0")] + [TestCase("2.118998723", "2.118998723.0")] + [TestCase("2.12.654651698", "2.12.654651698")] + public void ConfigNextVersionTest(string nextVersion, string expectedVersion) { - var gitVersionContext = contextBuilder - .WithConfig(new Config - { - NextVersion = "2" - }).Build(); - - var baseVersion = strategy.GetVersions(gitVersionContext).Single(); + var baseVersion = GetBaseVersion(new Config + { + NextVersion = nextVersion + }); - baseVersion.SemanticVersion.ToString().ShouldBe("2.0.0"); + baseVersion.ShouldIncrement.ShouldBe(false); + baseVersion.SemanticVersion.ToString().ShouldBe(expectedVersion); } - [Test] - public void NextVersionCanHaveEnormousMinorVersion() + private static BaseVersion GetBaseVersion(Config config = null) { - var gitVersionContext = contextBuilder - .WithConfig(new Config - { - NextVersion = "2.118998723" - }).Build(); + var contextBuilder = new GitVersionContextBuilder(); - var baseVersion = strategy.GetVersions(gitVersionContext).Single(); - - baseVersion.SemanticVersion.ToString().ShouldBe("2.118998723.0"); - } - - [Test] - public void NextVersionCanHavePatch() - { - var gitVersionContext = contextBuilder - .WithConfig(new Config - { - NextVersion = "2.12.654651698" - }).Build(); + if (config != null) + { + contextBuilder = contextBuilder.WithConfig(config); + } - var baseVersion = strategy.GetVersions(gitVersionContext).Single(); + contextBuilder.Build(); + var options = contextBuilder.ServicesProvider.GetService>(); + var repository = contextBuilder.ServicesProvider.GetService(); + var strategy = new ConfigNextVersionVersionStrategy(repository, options); - baseVersion.SemanticVersion.ToString().ShouldBe("2.12.654651698"); + return strategy.GetVersions().SingleOrDefault(); } } } diff --git a/src/GitVersionCore.Tests/VersionCalculation/Strategies/MergeMessageBaseVersionStrategyTests.cs b/src/GitVersionCore.Tests/VersionCalculation/Strategies/MergeMessageBaseVersionStrategyTests.cs index 09fa44c28e..8f43667d92 100644 --- a/src/GitVersionCore.Tests/VersionCalculation/Strategies/MergeMessageBaseVersionStrategyTests.cs +++ b/src/GitVersionCore.Tests/VersionCalculation/Strategies/MergeMessageBaseVersionStrategyTests.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.Linq; +using GitVersion; using GitVersion.Configuration; using GitVersion.Logging; using GitVersion.VersionCalculation; @@ -7,6 +8,7 @@ using GitVersionCore.Tests.Mocks; using LibGit2Sharp; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Options; using NUnit.Framework; using Shouldly; @@ -15,30 +17,26 @@ namespace GitVersionCore.Tests.VersionCalculation.Strategies [TestFixture] public class MergeMessageBaseVersionStrategyTests : TestBase { - private readonly ILog log; - - public MergeMessageBaseVersionStrategyTests() - { - var sp = ConfigureServices(); - log = sp.GetService(); - } - [Test] public void ShouldNotAllowIncrementOfVersion() { // When a branch is merged in you want to start building stable packages of that version // So we shouldn't bump the version - var context = new GitVersionContextBuilder().WithRepository(new MockRepository + var contextBuilder = new GitVersionContextBuilder().WithRepository(new MockRepository { Head = new MockBranch("master") { new MockCommit { MessageEx = "Merge branch 'release-0.1.5'", ParentsEx = GetParents(true) } } - }).Build(); - var strategy = new MergeMessageVersionStrategy(log); + }); + contextBuilder.Build(); + var log = contextBuilder.ServicesProvider.GetService(); + var options = contextBuilder.ServicesProvider.GetService>(); + var repository = contextBuilder.ServicesProvider.GetService(); + var strategy = new MergeMessageVersionStrategy(log, repository, options); - var baseVersion = strategy.GetVersions(context).Single(); + var baseVersion = strategy.GetVersions().Single(); baseVersion.ShouldIncrement.ShouldBe(false); } @@ -162,7 +160,7 @@ private void AssertMergeMessage(string message, string expectedVersion, IList(); + var options = contextBuilder.ServicesProvider.GetService>(); + var repository = contextBuilder.ServicesProvider.GetService(); + var strategy = new MergeMessageVersionStrategy(log, repository, options); + + var baseVersion = strategy.GetVersions().SingleOrDefault(); if (expectedVersion == null) { diff --git a/src/GitVersionCore.Tests/VersionCalculation/Strategies/VersionInBranchNameBaseVersionStrategyTests.cs b/src/GitVersionCore.Tests/VersionCalculation/Strategies/VersionInBranchNameBaseVersionStrategyTests.cs index 58143f3e69..0c5d721036 100644 --- a/src/GitVersionCore.Tests/VersionCalculation/Strategies/VersionInBranchNameBaseVersionStrategyTests.cs +++ b/src/GitVersionCore.Tests/VersionCalculation/Strategies/VersionInBranchNameBaseVersionStrategyTests.cs @@ -2,11 +2,13 @@ using System.Linq; using GitTools.Testing; using GitVersion; +using GitVersion.Common; using GitVersion.Configuration; -using GitVersion.Logging; using GitVersion.VersionCalculation; using GitVersionCore.Tests.Helpers; using LibGit2Sharp; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Options; using NUnit.Framework; using Shouldly; @@ -15,27 +17,16 @@ namespace GitVersionCore.Tests.VersionCalculation.Strategies [TestFixture] public class VersionInBranchNameBaseVersionStrategyTests : TestBase { - private readonly ILog log; - private readonly IVersionStrategy strategy; - private readonly Config configuration; - - public VersionInBranchNameBaseVersionStrategyTests() - { - log = new NullLog(); - strategy = new VersionInBranchNameVersionStrategy(); - configuration = new Config().ApplyDefaults(); - } - [TestCase("release-2.0.0", "2.0.0")] [TestCase("release/3.0.0", "3.0.0")] public void CanTakeVersionFromNameOfReleaseBranch(string branchName, string expectedBaseVersion) { using var fixture = new EmptyRepositoryFixture(); fixture.Repository.MakeACommit(); - var branch = fixture.Repository.CreateBranch(branchName); + fixture.Repository.CreateBranch(branchName); - var gitVersionContext = new GitVersionContext(fixture.Repository, log, branch, configuration); - var baseVersion = strategy.GetVersions(gitVersionContext).Single(); + var strategy = GetVersionStrategy(fixture.Repository, branchName); + var baseVersion = strategy.GetVersions().Single(); baseVersion.SemanticVersion.ToString().ShouldBe(expectedBaseVersion); } @@ -48,10 +39,10 @@ public void ShouldNotTakeVersionFromNameOfNonReleaseBranch(string branchName) { using var fixture = new EmptyRepositoryFixture(); fixture.Repository.MakeACommit(); - var branch = fixture.Repository.CreateBranch(branchName); + fixture.Repository.CreateBranch(branchName); - var gitVersionContext = new GitVersionContext(fixture.Repository, log, branch, configuration); - var baseVersions = strategy.GetVersions(gitVersionContext); + var strategy = GetVersionStrategy(fixture.Repository, branchName); + var baseVersions = strategy.GetVersions(); baseVersions.ShouldBeEmpty(); } @@ -62,12 +53,14 @@ public void CanTakeVersionFromNameOfConfiguredReleaseBranch(string branchName, s { using var fixture = new EmptyRepositoryFixture(); fixture.Repository.MakeACommit(); - var branch = fixture.Repository.CreateBranch(branchName); + fixture.Repository.CreateBranch(branchName); var branchConfigs = new Dictionary { { "support", new BranchConfig { IsReleaseBranch = true } } }; - configuration.Branches = branchConfigs; - var gitVersionContext = new GitVersionContext(fixture.Repository, log, branch, configuration); - var baseVersion = strategy.GetVersions(gitVersionContext).Single(); + var config = new Config().ApplyDefaults(); + config.Branches = branchConfigs; + var strategy = GetVersionStrategy(fixture.Repository, branchName, config); + + var baseVersion = strategy.GetVersions().Single(); baseVersion.SemanticVersion.ToString().ShouldBe(expectedBaseVersion); } @@ -84,10 +77,25 @@ public void CanTakeVersionFromNameOfRemoteReleaseBranch(string branchName, strin Commands.Fetch((Repository)fixture.LocalRepositoryFixture.Repository, fixture.LocalRepositoryFixture.Repository.Network.Remotes.First().Name, new string[0], new FetchOptions(), null); fixture.LocalRepositoryFixture.Checkout($"origin/{branchName}"); - var gitVersionContext = new GitVersionContext(fixture.Repository, log, branch, configuration); - var baseVersion = strategy.GetVersions(gitVersionContext).Single(); + var strategy = GetVersionStrategy(fixture.Repository, branchName); + var baseVersion = strategy.GetVersions().Single(); baseVersion.SemanticVersion.ToString().ShouldBe(expectedBaseVersion); } + + private IVersionStrategy GetVersionStrategy(IRepository repository, string branch, Config config = null) + { + config ??= new Config().ApplyDefaults(); + var options = Options.Create(new Arguments { OverrideConfig = config, TargetBranch = branch }); + + var sp = ConfigureServices(services => + { + services.AddSingleton(repository); + services.AddSingleton(options); + }); + var gitRepoMetadataProvider = sp.GetService(); + var contextOptions = sp.GetService>(); + return new VersionInBranchNameVersionStrategy(gitRepoMetadataProvider, repository, contextOptions); + } } } diff --git a/src/GitVersionCore.Tests/VersionCalculation/TestBaseVersionCalculator.cs b/src/GitVersionCore.Tests/VersionCalculation/TestBaseVersionCalculator.cs index 46d7cbc811..e6bd7e5966 100644 --- a/src/GitVersionCore.Tests/VersionCalculation/TestBaseVersionCalculator.cs +++ b/src/GitVersionCore.Tests/VersionCalculation/TestBaseVersionCalculator.cs @@ -17,9 +17,9 @@ public TestBaseVersionCalculator(bool shouldIncrement, SemanticVersion semanticV this.shouldIncrement = shouldIncrement; } - public BaseVersion GetBaseVersion(GitVersionContext context) + public BaseVersion GetBaseVersion() { - return new BaseVersion(context, "Test source", shouldIncrement, semanticVersion, source, null); + return new BaseVersion("Test source", shouldIncrement, semanticVersion, source, null); } } } diff --git a/src/GitVersionCore.Tests/VersionCalculation/TestMainlineVersionCalculator.cs b/src/GitVersionCore.Tests/VersionCalculation/TestMainlineVersionCalculator.cs new file mode 100644 index 0000000000..473365158d --- /dev/null +++ b/src/GitVersionCore.Tests/VersionCalculation/TestMainlineVersionCalculator.cs @@ -0,0 +1,26 @@ +using GitVersion; +using GitVersion.VersionCalculation; +using LibGit2Sharp; + +namespace GitVersionCore.Tests.VersionCalculation +{ + public class TestMainlineVersionCalculator : IMainlineVersionCalculator + { + private readonly SemanticVersionBuildMetaData metaData; + + public TestMainlineVersionCalculator(SemanticVersionBuildMetaData metaData) + { + this.metaData = metaData; + } + + public SemanticVersion FindMainlineModeVersion(BaseVersion baseVersion) + { + throw new System.NotImplementedException(); + } + + public SemanticVersionBuildMetaData CreateVersionBuildMetaData(Commit baseVersionSource) + { + return metaData; + } + } +} diff --git a/src/GitVersionCore.Tests/VersionCalculation/TestMetaDataCalculator.cs b/src/GitVersionCore.Tests/VersionCalculation/TestMetaDataCalculator.cs deleted file mode 100644 index 610f144f64..0000000000 --- a/src/GitVersionCore.Tests/VersionCalculation/TestMetaDataCalculator.cs +++ /dev/null @@ -1,21 +0,0 @@ -using GitVersion; -using GitVersion.VersionCalculation; -using LibGit2Sharp; - -namespace GitVersionCore.Tests.VersionCalculation -{ - public class TestMetaDataCalculator : IMetaDataCalculator - { - private readonly SemanticVersionBuildMetaData metaData; - - public TestMetaDataCalculator(SemanticVersionBuildMetaData metaData) - { - this.metaData = metaData; - } - - public SemanticVersionBuildMetaData Create(Commit baseVersionSource, GitVersionContext context) - { - return metaData; - } - } -} diff --git a/src/GitVersionCore.Tests/VersionFilters/MinDateVersionFilterTests.cs b/src/GitVersionCore.Tests/VersionFilters/MinDateVersionFilterTests.cs index 52e73cf5c6..1a5f2ff194 100644 --- a/src/GitVersionCore.Tests/VersionFilters/MinDateVersionFilterTests.cs +++ b/src/GitVersionCore.Tests/VersionFilters/MinDateVersionFilterTests.cs @@ -1,7 +1,6 @@ using System; using GitVersion; using GitVersion.VersionCalculation; -using GitVersion.VersionFilters; using GitVersionCore.Tests.Helpers; using GitVersionCore.Tests.Mocks; using NUnit.Framework; @@ -24,9 +23,8 @@ public void VerifyNullGuard() [Test] public void WhenCommitShouldExcludeWithReason() { - var context = new GitVersionContextBuilder().Build(); var commit = new MockCommit(); //when = UtcNow - var version = new BaseVersion(context, "dummy", false, new SemanticVersion(1), commit, string.Empty); + var version = new BaseVersion("dummy", false, new SemanticVersion(1), commit, string.Empty); var futureDate = DateTimeOffset.UtcNow.AddYears(1); var sut = new MinDateVersionFilter(futureDate); @@ -38,8 +36,7 @@ public void WhenCommitShouldExcludeWithReason() public void WhenShaMismatchShouldNotExclude() { var commit = new MockCommit(); //when = UtcNow - var context = new GitVersionContextBuilder().Build(); - var version = new BaseVersion(context, "dummy", false, new SemanticVersion(1), commit, string.Empty); + var version = new BaseVersion("dummy", false, new SemanticVersion(1), commit, string.Empty); var pastDate = DateTimeOffset.UtcNow.AddYears(-1); var sut = new MinDateVersionFilter(pastDate); @@ -50,8 +47,7 @@ public void WhenShaMismatchShouldNotExclude() [Test] public void ExcludeShouldAcceptVersionWithNullCommit() { - var context = new GitVersionContextBuilder().Build(); - var version = new BaseVersion(context, "dummy", false, new SemanticVersion(1), null, string.Empty); + var version = new BaseVersion("dummy", false, new SemanticVersion(1), null, string.Empty); var futureDate = DateTimeOffset.UtcNow.AddYears(1); var sut = new MinDateVersionFilter(futureDate); diff --git a/src/GitVersionCore.Tests/VersionFilters/ShaVersionFilterTests.cs b/src/GitVersionCore.Tests/VersionFilters/ShaVersionFilterTests.cs index a96ae7b704..74d6f3c942 100644 --- a/src/GitVersionCore.Tests/VersionFilters/ShaVersionFilterTests.cs +++ b/src/GitVersionCore.Tests/VersionFilters/ShaVersionFilterTests.cs @@ -1,7 +1,6 @@ using System; using GitVersion; using GitVersion.VersionCalculation; -using GitVersion.VersionFilters; using GitVersionCore.Tests.Helpers; using GitVersionCore.Tests.Mocks; using NUnit.Framework; @@ -31,8 +30,7 @@ public void VerifyNullGuard2() public void WhenShaMatchShouldExcludeWithReason() { var commit = new MockCommit(); - var context = new GitVersionContextBuilder().Build(); - var version = new BaseVersion(context, "dummy", false, new SemanticVersion(1), commit, string.Empty); + var version = new BaseVersion("dummy", false, new SemanticVersion(1), commit, string.Empty); var sut = new ShaVersionFilter(new[] { commit.Sha }); sut.Exclude(version, out var reason).ShouldBeTrue(); @@ -43,8 +41,7 @@ public void WhenShaMatchShouldExcludeWithReason() public void WhenShaMismatchShouldNotExclude() { var commit = new MockCommit(); - var context = new GitVersionContextBuilder().Build(); - var version = new BaseVersion(context, "dummy", false, new SemanticVersion(1), commit, string.Empty); + var version = new BaseVersion("dummy", false, new SemanticVersion(1), commit, string.Empty); var sut = new ShaVersionFilter(new[] { "mismatched" }); sut.Exclude(version, out var reason).ShouldBeFalse(); @@ -54,8 +51,7 @@ public void WhenShaMismatchShouldNotExclude() [Test] public void ExcludeShouldAcceptVersionWithNullCommit() { - var context = new GitVersionContextBuilder().Build(); - var version = new BaseVersion(context, "dummy", false, new SemanticVersion(1), null, string.Empty); + var version = new BaseVersion("dummy", false, new SemanticVersion(1), null, string.Empty); var sut = new ShaVersionFilter(new[] { "mismatched" }); sut.Exclude(version, out var reason).ShouldBeFalse(); diff --git a/src/GitVersionCore.Tests/VersionSourceTests.cs b/src/GitVersionCore.Tests/VersionSourceTests.cs index 4132dc4dec..83c22bff6e 100644 --- a/src/GitVersionCore.Tests/VersionSourceTests.cs +++ b/src/GitVersionCore.Tests/VersionSourceTests.cs @@ -1,11 +1,11 @@ using GitTools.Testing; using GitVersion; using GitVersion.Configuration; -using GitVersion.Logging; using GitVersion.VersionCalculation; using GitVersionCore.Tests.Helpers; using LibGit2Sharp; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Options; using NUnit.Framework; using Shouldly; @@ -14,23 +14,23 @@ namespace GitVersionCore.Tests [TestFixture] public class VersionSourceTests : TestBase { - private ILog log; - private INextVersionCalculator nextVersionCalculator; - - [SetUp] - public void SetUp() + private static INextVersionCalculator GetNextVersionCalculator(IRepository repository, string branch) { - var sp = ConfigureServices(); + var config = new Config().ApplyDefaults(); + var options = Options.Create(new Arguments { OverrideConfig = config, TargetBranch = branch }); + + var sp = ConfigureServices(services => + { + services.AddSingleton(options); + services.AddSingleton(repository); + }); - log = sp.GetService(); - nextVersionCalculator = sp.GetService(); + return sp.GetService(); } [Test] public void VersionSourceSha() { - var config = new Config().ApplyDefaults(); - using var fixture = new EmptyRepositoryFixture(); var initialCommit = fixture.Repository.MakeACommit(); Commands.Checkout(fixture.Repository, fixture.Repository.CreateBranch("develop")); @@ -39,8 +39,9 @@ public void VersionSourceSha() Commands.Checkout(fixture.Repository, featureBranch); _ = fixture.Repository.MakeACommit(); - var context = new GitVersionContext(fixture.Repository, log, fixture.Repository.Head, config); - var version = nextVersionCalculator.FindVersion(context); + var nextVersionCalculator = GetNextVersionCalculator(fixture.Repository, fixture.Repository.Head.CanonicalName); + + var version = nextVersionCalculator.FindVersion(); version.BuildMetaData.VersionSourceSha.ShouldBe(initialCommit.Sha); version.BuildMetaData.CommitsSinceVersionSource.ShouldBe(2); @@ -49,13 +50,12 @@ public void VersionSourceSha() [Test] public void VersionSourceShaOneCommit() { - var config = new Config().ApplyDefaults(); - using var fixture = new EmptyRepositoryFixture(); var initialCommit = fixture.Repository.MakeACommit(); - var context = new GitVersionContext(fixture.Repository, log, fixture.Repository.Head, config); - var version = nextVersionCalculator.FindVersion(context); + var nextVersionCalculator = GetNextVersionCalculator(fixture.Repository, fixture.Repository.Head.CanonicalName); + + var version = nextVersionCalculator.FindVersion(); version.BuildMetaData.VersionSourceSha.ShouldBe(initialCommit.Sha); version.BuildMetaData.CommitsSinceVersionSource.ShouldBe(0); @@ -64,8 +64,6 @@ public void VersionSourceShaOneCommit() [Test] public void VersionSourceShaUsingTag() { - var config = new Config().ApplyDefaults(); - using var fixture = new EmptyRepositoryFixture(); _ = fixture.Repository.MakeACommit(); Commands.Checkout(fixture.Repository, fixture.Repository.CreateBranch("develop")); @@ -75,8 +73,9 @@ public void VersionSourceShaUsingTag() Commands.Checkout(fixture.Repository, featureBranch); _ = fixture.Repository.MakeACommit(); - var context = new GitVersionContext(fixture.Repository, log, fixture.Repository.Head, config); - var version = nextVersionCalculator.FindVersion(context); + var nextVersionCalculator = GetNextVersionCalculator(fixture.Repository, fixture.Repository.Head.CanonicalName); + + var version = nextVersionCalculator.FindVersion(); version.BuildMetaData.VersionSourceSha.ShouldBe(secondCommit.Sha); version.BuildMetaData.CommitsSinceVersionSource.ShouldBe(1); diff --git a/src/GitVersionCore.Tests/WixFileTests.cs b/src/GitVersionCore.Tests/WixFileTests.cs index ffac4e7e39..b5b4f9ba9e 100644 --- a/src/GitVersionCore.Tests/WixFileTests.cs +++ b/src/GitVersionCore.Tests/WixFileTests.cs @@ -4,7 +4,7 @@ using GitVersion; using GitVersion.Extensions; using GitVersion.Logging; -using GitVersion.OutputVariables; +using GitVersion.VersionCalculation; using GitVersionCore.Tests.Helpers; using Microsoft.Extensions.DependencyInjection; using NUnit.Framework; diff --git a/src/GitVersionCore/Common/IGitRepoMetadataProvider.cs b/src/GitVersionCore/Common/IGitRepoMetadataProvider.cs new file mode 100644 index 0000000000..e2824cf135 --- /dev/null +++ b/src/GitVersionCore/Common/IGitRepoMetadataProvider.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; +using GitVersion.Configuration; +using LibGit2Sharp; + +namespace GitVersion.Common +{ + public interface IGitRepoMetadataProvider + { + IEnumerable> GetValidVersionTags(string tagPrefixRegex, DateTimeOffset? olderThan = null); + IEnumerable GetVersionTagsOnBranch(Branch branch, string tagPrefixRegex); + IEnumerable GetBranchesContainingCommit(Commit commit, IEnumerable branches, bool onlyTrackedBranches); + + /// + /// Find the merge base of the two branches, i.e. the best common ancestor of the two branches' tips. + /// + Commit FindMergeBase(Branch branch, Branch otherBranch); + + /// + /// Find the commit where the given branch was branched from another branch. + /// If there are multiple such commits and branches, tries to guess based on commit histories. + /// + BranchCommit FindCommitBranchWasBranchedFrom(Branch branch, Config configuration, params Branch[] excludedBranches); + } +} diff --git a/src/GitVersionCore/Common/IGitVersionContextFactory.cs b/src/GitVersionCore/Common/IGitVersionContextFactory.cs new file mode 100644 index 0000000000..5ddcde6192 --- /dev/null +++ b/src/GitVersionCore/Common/IGitVersionContextFactory.cs @@ -0,0 +1,9 @@ +using LibGit2Sharp; + +namespace GitVersion +{ + public interface IGitVersionContextFactory + { + GitVersionContext Create(Arguments arguments, IRepository repository); + } +} diff --git a/src/GitVersionCore/Configuration/BranchConfigurationCalculator.cs b/src/GitVersionCore/Configuration/BranchConfigurationCalculator.cs index 5fdf701b94..e7550add15 100644 --- a/src/GitVersionCore/Configuration/BranchConfigurationCalculator.cs +++ b/src/GitVersionCore/Configuration/BranchConfigurationCalculator.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Linq; using System.Text.RegularExpressions; +using GitVersion.Common; using GitVersion.Extensions; using GitVersion.Logging; using LibGit2Sharp; @@ -10,34 +11,35 @@ namespace GitVersion.Configuration { public class BranchConfigurationCalculator : IBranchConfigurationCalculator { - public static string FallbackConfigName = "Fallback"; - private readonly GitVersionContext context; + private const string FallbackConfigName = "Fallback"; + private readonly ILog log; + private readonly IGitRepoMetadataProvider repoMetadataProvider; - public BranchConfigurationCalculator(ILog log, GitVersionContext context) + public BranchConfigurationCalculator(ILog log, IGitRepoMetadataProvider repoMetadataProvider) { this.log = log ?? throw new ArgumentNullException(nameof(log)); - this.context = context; + this.repoMetadataProvider = repoMetadataProvider ?? throw new ArgumentNullException(nameof(repoMetadataProvider)); } /// /// Gets the for the current commit. /// - public BranchConfig GetBranchConfiguration(Branch targetBranch, IList excludedInheritBranches = null) + public BranchConfig GetBranchConfiguration(IRepository repository, Branch targetBranch, Commit currentCommit, Config configuration, IList excludedInheritBranches = null) { - var matchingBranches = context.FullConfiguration.GetConfigForBranch(targetBranch.NameWithoutRemote()); + var matchingBranches = configuration.GetConfigForBranch(targetBranch.NameWithoutRemote()); if (matchingBranches == null) { log.Info($"No branch configuration found for branch {targetBranch.FriendlyName}, falling back to default configuration"); matchingBranches = new BranchConfig { Name = FallbackConfigName }; - context.FullConfiguration.ApplyBranchDefaults(matchingBranches, "", new List()); + configuration.ApplyBranchDefaults(matchingBranches, "", new List()); } if (matchingBranches.Increment == IncrementStrategy.Inherit) { - matchingBranches = InheritBranchConfiguration(targetBranch, matchingBranches, excludedInheritBranches); + matchingBranches = InheritBranchConfiguration(repository, targetBranch, matchingBranches, currentCommit, configuration, excludedInheritBranches); if (matchingBranches.Name == FallbackConfigName && matchingBranches.Increment == IncrementStrategy.Inherit) { // We tried, and failed to inherit, just fall back to patch @@ -49,25 +51,23 @@ public BranchConfig GetBranchConfiguration(Branch targetBranch, IList ex } // TODO I think we need to take a fresh approach to this.. it's getting really complex with heaps of edge cases - private BranchConfig InheritBranchConfiguration(Branch targetBranch, BranchConfig branchConfiguration, IList excludedInheritBranches) + private BranchConfig InheritBranchConfiguration(IRepository repository, Branch targetBranch, BranchConfig branchConfiguration, Commit currentCommit, Config configuration, IList excludedInheritBranches) { - var repository = context.Repository; - var config = context.FullConfiguration; using (log.IndentLog("Attempting to inherit branch configuration from parent branch")) { var excludedBranches = new[] { targetBranch }; // Check if we are a merge commit. If so likely we are a pull request - var parentCount = context.CurrentCommit.Parents.Count(); + var parentCount = currentCommit.Parents.Count(); if (parentCount == 2) { - excludedBranches = CalculateWhenMultipleParents(repository, context.CurrentCommit, ref targetBranch, excludedBranches); + excludedBranches = CalculateWhenMultipleParents(repository, currentCommit, ref targetBranch, excludedBranches); } if (excludedInheritBranches == null) { excludedInheritBranches = repository.Branches.Where(b => { - var branchConfig = config.GetConfigForBranch(b.NameWithoutRemote()); + var branchConfig = configuration.GetConfigForBranch(b.NameWithoutRemote()); return branchConfig == null || branchConfig.Increment == IncrementStrategy.Inherit; }).ToList(); @@ -79,12 +79,12 @@ private BranchConfig InheritBranchConfiguration(Branch targetBranch, BranchConfi } var branchesToEvaluate = repository.Branches.ExcludingBranches(excludedInheritBranches).ToList(); - var branchPoint = context.RepositoryMetadataProvider - .FindCommitBranchWasBranchedFrom(targetBranch, excludedInheritBranches.ToArray()); + var branchPoint = repoMetadataProvider + .FindCommitBranchWasBranchedFrom(targetBranch, configuration, excludedInheritBranches.ToArray()); List possibleParents; if (branchPoint == BranchCommit.Empty) { - possibleParents = context.RepositoryMetadataProvider.GetBranchesContainingCommit(targetBranch.Tip, branchesToEvaluate, false) + possibleParents = repoMetadataProvider.GetBranchesContainingCommit(targetBranch.Tip, branchesToEvaluate, false) // It fails to inherit Increment branch configuration if more than 1 parent; // therefore no point to get more than 2 parents .Take(2) @@ -92,12 +92,10 @@ private BranchConfig InheritBranchConfiguration(Branch targetBranch, BranchConfi } else { - var branches = context.RepositoryMetadataProvider - .GetBranchesContainingCommit(branchPoint.Commit, branchesToEvaluate, false).ToList(); + var branches = repoMetadataProvider.GetBranchesContainingCommit(branchPoint.Commit, branchesToEvaluate, false).ToList(); if (branches.Count > 1) { - var currentTipBranches = context.RepositoryMetadataProvider - .GetBranchesContainingCommit(context.CurrentCommit, branchesToEvaluate, false).ToList(); + var currentTipBranches = repoMetadataProvider.GetBranchesContainingCommit(currentCommit, branchesToEvaluate, false).ToList(); possibleParents = branches.Except(currentTipBranches).ToList(); } else @@ -110,7 +108,7 @@ private BranchConfig InheritBranchConfiguration(Branch targetBranch, BranchConfi if (possibleParents.Count == 1) { - var branchConfig = GetBranchConfiguration(possibleParents[0], excludedInheritBranches); + var branchConfig = GetBranchConfiguration(repository, possibleParents[0], currentCommit, configuration, excludedInheritBranches); // If we have resolved a fallback config we should not return that we have got config if (branchConfig.Name != FallbackConfigName) { @@ -126,14 +124,12 @@ private BranchConfig InheritBranchConfiguration(Branch targetBranch, BranchConfi // If we fail to inherit it is probably because the branch has been merged and we can't do much. So we will fall back to develop's config // if develop exists and master if not - string errorMessage; - if (possibleParents.Count == 0) - errorMessage = "Failed to inherit Increment branch configuration, no branches found."; - else - errorMessage = "Failed to inherit Increment branch configuration, ended up with: " + string.Join(", ", possibleParents.Select(p => p.FriendlyName)); + var errorMessage = possibleParents.Count == 0 + ? "Failed to inherit Increment branch configuration, no branches found." + : "Failed to inherit Increment branch configuration, ended up with: " + string.Join(", ", possibleParents.Select(p => p.FriendlyName)); - var developBranchRegex = config.Branches[Config.DevelopBranchKey].Regex; - var masterBranchRegex = config.Branches[Config.MasterBranchKey].Regex; + var developBranchRegex = configuration.Branches[Config.DevelopBranchKey].Regex; + var masterBranchRegex = configuration.Branches[Config.MasterBranchKey].Regex; var chosenBranch = repository.Branches.FirstOrDefault(b => Regex.IsMatch(b.FriendlyName, developBranchRegex, RegexOptions.IgnoreCase) || Regex.IsMatch(b.FriendlyName, masterBranchRegex, RegexOptions.IgnoreCase)); @@ -152,7 +148,7 @@ private BranchConfig InheritBranchConfiguration(Branch targetBranch, BranchConfi { var developOrMasterConfig = ChooseMasterOrDevelopIncrementStrategyIfTheChosenBranchIsOneOfThem( - chosenBranch, branchConfiguration, config); + chosenBranch, branchConfiguration, configuration); if (developOrMasterConfig != null) { return developOrMasterConfig; @@ -165,7 +161,7 @@ private BranchConfig InheritBranchConfiguration(Branch targetBranch, BranchConfi }; } - var inheritingBranchConfig = GetBranchConfiguration(chosenBranch, excludedInheritBranches); + var inheritingBranchConfig = GetBranchConfiguration(repository, chosenBranch, currentCommit, configuration, excludedInheritBranches); var configIncrement = inheritingBranchConfig.Increment; if (inheritingBranchConfig.Name == FallbackConfigName && configIncrement == IncrementStrategy.Inherit) { diff --git a/src/GitVersionCore/Configuration/ConfigExtensions.cs b/src/GitVersionCore/Configuration/ConfigExtensions.cs index 1e65e84cf0..669acc6840 100644 --- a/src/GitVersionCore/Configuration/ConfigExtensions.cs +++ b/src/GitVersionCore/Configuration/ConfigExtensions.cs @@ -3,6 +3,7 @@ using System.Linq; using System.Text.RegularExpressions; using GitVersion.Extensions; +using GitVersion.Logging; using GitVersion.VersionCalculation; namespace GitVersion.Configuration @@ -171,6 +172,13 @@ This is because mainline mode treats your entire git repository as an event sour public static void ApplyOverridesTo(this Config config, Config overrideConfig) { + config.Branches.Clear(); + config.Ignore = overrideConfig.Ignore; + config.Branches = overrideConfig.Branches; + config.Increment = overrideConfig.Increment; + config.NextVersion = overrideConfig.NextVersion; + config.VersioningMode = overrideConfig.VersioningMode; + config.AssemblyFileVersioningFormat = overrideConfig.AssemblyFileVersioningFormat; config.TagPrefix = string.IsNullOrWhiteSpace(overrideConfig.TagPrefix) ? config.TagPrefix : overrideConfig.TagPrefix; } @@ -189,7 +197,7 @@ public static BranchConfig GetConfigForBranch(this Config config, string branchN } catch (InvalidOperationException) { - var matchingConfigs = String.Concat(matches.Select(m => $"{System.Environment.NewLine} - {m.Key}")); + var matchingConfigs = string.Concat(matches.Select(m => $"{System.Environment.NewLine} - {m.Key}")); var picked = matches .Select(kvp => kvp.Value) .First(); @@ -205,6 +213,100 @@ public static BranchConfig GetConfigForBranch(this Config config, string branchN public static bool IsReleaseBranch(this Config config, string branchName) => config.GetConfigForBranch(branchName)?.IsReleaseBranch ?? false; + public static EffectiveConfiguration CalculateEffectiveConfiguration(this Config configuration, BranchConfig currentBranchConfig) + { + var name = currentBranchConfig.Name; + if (!currentBranchConfig.VersioningMode.HasValue) + throw new Exception($"Configuration value for 'Versioning mode' for branch {name} has no value. (this should not happen, please report an issue)"); + 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)"); + if (!configuration.AssemblyFileVersioningScheme.HasValue) + throw new Exception("Configuration value for 'AssemblyFileVersioningScheme' has no value. (this should not happen, please report an issue)"); + if (!configuration.CommitMessageIncrementing.HasValue) + throw new Exception("Configuration value for 'CommitMessageIncrementing' has no value. (this should not happen, please report an issue)"); + if (!configuration.LegacySemVerPadding.HasValue) + throw new Exception("Configuration value for 'LegacySemVerPadding' has no value. (this should not happen, please report an issue)"); + if (!configuration.BuildMetaDataPadding.HasValue) + throw new Exception("Configuration value for 'BuildMetaDataPadding' has no value. (this should not happen, please report an issue)"); + if (!configuration.CommitsSinceVersionSourcePadding.HasValue) + throw new Exception("Configuration value for 'CommitsSinceVersionSourcePadding' has no value. (this should not happen, please report an issue)"); + + var versioningMode = currentBranchConfig.VersioningMode.Value; + var tag = currentBranchConfig.Tag; + var tagNumberPattern = currentBranchConfig.TagNumberPattern; + var incrementStrategy = currentBranchConfig.Increment.Value; + var preventIncrementForMergedBranchVersion = currentBranchConfig.PreventIncrementOfMergedBranchVersion.Value; + var trackMergeTarget = currentBranchConfig.TrackMergeTarget.Value; + var preReleaseWeight = currentBranchConfig.PreReleaseWeight ?? 0; + + var nextVersion = configuration.NextVersion; + var assemblyVersioningScheme = configuration.AssemblyVersioningScheme.Value; + var assemblyFileVersioningScheme = configuration.AssemblyFileVersioningScheme.Value; + var assemblyInformationalFormat = configuration.AssemblyInformationalFormat; + var assemblyVersioningFormat = configuration.AssemblyVersioningFormat; + var assemblyFileVersioningFormat = configuration.AssemblyFileVersioningFormat; + var gitTagPrefix = configuration.TagPrefix; + var majorMessage = configuration.MajorVersionBumpMessage; + var minorMessage = configuration.MinorVersionBumpMessage; + var patchMessage = configuration.PatchVersionBumpMessage; + var noBumpMessage = configuration.NoBumpMessage; + var commitDateFormat = configuration.CommitDateFormat; + + var commitMessageVersionBump = currentBranchConfig.CommitMessageIncrementing ?? configuration.CommitMessageIncrementing.Value; + + return new EffectiveConfiguration( + assemblyVersioningScheme, assemblyFileVersioningScheme, assemblyInformationalFormat, assemblyVersioningFormat, assemblyFileVersioningFormat, versioningMode, gitTagPrefix, + tag, nextVersion, incrementStrategy, + currentBranchConfig.Regex, + preventIncrementForMergedBranchVersion, + tagNumberPattern, configuration.ContinuousDeploymentFallbackTag, + trackMergeTarget, + majorMessage, minorMessage, patchMessage, noBumpMessage, + commitMessageVersionBump, + configuration.LegacySemVerPadding.Value, + configuration.BuildMetaDataPadding.Value, + configuration.CommitsSinceVersionSourcePadding.Value, + configuration.Ignore.ToFilters(), + currentBranchConfig.TracksReleaseBranches.Value, + currentBranchConfig.IsReleaseBranch.Value, + commitDateFormat, + preReleaseWeight); + } + + public static string GetBranchSpecificTag(this EffectiveConfiguration configuration, ILog log, string branchFriendlyName, string branchNameOverride) + { + var tagToUse = configuration.Tag; + if (tagToUse == "useBranchName") + { + tagToUse = "{BranchName}"; + } + if (tagToUse.Contains("{BranchName}")) + { + log.Info("Using branch name to calculate version tag"); + + var branchName = branchNameOverride ?? branchFriendlyName; + if (!string.IsNullOrWhiteSpace(configuration.BranchPrefixToTrim)) + { + branchName = branchName.RegexReplace(configuration.BranchPrefixToTrim, string.Empty, RegexOptions.IgnoreCase); + } + branchName = branchName.RegexReplace("[^a-zA-Z0-9-]", "-"); + + tagToUse = tagToUse.Replace("{BranchName}", branchName); + } + return tagToUse; + } + private static BranchConfig GetOrCreateBranchDefaults(this Config config, string branchKey) { if (!config.Branches.ContainsKey(branchKey)) diff --git a/src/GitVersionCore/Configuration/DefaultConfigFileLocator.cs b/src/GitVersionCore/Configuration/DefaultConfigFileLocator.cs index 42b43f4af8..6e22d586f4 100644 --- a/src/GitVersionCore/Configuration/DefaultConfigFileLocator.cs +++ b/src/GitVersionCore/Configuration/DefaultConfigFileLocator.cs @@ -1,5 +1,4 @@ using System.IO; -using GitVersion.Exceptions; namespace GitVersion.Configuration { diff --git a/src/GitVersionCore/Configuration/EffectiveConfiguration.cs b/src/GitVersionCore/Configuration/EffectiveConfiguration.cs index e44cf542f4..7feee213b5 100644 --- a/src/GitVersionCore/Configuration/EffectiveConfiguration.cs +++ b/src/GitVersionCore/Configuration/EffectiveConfiguration.cs @@ -1,7 +1,6 @@ using System.Collections.Generic; using GitVersion.Extensions; using GitVersion.VersionCalculation; -using GitVersion.VersionFilters; namespace GitVersion.Configuration { diff --git a/src/GitVersionCore/Configuration/GitVersionConfigurationException.cs b/src/GitVersionCore/Configuration/GitVersionConfigurationException.cs index a29d3743e7..d38c73a00b 100644 --- a/src/GitVersionCore/Configuration/GitVersionConfigurationException.cs +++ b/src/GitVersionCore/Configuration/GitVersionConfigurationException.cs @@ -1,5 +1,4 @@ using System; -using GitVersion.Exceptions; namespace GitVersion.Configuration { diff --git a/src/GitVersionCore/Configuration/IBranchConfigurationCalculator.cs b/src/GitVersionCore/Configuration/IBranchConfigurationCalculator.cs index b775b0fa6f..703064d4ab 100644 --- a/src/GitVersionCore/Configuration/IBranchConfigurationCalculator.cs +++ b/src/GitVersionCore/Configuration/IBranchConfigurationCalculator.cs @@ -8,6 +8,6 @@ public interface IBranchConfigurationCalculator /// /// Gets the for the current commit. /// - BranchConfig GetBranchConfiguration(Branch targetBranch, IList excludedInheritBranches = null); + BranchConfig GetBranchConfiguration(IRepository repository, Branch targetBranch, Commit currentCommit, Config configuration, IList excludedInheritBranches = null); } } diff --git a/src/GitVersionCore/Configuration/IgnoreConfig.cs b/src/GitVersionCore/Configuration/IgnoreConfig.cs index 4836131b8e..957eca30e4 100644 --- a/src/GitVersionCore/Configuration/IgnoreConfig.cs +++ b/src/GitVersionCore/Configuration/IgnoreConfig.cs @@ -1,7 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; -using GitVersion.VersionFilters; +using GitVersion.VersionCalculation; using YamlDotNet.Serialization; namespace GitVersion.Configuration diff --git a/src/GitVersionCore/Configuration/NamedConfigFileLocator.cs b/src/GitVersionCore/Configuration/NamedConfigFileLocator.cs index 02a2fae06a..7ec805199a 100644 --- a/src/GitVersionCore/Configuration/NamedConfigFileLocator.cs +++ b/src/GitVersionCore/Configuration/NamedConfigFileLocator.cs @@ -1,6 +1,5 @@ using System; using System.IO; -using GitVersion.Exceptions; using Microsoft.Extensions.Options; namespace GitVersion.Configuration diff --git a/src/GitVersionCore/Core/GitRepoMetadataProvider.cs b/src/GitVersionCore/Core/GitRepoMetadataProvider.cs index 328add250f..4451ea74eb 100644 --- a/src/GitVersionCore/Core/GitRepoMetadataProvider.cs +++ b/src/GitVersionCore/Core/GitRepoMetadataProvider.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Linq; using System.Text.RegularExpressions; +using GitVersion.Common; using GitVersion.Configuration; using GitVersion.Extensions; using GitVersion.Logging; @@ -9,27 +10,23 @@ namespace GitVersion { - public class GitRepoMetadataProvider + public class GitRepoMetadataProvider : IGitRepoMetadataProvider { - private readonly Dictionary> mergeBaseCommitsCache; - private readonly Dictionary, MergeBaseData> mergeBaseCache; - private readonly Dictionary> semanticVersionTagsOnBranchCache; - private IRepository Repository { get; } + private readonly Dictionary> mergeBaseCommitsCache = new Dictionary>(); + private readonly Dictionary, MergeBaseData> mergeBaseCache = new Dictionary, MergeBaseData>(); + private readonly Dictionary> semanticVersionTagsOnBranchCache = new Dictionary>(); private const string MissingTipFormat = "{0} has no tip. Please see http://example.com/docs for information on how to fix this."; + private readonly ILog log; - private readonly Config configuration; + private IRepository repository; - public GitRepoMetadataProvider(IRepository repository, ILog log, Config configuration) + public GitRepoMetadataProvider(ILog log, IRepository repository) { - mergeBaseCache = new Dictionary, MergeBaseData>(); - mergeBaseCommitsCache = new Dictionary>(); - semanticVersionTagsOnBranchCache = new Dictionary>(); - Repository = repository; - this.log = log; - this.configuration = configuration; + this.log = log ?? throw new ArgumentNullException(nameof(log)); + this.repository = repository ?? throw new ArgumentNullException(nameof(log)); } - public IEnumerable> GetValidVersionTags(IRepository repository, string tagPrefixRegex, DateTimeOffset? olderThan = null) + public IEnumerable> GetValidVersionTags(string tagPrefixRegex, DateTimeOffset? olderThan = null) { var tags = new List>(); @@ -57,7 +54,7 @@ public IEnumerable GetVersionTagsOnBranch(Branch branch, string using (log.IndentLog($"Getting version tags from branch '{branch.CanonicalName}'.")) { - var tags = GetValidVersionTags(Repository, tagPrefixRegex); + var tags = GetValidVersionTags(tagPrefixRegex); var versionTags = branch.Commits.SelectMany(c => tags.Where(t => c.Sha == t.Item1.Target.Sha).Select(t => t.Item2)).ToList(); @@ -67,8 +64,10 @@ public IEnumerable GetVersionTagsOnBranch(Branch branch, string } // TODO Should we cache this? - public IEnumerable GetBranchesContainingCommit(Commit commit, IList branches, bool onlyTrackedBranches) + public IEnumerable GetBranchesContainingCommit(Commit commit, IEnumerable branches, bool onlyTrackedBranches) { + static bool IncludeTrackedBranches(Branch branch, bool includeOnlyTracked) => includeOnlyTracked && branch.IsTracking || !includeOnlyTracked; + if (commit == null) { throw new ArgumentNullException(nameof(commit)); @@ -79,9 +78,10 @@ public IEnumerable GetBranchesContainingCommit(Commit commit, IList GetBranchesContainingCommit(Commit commit, IList (onlyTrackedBranches && b.IsTracking) || !onlyTrackedBranches)) + foreach (var branch in branchList.Where(b => IncludeTrackedBranches(b, onlyTrackedBranches))) { log.Info($"Searching for commits reachable from '{branch.FriendlyName}'."); - var commits = Repository.GetCommitsReacheableFrom(commit, branch); + var commits = repository.GetCommitsReacheableFrom(commit, branch); if (!commits.Any()) { @@ -139,7 +139,7 @@ public Commit FindMergeBase(Branch branch, Branch otherBranch) commitToFindCommonBase = otherBranch.Tip.Parents.First(); } - var findMergeBase = Repository.ObjectDatabase.FindMergeBase(commit, commitToFindCommonBase); + var findMergeBase = repository.ObjectDatabase.FindMergeBase(commit, commitToFindCommonBase); if (findMergeBase != null) { log.Info($"Found merge base of {findMergeBase.Sha}"); @@ -148,14 +148,14 @@ public Commit FindMergeBase(Branch branch, Branch otherBranch) do { // Now make sure that the merge base is not a forward merge - forwardMerge = Repository.GetForwardMerge(commitToFindCommonBase, findMergeBase); + forwardMerge = repository.GetForwardMerge(commitToFindCommonBase, findMergeBase); if (forwardMerge != null) { // TODO Fix the logging up in this section var second = forwardMerge.Parents.First(); log.Debug("Second " + second.Sha); - var mergeBase = Repository.ObjectDatabase.FindMergeBase(commit, second); + var mergeBase = repository.ObjectDatabase.FindMergeBase(commit, second); if (mergeBase == null) { log.Warning("Could not find mergbase for " + commit); @@ -177,7 +177,7 @@ public Commit FindMergeBase(Branch branch, Branch otherBranch) } // Store in cache. - mergeBaseCache.Add(key, new MergeBaseData(branch, otherBranch, Repository, findMergeBase)); + mergeBaseCache.Add(key, new MergeBaseData(findMergeBase)); log.Info($"Merge base of {branch.FriendlyName}' and '{otherBranch.FriendlyName} is {findMergeBase}"); return findMergeBase; @@ -188,7 +188,7 @@ public Commit FindMergeBase(Branch branch, Branch otherBranch) /// Find the commit where the given branch was branched from another branch. /// If there are multiple such commits and branches, tries to guess based on commit histories. /// - public BranchCommit FindCommitBranchWasBranchedFrom(Branch branch, params Branch[] excludedBranches) + public BranchCommit FindCommitBranchWasBranchedFrom(Branch branch, Config configuration, params Branch[] excludedBranches) { if (branch == null) { @@ -203,7 +203,7 @@ public BranchCommit FindCommitBranchWasBranchedFrom(Branch branch, params Branch return BranchCommit.Empty; } - var possibleBranches = GetMergeCommitsForBranch(branch, excludedBranches) + var possibleBranches = GetMergeCommitsForBranch(branch, configuration, excludedBranches) .Where(b => !branch.IsSameBranch(b.Branch)) .ToList(); @@ -220,7 +220,7 @@ public BranchCommit FindCommitBranchWasBranchedFrom(Branch branch, params Branch } } - private List GetMergeCommitsForBranch(Branch branch, Branch[] excludedBranches) + private IEnumerable GetMergeCommitsForBranch(Branch branch, Config configuration, IEnumerable excludedBranches) { if (mergeBaseCommitsCache.ContainsKey(branch)) { @@ -232,7 +232,7 @@ private List GetMergeCommitsForBranch(Branch branch, Branch[] excl var regexesToCheck = currentBranchConfig == null ? new[] { ".*" } // Match anything if we can't find a branch config : currentBranchConfig.SourceBranches.Select(sb => configuration.Branches[sb].Regex); - var branchMergeBases = Repository.Branches + var branchMergeBases = repository.Branches .ExcludingBranches(excludedBranches) .Where(b => { @@ -262,17 +262,10 @@ private List GetMergeCommitsForBranch(Branch branch, Branch[] excl private class MergeBaseData { - public Branch Branch { get; } - public Branch OtherBranch { get; } - public IRepository Repository { get; } - public Commit MergeBase { get; } - public MergeBaseData(Branch branch, Branch otherBranch, IRepository repository, Commit mergeBase) + public MergeBaseData(Commit mergeBase) { - Branch = branch; - OtherBranch = otherBranch; - Repository = repository; MergeBase = mergeBase; } } diff --git a/src/GitVersionCore/Core/GitRepository.cs b/src/GitVersionCore/Core/GitRepository.cs new file mode 100644 index 0000000000..0ef4f36068 --- /dev/null +++ b/src/GitVersionCore/Core/GitRepository.cs @@ -0,0 +1,168 @@ +using System; +using System.Collections.Generic; +using LibGit2Sharp; +using Microsoft.Extensions.Options; + +namespace GitVersion +{ + public class GitRepository : IRepository + { + private Lazy repositoryLazy; + private IRepository repositoryInstance => repositoryLazy.Value; + + public GitRepository(IOptions options, IGitPreparer preparer) + { + repositoryLazy = new Lazy(() => InitRepository(options, preparer)); + } + + private static IRepository InitRepository(IOptions options, IGitPreparer preparer) + { + preparer.Prepare(); //we need to prepare the repository before using it for version calculation + return new Repository(options.Value.DotGitDirectory); + } + + public void Dispose() + { + repositoryInstance.Dispose(); + } + + public void Checkout(Tree tree, IEnumerable paths, CheckoutOptions opts) + { + repositoryInstance.Checkout(tree, paths, opts); + } + + public void CheckoutPaths(string committishOrBranchSpec, IEnumerable paths, CheckoutOptions checkoutOptions) + { + repositoryInstance.CheckoutPaths(committishOrBranchSpec, paths, checkoutOptions); + } + + public GitObject Lookup(ObjectId id) + { + return repositoryInstance.Lookup(id); + } + + public GitObject Lookup(string objectish) + { + return repositoryInstance.Lookup(objectish); + } + + public GitObject Lookup(ObjectId id, ObjectType type) + { + return repositoryInstance.Lookup(id, type); + } + + public GitObject Lookup(string objectish, ObjectType type) + { + return repositoryInstance.Lookup(objectish, type); + } + + public Commit Commit(string message, Signature author, Signature committer, CommitOptions options) + { + return repositoryInstance.Commit(message, author, committer, options); + } + + public void Reset(ResetMode resetMode, Commit commit) + { + repositoryInstance.Reset(resetMode, commit); + } + + public void Reset(ResetMode resetMode, Commit commit, CheckoutOptions options) + { + repositoryInstance.Reset(resetMode, commit, options); + } + + public void RemoveUntrackedFiles() + { + repositoryInstance.RemoveUntrackedFiles(); + } + + public RevertResult Revert(Commit commit, Signature reverter, RevertOptions options) + { + return repositoryInstance.Revert(commit, reverter, options); + } + + public MergeResult Merge(Commit commit, Signature merger, MergeOptions options) + { + return repositoryInstance.Merge(commit, merger, options); + } + + public MergeResult Merge(Branch branch, Signature merger, MergeOptions options) + { + return repositoryInstance.Merge(branch, merger, options); + } + + public MergeResult Merge(string committish, Signature merger, MergeOptions options) + { + return repositoryInstance.Merge(committish, merger, options); + } + + public MergeResult MergeFetchedRefs(Signature merger, MergeOptions options) + { + return repositoryInstance.MergeFetchedRefs(merger, options); + } + + public CherryPickResult CherryPick(Commit commit, Signature committer, CherryPickOptions options) + { + return repositoryInstance.CherryPick(commit, committer, options); + } + + public BlameHunkCollection Blame(string path, BlameOptions options) + { + return repositoryInstance.Blame(path, options); + } + + public FileStatus RetrieveStatus(string filePath) + { + return repositoryInstance.RetrieveStatus(filePath); + } + + public RepositoryStatus RetrieveStatus(StatusOptions options) + { + return repositoryInstance.RetrieveStatus(options); + } + + public string Describe(Commit commit, DescribeOptions options) + { + return repositoryInstance.Describe(commit, options); + } + + public void RevParse(string revision, out Reference reference, out GitObject obj) + { + repositoryInstance.RevParse(revision, out reference, out obj); + } + + public Branch Head => repositoryInstance.Head; + + public LibGit2Sharp.Configuration Config => repositoryInstance.Config; + + public Index Index => repositoryInstance.Index; + + public ReferenceCollection Refs => repositoryInstance.Refs; + + public IQueryableCommitLog Commits => repositoryInstance.Commits; + + public BranchCollection Branches => repositoryInstance.Branches; + + public TagCollection Tags => repositoryInstance.Tags; + + public RepositoryInformation Info => repositoryInstance.Info; + + public Diff Diff => repositoryInstance.Diff; + + public ObjectDatabase ObjectDatabase => repositoryInstance.ObjectDatabase; + + public NoteCollection Notes => repositoryInstance.Notes; + + public SubmoduleCollection Submodules => repositoryInstance.Submodules; + + public WorktreeCollection Worktrees => repositoryInstance.Worktrees; + + public Rebase Rebase => repositoryInstance.Rebase; + + public Ignore Ignore => repositoryInstance.Ignore; + + public Network Network => repositoryInstance.Network; + + public StashCollection Stashes => repositoryInstance.Stashes; + } +} diff --git a/src/GitVersionCore/Core/GitVersionCalculator.cs b/src/GitVersionCore/Core/GitVersionCalculator.cs index cf65cacf1f..332e8b70e6 100644 --- a/src/GitVersionCore/Core/GitVersionCalculator.cs +++ b/src/GitVersionCore/Core/GitVersionCalculator.cs @@ -1,11 +1,8 @@ using System; -using GitVersion.Cache; -using GitVersion.Configuration; -using GitVersion.Extensions; using GitVersion.Logging; using GitVersion.OutputVariables; using GitVersion.VersionCalculation; -using LibGit2Sharp; +using GitVersion.VersionCalculation.Cache; using Microsoft.Extensions.Options; namespace GitVersion @@ -13,24 +10,23 @@ namespace GitVersion public class GitVersionCalculator : IGitVersionCalculator { private readonly ILog log; - private readonly IConfigProvider configProvider; private readonly IGitVersionCache gitVersionCache; private readonly INextVersionCalculator nextVersionCalculator; private readonly IVariableProvider variableProvider; private readonly IOptions options; private readonly IGitVersionCacheKeyFactory cacheKeyFactory; + private readonly GitVersionContext context; - public GitVersionCalculator(ILog log, IConfigProvider configProvider, - IGitVersionCache gitVersionCache, INextVersionCalculator nextVersionCalculator, IVariableProvider variableProvider, - IOptions options, IGitVersionCacheKeyFactory cacheKeyFactory) + public GitVersionCalculator(ILog log, IGitVersionCache gitVersionCache, INextVersionCalculator nextVersionCalculator, IVariableProvider variableProvider, + IOptions options, IGitVersionCacheKeyFactory cacheKeyFactory, IOptions versionContext) { this.log = log ?? throw new ArgumentNullException(nameof(log)); - this.configProvider = configProvider ?? throw new ArgumentNullException(nameof(configProvider)); this.gitVersionCache = gitVersionCache ?? throw new ArgumentNullException(nameof(gitVersionCache)); this.nextVersionCalculator = nextVersionCalculator ?? throw new ArgumentNullException(nameof(nextVersionCalculator)); this.variableProvider = variableProvider ?? throw new ArgumentNullException(nameof(variableProvider)); this.options = options ?? throw new ArgumentNullException(nameof(options)); this.cacheKeyFactory = cacheKeyFactory ?? throw new ArgumentNullException(nameof(cacheKeyFactory)); + context = versionContext.Value; } public VersionVariables CalculateVersionVariables() @@ -42,7 +38,7 @@ public VersionVariables CalculateVersionVariables() if (versionVariables != null) return versionVariables; - versionVariables = ExecuteInternal(arguments); + versionVariables = ExecuteInternal(); if (arguments.NoCache) return versionVariables; try @@ -57,16 +53,10 @@ public VersionVariables CalculateVersionVariables() return versionVariables; } - private VersionVariables ExecuteInternal(Arguments arguments) + private VersionVariables ExecuteInternal() { - var configuration = configProvider.Provide(overrideConfig: arguments.OverrideConfig); - - using var repo = new Repository(arguments.DotGitDirectory); - var targetBranch = repo.GetTargetBranch(arguments.TargetBranch); - var gitVersionContext = new GitVersionContext(repo, log, targetBranch, configuration, commitId: arguments.CommitId); - var semanticVersion = nextVersionCalculator.FindVersion(gitVersionContext); - - return variableProvider.GetVariablesFor(semanticVersion, gitVersionContext.Configuration, gitVersionContext.IsCurrentCommitTagged); + var semanticVersion = nextVersionCalculator.FindVersion(); + return variableProvider.GetVariablesFor(semanticVersion, context.Configuration, context.IsCurrentCommitTagged); } } } diff --git a/src/GitVersionCore/Core/GitVersionContextFactory.cs b/src/GitVersionCore/Core/GitVersionContextFactory.cs new file mode 100644 index 0000000000..3a495f2cb6 --- /dev/null +++ b/src/GitVersionCore/Core/GitVersionContextFactory.cs @@ -0,0 +1,55 @@ +using System; +using System.Linq; +using GitVersion.Common; +using GitVersion.Configuration; +using GitVersion.Extensions; +using GitVersion.Logging; +using LibGit2Sharp; +using Microsoft.Extensions.Options; + +namespace GitVersion +{ + public class GitVersionContextFactory : IGitVersionContextFactory + { + private readonly ILog log; + private readonly IConfigProvider configProvider; + private readonly IGitRepoMetadataProvider gitRepoMetadataProvider; + private readonly IBranchConfigurationCalculator branchConfigurationCalculator; + private readonly IOptions options; + + public GitVersionContextFactory(ILog log, IConfigProvider configProvider, IGitRepoMetadataProvider gitRepoMetadataProvider, IBranchConfigurationCalculator branchConfigurationCalculator, IOptions options) + { + this.log = log ?? throw new ArgumentNullException(nameof(log)); + this.configProvider = configProvider ?? throw new ArgumentNullException(nameof(configProvider)); + this.gitRepoMetadataProvider = gitRepoMetadataProvider ?? throw new ArgumentNullException(nameof(gitRepoMetadataProvider)); + this.branchConfigurationCalculator = branchConfigurationCalculator ?? throw new ArgumentNullException(nameof(branchConfigurationCalculator)); + this.options = options ?? throw new ArgumentNullException(nameof(options)); + } + + public GitVersionContext Create(Arguments arguments, IRepository repository) + { + var targetBranch = repository.GetTargetBranch(arguments.TargetBranch); + return Init(repository, targetBranch, arguments.CommitId, arguments.OnlyTrackedBranches); + } + + private GitVersionContext Init(IRepository repository, Branch currentBranch, string commitId = null, bool onlyTrackedBranches = false) + { + if (currentBranch == null) + throw new InvalidOperationException("Need a branch to operate on"); + + var configuration = configProvider.Provide(overrideConfig: options.Value.OverrideConfig); + + var currentCommit = repository.GetCurrentCommit(log, currentBranch, commitId); + + if (currentBranch.IsDetachedHead()) + { + var branchForCommit = gitRepoMetadataProvider.GetBranchesContainingCommit(currentCommit, repository.Branches.ToList(), onlyTrackedBranches).OnlyOrDefault(); + currentBranch = branchForCommit ?? currentBranch; + } + + var currentBranchConfig = branchConfigurationCalculator.GetBranchConfiguration(repository, currentBranch, currentCommit, configuration); + + return new GitVersionContext(repository, currentBranch, currentCommit, currentBranchConfig, configuration); + } + } +} diff --git a/src/GitVersionCore/Extensions/ArgumentExtensions.cs b/src/GitVersionCore/Extensions/ArgumentExtensions.cs index baced3517c..751a2de3fa 100644 --- a/src/GitVersionCore/Extensions/ArgumentExtensions.cs +++ b/src/GitVersionCore/Extensions/ArgumentExtensions.cs @@ -5,7 +5,7 @@ namespace GitVersion.Extensions { public static class ArgumentExtensions { - public static string GetWorkingDirectory(this Arguments arguments) => arguments.TargetPath?.TrimEnd('/', '\\') ?? string.Empty; + public static string GetWorkingDirectory(this Arguments arguments) => arguments.TargetPath?.TrimEnd('/', '\\') ?? "."; public static bool IsDynamicGitRepository(this Arguments arguments) => !string.IsNullOrWhiteSpace(arguments.DynamicGitRepositoryPath); diff --git a/src/GitVersionCore/Extensions/LibGitExtensions.cs b/src/GitVersionCore/Extensions/LibGitExtensions.cs index c8afc85c5f..302b3f3e8f 100644 --- a/src/GitVersionCore/Extensions/LibGitExtensions.cs +++ b/src/GitVersionCore/Extensions/LibGitExtensions.cs @@ -3,7 +3,9 @@ using System.IO; using System.Linq; using System.Text; +using GitVersion.Configuration; using GitVersion.Helpers; +using GitVersion.Logging; using GitVersion.VersionCalculation; using LibGit2Sharp; @@ -116,8 +118,7 @@ public static List GetCommitsReacheableFromHead(this IRepository reposit SortBy = CommitSortStrategies.Topological | CommitSortStrategies.Reverse }; - var commitCache = repository.Commits.QueryBy(filter).ToList(); - return commitCache; + return repository.Commits.QueryBy(filter).ToList(); } public static Commit GetForwardMerge(this IRepository repository, Commit commitToFindCommonBase, Commit findMergeBase) @@ -277,7 +278,7 @@ public static Branch GetTargetBranch(this IRepository repository, string targetB if (!desiredBranch.CanonicalName.IsBranch(targetBranch)) { // In the case where HEAD is not the desired branch, try to find the branch with matching name - desiredBranch = repository?.Branches? + desiredBranch = repository.Branches? .SingleOrDefault(b => b.CanonicalName == targetBranch || b.FriendlyName == targetBranch || @@ -290,5 +291,47 @@ public static Branch GetTargetBranch(this IRepository repository, string targetB return desiredBranch; } + + public static Commit GetCurrentCommit(this IRepository repository, ILog log, Branch currentBranch, string commitId) + { + Commit currentCommit = null; + if (!string.IsNullOrWhiteSpace(commitId)) + { + log.Info($"Searching for specific commit '{commitId}'"); + + var commit = repository.Commits.FirstOrDefault(c => string.Equals(c.Sha, commitId, StringComparison.OrdinalIgnoreCase)); + if (commit != null) + { + currentCommit = commit; + } + else + { + log.Warning($"Commit '{commitId}' specified but not found"); + } + } + + if (currentCommit == null) + { + log.Info("Using latest commit on specified branch"); + currentCommit = currentBranch.Tip; + } + + return currentCommit; + + } + + public static SemanticVersion GetCurrentCommitTaggedVersion(this IRepository repository, GitObject commit, EffectiveConfiguration config) + { + return repository.Tags + .SelectMany(t => + { + if (t.PeeledTarget() == commit && SemanticVersion.TryParse(t.FriendlyName, config.GitTagPrefix, out var version)) + return new[] { + version + }; + return new SemanticVersion[0]; + }) + .Max(); + } } } diff --git a/src/GitVersionCore/GitVersionCoreModule.cs b/src/GitVersionCore/GitVersionCoreModule.cs index 2c1f3a5513..5f7b19884d 100644 --- a/src/GitVersionCore/GitVersionCoreModule.cs +++ b/src/GitVersionCore/GitVersionCoreModule.cs @@ -1,12 +1,14 @@ using GitVersion.BuildServers; -using GitVersion.Cache; +using GitVersion.Common; using GitVersion.Configuration; using GitVersion.Configuration.Init; using GitVersion.Extensions; using GitVersion.Logging; -using GitVersion.OutputVariables; using GitVersion.VersionCalculation; +using GitVersion.VersionCalculation.Cache; +using LibGit2Sharp; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Options; namespace GitVersion { @@ -14,28 +16,41 @@ public class GitVersionCoreModule : IGitVersionModule { public void RegisterTypes(IServiceCollection services) { + services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); - services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); - services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); + services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); - services.AddSingleton(); + services.AddSingleton(); services.AddSingleton(sp => sp.GetService().Create()); + services.AddSingleton(sp => + { + var options = sp.GetService>(); + var repository = sp.GetService(); + var contextFactory = sp.GetService(); + return Options.Create(contextFactory.Create(options.Value, repository)); + }); + services.AddModule(new BuildServerModule()); services.AddModule(new GitVersionInitModule()); services.AddModule(new VersionStrategyModule()); diff --git a/src/GitVersionCore/Helpers/GitRepositoryHelper.cs b/src/GitVersionCore/Helpers/GitRepositoryHelper.cs index 816fd2f50c..c61d8808da 100644 --- a/src/GitVersionCore/Helpers/GitRepositoryHelper.cs +++ b/src/GitVersionCore/Helpers/GitRepositoryHelper.cs @@ -1,6 +1,5 @@ using System.Collections.Generic; using System.Linq; -using GitVersion.Exceptions; using GitVersion.Extensions; using GitVersion.Logging; using LibGit2Sharp; diff --git a/src/GitVersionCore/Model/Arguments.cs b/src/GitVersionCore/Model/Arguments.cs index 8633941eb3..731ad7b1ae 100644 --- a/src/GitVersionCore/Model/Arguments.cs +++ b/src/GitVersionCore/Model/Arguments.cs @@ -59,6 +59,7 @@ public Arguments() public bool NoFetch; public bool NoCache; public bool NoNormalize; + public bool OnlyTrackedBranches = false; public ISet Output = new HashSet(); public Verbosity Verbosity = Verbosity.Normal; diff --git a/src/GitVersionCore/Exceptions/BugException.cs b/src/GitVersionCore/Model/Exceptions/BugException.cs similarity index 82% rename from src/GitVersionCore/Exceptions/BugException.cs rename to src/GitVersionCore/Model/Exceptions/BugException.cs index 81116864cd..3cf97b53a9 100644 --- a/src/GitVersionCore/Exceptions/BugException.cs +++ b/src/GitVersionCore/Model/Exceptions/BugException.cs @@ -1,6 +1,6 @@ using System; -namespace GitVersion.Exceptions +namespace GitVersion { public class BugException : Exception { diff --git a/src/GitVersionCore/Exceptions/GitToolsException.cs b/src/GitVersionCore/Model/Exceptions/GitToolsException.cs similarity index 92% rename from src/GitVersionCore/Exceptions/GitToolsException.cs rename to src/GitVersionCore/Model/Exceptions/GitToolsException.cs index 792f87f22f..d652d0931f 100644 --- a/src/GitVersionCore/Exceptions/GitToolsException.cs +++ b/src/GitVersionCore/Model/Exceptions/GitToolsException.cs @@ -1,6 +1,6 @@ using System; -namespace GitVersion.Exceptions +namespace GitVersion { [Serializable] public class GitToolsException : Exception diff --git a/src/GitVersionCore/Exceptions/GitVersionException.cs b/src/GitVersionCore/Model/Exceptions/GitVersionException.cs similarity index 91% rename from src/GitVersionCore/Exceptions/GitVersionException.cs rename to src/GitVersionCore/Model/Exceptions/GitVersionException.cs index 78292fe7de..286ff05c6c 100644 --- a/src/GitVersionCore/Exceptions/GitVersionException.cs +++ b/src/GitVersionCore/Model/Exceptions/GitVersionException.cs @@ -1,6 +1,6 @@ using System; -namespace GitVersion.Exceptions +namespace GitVersion { [Serializable] public class GitVersionException : GitToolsException diff --git a/src/GitVersionCore/Exceptions/WarningException.cs b/src/GitVersionCore/Model/Exceptions/WarningException.cs similarity index 85% rename from src/GitVersionCore/Exceptions/WarningException.cs rename to src/GitVersionCore/Model/Exceptions/WarningException.cs index eeda73b55f..49fb4cebc3 100644 --- a/src/GitVersionCore/Exceptions/WarningException.cs +++ b/src/GitVersionCore/Model/Exceptions/WarningException.cs @@ -1,6 +1,6 @@ using System; -namespace GitVersion.Exceptions +namespace GitVersion { [Serializable] public class WarningException : Exception diff --git a/src/GitVersionCore/Cache/GitVersionCacheKey.cs b/src/GitVersionCore/Model/GitVersionCacheKey.cs similarity index 100% rename from src/GitVersionCore/Cache/GitVersionCacheKey.cs rename to src/GitVersionCore/Model/GitVersionCacheKey.cs diff --git a/src/GitVersionCore/Model/GitVersionContext.cs b/src/GitVersionCore/Model/GitVersionContext.cs index cd27276019..4f9cefbc8f 100644 --- a/src/GitVersionCore/Model/GitVersionContext.cs +++ b/src/GitVersionCore/Model/GitVersionContext.cs @@ -1,8 +1,5 @@ -using System; -using System.Linq; using GitVersion.Configuration; using GitVersion.Extensions; -using GitVersion.Logging; using LibGit2Sharp; namespace GitVersion @@ -12,146 +9,30 @@ namespace GitVersion /// public class GitVersionContext { - private readonly ILog log; - - public GitVersionContext(IRepository repository, ILog log, Branch currentBranch, Config configuration, bool onlyTrackedBranches = false, string commitId = null) - { - this.log = log; - Repository = repository; - RepositoryMetadataProvider = new GitRepoMetadataProvider(repository, log, configuration); - FullConfiguration = configuration; - OnlyTrackedBranches = onlyTrackedBranches; - - if (currentBranch == null) - throw new InvalidOperationException("Need a branch to operate on"); - - if (!string.IsNullOrWhiteSpace(commitId)) - { - log.Info($"Searching for specific commit '{commitId}'"); - - var commit = repository.Commits.FirstOrDefault(c => string.Equals(c.Sha, commitId, StringComparison.OrdinalIgnoreCase)); - if (commit != null) - { - CurrentCommit = commit; - } - else - { - log.Warning($"Commit '{commitId}' specified but not found"); - } - } - - if (CurrentCommit == null) - { - log.Info("Using latest commit on specified branch"); - CurrentCommit = currentBranch.Tip; - } - - if (currentBranch.IsDetachedHead()) - { - CurrentBranch = RepositoryMetadataProvider.GetBranchesContainingCommit(CurrentCommit, repository.Branches.ToList(), OnlyTrackedBranches).OnlyOrDefault() ?? currentBranch; - } - else - { - CurrentBranch = currentBranch; - } - - CalculateEffectiveConfiguration(); - - CurrentCommitTaggedVersion = repository.Tags - .SelectMany(t => - { - if (t.PeeledTarget() == CurrentCommit && SemanticVersion.TryParse(t.FriendlyName, Configuration.GitTagPrefix, out var version)) - return new[] { version }; - return new SemanticVersion[0]; - }) - .Max(); - IsCurrentCommitTagged = CurrentCommitTaggedVersion != null; - } - /// /// Contains the raw configuration, use Configuration for specific config based on the current GitVersion context. /// public Config FullConfiguration { get; } + public SemanticVersion CurrentCommitTaggedVersion { get; } - public bool OnlyTrackedBranches { get; } - public EffectiveConfiguration Configuration { get; private set; } - public IRepository Repository { get; } + public EffectiveConfiguration Configuration { get; } public Branch CurrentBranch { get; } public Commit CurrentCommit { get; } - public bool IsCurrentCommitTagged { get; } - public GitRepoMetadataProvider RepositoryMetadataProvider { get; } + public bool IsCurrentCommitTagged => CurrentCommitTaggedVersion != null; - private void CalculateEffectiveConfiguration() + public GitVersionContext() { - IBranchConfigurationCalculator calculator = new BranchConfigurationCalculator(log, this); - var currentBranchConfig = calculator.GetBranchConfiguration(CurrentBranch); - - if (!currentBranchConfig.VersioningMode.HasValue) - throw new Exception($"Configuration value for 'Versioning mode' for branch {currentBranchConfig.Name} has no value. (this should not happen, please report an issue)"); - if (!currentBranchConfig.Increment.HasValue) - throw new Exception($"Configuration value for 'Increment' for branch {currentBranchConfig.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 {currentBranchConfig.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 {currentBranchConfig.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 {currentBranchConfig.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 {currentBranchConfig.Name} has no value. (this should not happen, please report an issue)"); - - if (!FullConfiguration.AssemblyVersioningScheme.HasValue) - throw new Exception("Configuration value for 'AssemblyVersioningScheme' has no value. (this should not happen, please report an issue)"); - if (!FullConfiguration.AssemblyFileVersioningScheme.HasValue) - throw new Exception("Configuration value for 'AssemblyFileVersioningScheme' has no value. (this should not happen, please report an issue)"); - if (!FullConfiguration.CommitMessageIncrementing.HasValue) - throw new Exception("Configuration value for 'CommitMessageIncrementing' has no value. (this should not happen, please report an issue)"); - if (!FullConfiguration.LegacySemVerPadding.HasValue) - throw new Exception("Configuration value for 'LegacySemVerPadding' has no value. (this should not happen, please report an issue)"); - if (!FullConfiguration.BuildMetaDataPadding.HasValue) - throw new Exception("Configuration value for 'BuildMetaDataPadding' has no value. (this should not happen, please report an issue)"); - if (!FullConfiguration.CommitsSinceVersionSourcePadding.HasValue) - throw new Exception("Configuration value for 'CommitsSinceVersionSourcePadding' has no value. (this should not happen, please report an issue)"); - - var versioningMode = currentBranchConfig.VersioningMode.Value; - var tag = currentBranchConfig.Tag; - var tagNumberPattern = currentBranchConfig.TagNumberPattern; - var incrementStrategy = currentBranchConfig.Increment.Value; - var preventIncrementForMergedBranchVersion = currentBranchConfig.PreventIncrementOfMergedBranchVersion.Value; - var trackMergeTarget = currentBranchConfig.TrackMergeTarget.Value; - var preReleaseWeight = currentBranchConfig.PreReleaseWeight ?? 0; + } - var nextVersion = FullConfiguration.NextVersion; - var assemblyVersioningScheme = FullConfiguration.AssemblyVersioningScheme.Value; - var assemblyFileVersioningScheme = FullConfiguration.AssemblyFileVersioningScheme.Value; - var assemblyInformationalFormat = FullConfiguration.AssemblyInformationalFormat; - var assemblyVersioningFormat = FullConfiguration.AssemblyVersioningFormat; - var assemblyFileVersioningFormat = FullConfiguration.AssemblyFileVersioningFormat; - var gitTagPrefix = FullConfiguration.TagPrefix; - var majorMessage = FullConfiguration.MajorVersionBumpMessage; - var minorMessage = FullConfiguration.MinorVersionBumpMessage; - var patchMessage = FullConfiguration.PatchVersionBumpMessage; - var noBumpMessage = FullConfiguration.NoBumpMessage; - var commitDateFormat = FullConfiguration.CommitDateFormat; + public GitVersionContext(IRepository repository, Branch currentBranch, Commit currentCommit, BranchConfig currentBranchConfig, Config configuration) + { + CurrentCommit = currentCommit; + CurrentBranch = currentBranch; - var commitMessageVersionBump = currentBranchConfig.CommitMessageIncrementing ?? FullConfiguration.CommitMessageIncrementing.Value; + FullConfiguration = configuration; + Configuration = configuration.CalculateEffectiveConfiguration(currentBranchConfig); - Configuration = new EffectiveConfiguration( - assemblyVersioningScheme, assemblyFileVersioningScheme, assemblyInformationalFormat, assemblyVersioningFormat, assemblyFileVersioningFormat, versioningMode, gitTagPrefix, - tag, nextVersion, incrementStrategy, - currentBranchConfig.Regex, - preventIncrementForMergedBranchVersion, - tagNumberPattern, FullConfiguration.ContinuousDeploymentFallbackTag, - trackMergeTarget, - majorMessage, minorMessage, patchMessage, noBumpMessage, - commitMessageVersionBump, - FullConfiguration.LegacySemVerPadding.Value, - FullConfiguration.BuildMetaDataPadding.Value, - FullConfiguration.CommitsSinceVersionSourcePadding.Value, - FullConfiguration.Ignore.ToFilters(), - currentBranchConfig.TracksReleaseBranches.Value, - currentBranchConfig.IsReleaseBranch.Value, - commitDateFormat, - preReleaseWeight); + CurrentCommitTaggedVersion = repository.GetCurrentCommitTaggedVersion(currentCommit, Configuration); } } } diff --git a/src/GitVersionCore/Model/VersionVariables.cs b/src/GitVersionCore/Model/VersionVariables.cs index c2e991ddaa..07580c73e4 100644 --- a/src/GitVersionCore/Model/VersionVariables.cs +++ b/src/GitVersionCore/Model/VersionVariables.cs @@ -76,36 +76,36 @@ public VersionVariables(string major, CommitsSinceVersionSourcePadded = commitsSinceVersionSourcePadded; } - public string Major { get; private set; } - public string Minor { get; private set; } - public string Patch { get; private set; } - public string PreReleaseTag { get; private set; } - public string PreReleaseTagWithDash { get; private set; } - public string PreReleaseLabel { get; private set; } - public string PreReleaseNumber { get; private set; } - public string WeightedPreReleaseNumber { get; private set; } - public string BuildMetaData { get; private set; } - public string BuildMetaDataPadded { get; private set; } - public string FullBuildMetaData { get; private set; } - public string MajorMinorPatch { get; private set; } - public string SemVer { get; private set; } - public string LegacySemVer { get; private set; } - public string LegacySemVerPadded { get; private set; } - public string AssemblySemVer { get; private set; } - public string AssemblySemFileVer { get; private set; } - public string FullSemVer { get; private set; } - public string InformationalVersion { get; private set; } - public string BranchName { get; private set; } - public string EscapedBranchName { get; private set; } - public string Sha { get; private set; } - public string ShortSha { get; private set; } - public string NuGetVersionV2 { get; private set; } - public string NuGetVersion { get; private set; } - public string NuGetPreReleaseTagV2 { get; private set; } - public string NuGetPreReleaseTag { get; private set; } - public string VersionSourceSha { get; private set; } - public string CommitsSinceVersionSource { get; private set; } - public string CommitsSinceVersionSourcePadded { get; private set; } + public string Major { get; } + public string Minor { get; } + public string Patch { get; } + public string PreReleaseTag { get; } + public string PreReleaseTagWithDash { get; } + public string PreReleaseLabel { get; } + public string PreReleaseNumber { get; } + public string WeightedPreReleaseNumber { get; } + public string BuildMetaData { get; } + public string BuildMetaDataPadded { get; } + public string FullBuildMetaData { get; } + public string MajorMinorPatch { get; } + public string SemVer { get; } + public string LegacySemVer { get; } + public string LegacySemVerPadded { get; } + public string AssemblySemVer { get; } + public string AssemblySemFileVer { get; } + public string FullSemVer { get; } + public string InformationalVersion { get; } + public string BranchName { get; } + public string EscapedBranchName { get; } + public string Sha { get; } + public string ShortSha { get; } + public string NuGetVersionV2 { get; } + public string NuGetVersion { get; } + public string NuGetPreReleaseTagV2 { get; } + public string NuGetPreReleaseTag { get; } + public string VersionSourceSha { get; } + public string CommitsSinceVersionSource { get; } + public string CommitsSinceVersionSourcePadded { get; } [ReflectionIgnore] public static IEnumerable AvailableVariables @@ -173,7 +173,7 @@ public bool TryGetValue(string variable, out string variableValue) return false; } - public bool ContainsKey(string variable) + private static bool ContainsKey(string variable) { return typeof(VersionVariables).GetProperty(variable) != null; } diff --git a/src/GitVersionCore/VersionCalculation/BaseVersionCalculator.cs b/src/GitVersionCore/VersionCalculation/BaseVersionCalculator.cs index c9514760a2..6dd6b73f0d 100644 --- a/src/GitVersionCore/VersionCalculation/BaseVersionCalculator.cs +++ b/src/GitVersionCore/VersionCalculation/BaseVersionCalculator.cs @@ -3,26 +3,32 @@ using System.Linq; using System.Text.RegularExpressions; using GitVersion.Logging; +using LibGit2Sharp; +using Microsoft.Extensions.Options; namespace GitVersion.VersionCalculation { public class BaseVersionCalculator : IBaseVersionCalculator { private readonly ILog log; + private readonly IRepository repository; + private readonly GitVersionContext context; private readonly IVersionStrategy[] strategies; - public BaseVersionCalculator(ILog log, IEnumerable strategies) + public BaseVersionCalculator(ILog log, IRepository repository, IOptions versionContext, IEnumerable strategies) { this.log = log ?? throw new ArgumentNullException(nameof(log)); + this.repository = repository ?? throw new ArgumentNullException(nameof(repository)); this.strategies = strategies?.ToArray() ?? Array.Empty(); + context = versionContext.Value; } - public BaseVersion GetBaseVersion(GitVersionContext context) + public BaseVersion GetBaseVersion() { using (log.IndentLog("Calculating base versions")) { var baseVersions = strategies - .SelectMany(s => s.GetVersions(context)) + .SelectMany(s => s.GetVersions()) .Where(v => { if (v == null) return false; @@ -42,13 +48,12 @@ public BaseVersion GetBaseVersion(GitVersionContext context) }) .Select(v => new Versions { - IncrementedVersion = MaybeIncrement(context, v), + IncrementedVersion = v.MaybeIncrement(repository, context), Version = v }) .ToList(); - FixTheBaseVersionSourceOfMergeMessageStrategyIfReleaseBranchWasMergedAndDeleted - (context, baseVersions); + FixTheBaseVersionSourceOfMergeMessageStrategyIfReleaseBranchWasMergedAndDeleted(repository, context, baseVersions); var maxVersion = baseVersions.Aggregate((v1, v2) => v1.IncrementedVersion > v2.IncrementedVersion ? v1 : v2); var matchingVersionsOnceIncremented = baseVersions .Where(b => b.Version.BaseVersionSource != null && b.IncrementedVersion == maxVersion.IncrementedVersion) @@ -75,7 +80,7 @@ public BaseVersion GetBaseVersion(GitVersionContext context) throw new Exception("Base version should not be null"); var calculatedBase = new BaseVersion( - context, maxVersion.Version.Source, maxVersion.Version.ShouldIncrement, maxVersion.Version.SemanticVersion, + maxVersion.Version.Source, maxVersion.Version.ShouldIncrement, maxVersion.Version.SemanticVersion, baseVersionWithOldestSource.BaseVersionSource, maxVersion.Version.BranchNameOverride); log.Info($"Base version used: {calculatedBase}"); @@ -84,21 +89,9 @@ public BaseVersion GetBaseVersion(GitVersionContext context) } } - public static SemanticVersion MaybeIncrement(GitVersionContext context, BaseVersion version) + private static void FixTheBaseVersionSourceOfMergeMessageStrategyIfReleaseBranchWasMergedAndDeleted(IRepository repository, GitVersionContext context, IEnumerable baseVersions) { - var increment = IncrementStrategyFinder.DetermineIncrementedField(context, version); - if (increment != null) - { - return version.SemanticVersion.IncrementVersion(increment.Value); - } - - return version.SemanticVersion; - } - - private void FixTheBaseVersionSourceOfMergeMessageStrategyIfReleaseBranchWasMergedAndDeleted( - GitVersionContext context, List baseVersions) - { - if (!ReleaseBranchExistsInRepo(context)) + if (!ReleaseBranchExistsInRepo(repository, context)) { foreach (var baseVersion in baseVersions) { @@ -109,23 +102,22 @@ private void FixTheBaseVersionSourceOfMergeMessageStrategyIfReleaseBranchWasMerg { var parents = baseVersion.Version.BaseVersionSource.Parents.ToList(); baseVersion.Version = new BaseVersion( - context, baseVersion.Version.Source, baseVersion.Version.ShouldIncrement, baseVersion.Version.SemanticVersion, - context.Repository.ObjectDatabase.FindMergeBase(parents[0], parents[1]), + repository.ObjectDatabase.FindMergeBase(parents[0], parents[1]), baseVersion.Version.BranchNameOverride); } } } } - private bool ReleaseBranchExistsInRepo(GitVersionContext context) + private static bool ReleaseBranchExistsInRepo(IRepository repository, GitVersionContext context) { var releaseBranchConfig = context.FullConfiguration.Branches .Where(b => b.Value.IsReleaseBranch == true) .ToList(); - var releaseBranches = context.Repository.Branches + var releaseBranches = repository.Branches .Where(b => releaseBranchConfig.Any(c => Regex.IsMatch(b.FriendlyName, c.Value.Regex))); return releaseBranches.Any(); } diff --git a/src/GitVersionCore/VersionCalculation/BaseVersionCalculators/BaseVersion.cs b/src/GitVersionCore/VersionCalculation/BaseVersionCalculators/BaseVersion.cs index 686d8c69c8..8984096089 100644 --- a/src/GitVersionCore/VersionCalculation/BaseVersionCalculators/BaseVersion.cs +++ b/src/GitVersionCore/VersionCalculation/BaseVersionCalculators/BaseVersion.cs @@ -4,31 +4,35 @@ namespace GitVersion.VersionCalculation { public class BaseVersion { - private readonly GitVersionContext context; - - public BaseVersion(GitVersionContext context, string source, bool shouldIncrement, SemanticVersion semanticVersion, Commit baseVersionSource, string branchNameOverride) + public BaseVersion(string source, bool shouldIncrement, SemanticVersion semanticVersion, Commit baseVersionSource, string branchNameOverride) { Source = source; ShouldIncrement = shouldIncrement; SemanticVersion = semanticVersion; BaseVersionSource = baseVersionSource; BranchNameOverride = branchNameOverride; - this.context = context; } - public string Source { get; private set; } + public string Source { get; } + + public bool ShouldIncrement { get; } - public bool ShouldIncrement { get; private set; } + public SemanticVersion SemanticVersion { get; } - public SemanticVersion SemanticVersion { get; private set; } + public Commit BaseVersionSource { get; } - public Commit BaseVersionSource { get; private set; } + public string BranchNameOverride { get; } - public string BranchNameOverride { get; private set; } + public SemanticVersion MaybeIncrement(IRepository repository, GitVersionContext context) + { + var increment = IncrementStrategyFinder.DetermineIncrementedField(repository, context, this); + return increment != null ? SemanticVersion.IncrementVersion(increment.Value) : SemanticVersion; + } public override string ToString() { - return $"{Source}: {SemanticVersion.ToString("f")} with commit count source {(BaseVersionSource == null ? "External Source" : BaseVersionSource.Sha)} (Incremented: {(ShouldIncrement ? BaseVersionCalculator.MaybeIncrement(context, this).ToString("t") : "None")})"; + var externalSource = BaseVersionSource == null ? "External Source" : BaseVersionSource.Sha; + return $"{Source}: {SemanticVersion.ToString("f")} with commit count source {externalSource}"; } } } diff --git a/src/GitVersionCore/VersionCalculation/BaseVersionCalculators/ConfigNextVersionVersionStrategy.cs b/src/GitVersionCore/VersionCalculation/BaseVersionCalculators/ConfigNextVersionVersionStrategy.cs index a0eefbae5f..84293e32e7 100644 --- a/src/GitVersionCore/VersionCalculation/BaseVersionCalculators/ConfigNextVersionVersionStrategy.cs +++ b/src/GitVersionCore/VersionCalculation/BaseVersionCalculators/ConfigNextVersionVersionStrategy.cs @@ -1,4 +1,6 @@ using System.Collections.Generic; +using LibGit2Sharp; +using Microsoft.Extensions.Options; namespace GitVersion.VersionCalculation { @@ -7,14 +9,18 @@ namespace GitVersion.VersionCalculation /// BaseVersionSource is null. /// Does not increment. /// - public class ConfigNextVersionVersionStrategy : IVersionStrategy + public class ConfigNextVersionVersionStrategy : VersionStrategyBase { - public virtual IEnumerable GetVersions(GitVersionContext context) + public ConfigNextVersionVersionStrategy(IRepository repository, IOptions versionContext) : base(repository, versionContext) { - if (string.IsNullOrEmpty(context.Configuration.NextVersion) || context.IsCurrentCommitTagged) + } + + public override IEnumerable GetVersions() + { + if (string.IsNullOrEmpty(Context.Configuration.NextVersion) || Context.IsCurrentCommitTagged) yield break; - var semanticVersion = SemanticVersion.Parse(context.Configuration.NextVersion, context.Configuration.GitTagPrefix); - yield return new BaseVersion(context, "NextVersion in GitVersion configuration file", false, semanticVersion, null, null); + var semanticVersion = SemanticVersion.Parse(Context.Configuration.NextVersion, Context.Configuration.GitTagPrefix); + yield return new BaseVersion("NextVersion in GitVersion configuration file", false, semanticVersion, null, null); } } } diff --git a/src/GitVersionCore/VersionCalculation/BaseVersionCalculators/FallbackVersionStrategy.cs b/src/GitVersionCore/VersionCalculation/BaseVersionCalculators/FallbackVersionStrategy.cs index 1e6cabd73c..80ae2fb558 100644 --- a/src/GitVersionCore/VersionCalculation/BaseVersionCalculators/FallbackVersionStrategy.cs +++ b/src/GitVersionCore/VersionCalculation/BaseVersionCalculators/FallbackVersionStrategy.cs @@ -1,7 +1,7 @@ using System.Collections.Generic; -using GitVersion.Exceptions; using GitVersion.Extensions; using LibGit2Sharp; +using Microsoft.Extensions.Options; namespace GitVersion.VersionCalculation { @@ -10,24 +10,26 @@ namespace GitVersion.VersionCalculation /// BaseVersionSource is the "root" commit reachable from the current commit. /// Does not increment. /// - public class FallbackVersionStrategy : IVersionStrategy + public class FallbackVersionStrategy : VersionStrategyBase { - public virtual IEnumerable GetVersions(GitVersionContext context) + public FallbackVersionStrategy(IRepository repository, IOptions versionContext) : base(repository, versionContext) + { + } + public override IEnumerable GetVersions() { Commit baseVersionSource; - var currentBranchTip = context.CurrentBranch.Tip; + var currentBranchTip = Context.CurrentBranch.Tip; try { - var contextRepository = context.Repository; - baseVersionSource = contextRepository.GetBaseVersionSource(currentBranchTip); + baseVersionSource = Repository.GetBaseVersionSource(currentBranchTip); } catch (NotFoundException exception) { throw new GitVersionException($"Can't find commit {currentBranchTip.Sha}. Please ensure that the repository is an unshallow clone with `git fetch --unshallow`.", exception); } - yield return new BaseVersion(context, "Fallback base version", false, new SemanticVersion(minor: 1), baseVersionSource, null); + yield return new BaseVersion("Fallback base version", false, new SemanticVersion(minor: 1), baseVersionSource, null); } } } diff --git a/src/GitVersionCore/VersionCalculation/BaseVersionCalculators/MergeMessageVersionStrategy.cs b/src/GitVersionCore/VersionCalculation/BaseVersionCalculators/MergeMessageVersionStrategy.cs index d096ab3591..90135e76b3 100644 --- a/src/GitVersionCore/VersionCalculation/BaseVersionCalculators/MergeMessageVersionStrategy.cs +++ b/src/GitVersionCore/VersionCalculation/BaseVersionCalculators/MergeMessageVersionStrategy.cs @@ -6,6 +6,7 @@ using GitVersion.Extensions; using GitVersion.Logging; using LibGit2Sharp; +using Microsoft.Extensions.Options; namespace GitVersion.VersionCalculation { @@ -14,31 +15,31 @@ namespace GitVersion.VersionCalculation /// BaseVersionSource is the commit where the message was found. /// Increments if PreventIncrementForMergedBranchVersion (from the branch config) is false. /// - public class MergeMessageVersionStrategy : IVersionStrategy + public class MergeMessageVersionStrategy : VersionStrategyBase { private readonly ILog log; - public MergeMessageVersionStrategy(ILog log) + public MergeMessageVersionStrategy(ILog log, IRepository repository, IOptions versionContext) : base(repository, versionContext) { this.log = log ?? throw new ArgumentNullException(nameof(log)); } - public virtual IEnumerable GetVersions(GitVersionContext context) + public override IEnumerable GetVersions() { - var commitsPriorToThan = context.CurrentBranch - .CommitsPriorToThan(context.CurrentCommit.When()); + var commitsPriorToThan = Context.CurrentBranch + .CommitsPriorToThan(Context.CurrentCommit.When()); var baseVersions = commitsPriorToThan .SelectMany(c => { - if (TryParse(c, context, out var mergeMessage) && + if (TryParse(c, Context, out var mergeMessage) && mergeMessage.Version != null && - context.FullConfiguration.IsReleaseBranch(TrimRemote(mergeMessage.MergedBranch))) + Context.FullConfiguration.IsReleaseBranch(TrimRemote(mergeMessage.MergedBranch))) { - log.Info($"Found commit [{context.CurrentCommit.Sha}] matching merge message format: {mergeMessage.FormatName}"); - var shouldIncrement = !context.Configuration.PreventIncrementForMergedBranchVersion; + log.Info($"Found commit [{Context.CurrentCommit.Sha}] matching merge message format: {mergeMessage.FormatName}"); + var shouldIncrement = !Context.Configuration.PreventIncrementForMergedBranchVersion; return new[] { - new BaseVersion(context, $"{MergeMessageStrategyPrefix} '{c.Message.Trim()}'", shouldIncrement, mergeMessage.Version, c, null) + new BaseVersion($"{MergeMessageStrategyPrefix} '{c.Message.Trim()}'", shouldIncrement, mergeMessage.Version, c, null) }; } return Enumerable.Empty(); diff --git a/src/GitVersionCore/VersionCalculation/BaseVersionCalculators/TaggedCommitVersionStrategy.cs b/src/GitVersionCore/VersionCalculation/BaseVersionCalculators/TaggedCommitVersionStrategy.cs index fed085fed3..63ab59d6a9 100644 --- a/src/GitVersionCore/VersionCalculation/BaseVersionCalculators/TaggedCommitVersionStrategy.cs +++ b/src/GitVersionCore/VersionCalculation/BaseVersionCalculators/TaggedCommitVersionStrategy.cs @@ -1,9 +1,10 @@ using System; using System.Collections.Generic; using System.Linq; +using GitVersion.Common; using GitVersion.Extensions; -using GitVersion.Logging; using LibGit2Sharp; +using Microsoft.Extensions.Options; namespace GitVersion.VersionCalculation { @@ -12,24 +13,23 @@ namespace GitVersion.VersionCalculation /// BaseVersionSource is the tag's commit. /// Increments if the tag is not the current commit. /// - public class TaggedCommitVersionStrategy : IVersionStrategy + public class TaggedCommitVersionStrategy : VersionStrategyBase { - private readonly ILog log; + private readonly IGitRepoMetadataProvider gitRepoMetadataProvider; - public TaggedCommitVersionStrategy(ILog log) + public TaggedCommitVersionStrategy(IGitRepoMetadataProvider gitRepoMetadataProvider, IRepository repository, IOptions versionContext) : base(repository, versionContext) { - this.log = log ?? throw new ArgumentNullException(nameof(log)); + this.gitRepoMetadataProvider = gitRepoMetadataProvider ?? throw new ArgumentNullException(nameof(gitRepoMetadataProvider)); } - public virtual IEnumerable GetVersions(GitVersionContext context) + public override IEnumerable GetVersions() { - return GetTaggedVersions(context, context.CurrentBranch, context.CurrentCommit.When()); + return GetTaggedVersions(Context.CurrentBranch, Context.CurrentCommit.When()); } - public IEnumerable GetTaggedVersions(GitVersionContext context, Branch currentBranch, DateTimeOffset? olderThan) + internal IEnumerable GetTaggedVersions(Branch currentBranch, DateTimeOffset? olderThan) { - var gitRepoMetadataProvider = new GitRepoMetadataProvider(context.Repository, log, context.FullConfiguration); - var allTags = gitRepoMetadataProvider.GetValidVersionTags(context.Repository, context.Configuration.GitTagPrefix, olderThan); + var allTags = gitRepoMetadataProvider.GetValidVersionTags(Context.Configuration.GitTagPrefix, olderThan); var tagsOnBranch = currentBranch .Commits @@ -45,13 +45,13 @@ public IEnumerable GetTaggedVersions(GitVersionContext context, Bra .Take(5) .ToList(); - return tagsOnBranch.Select(t => CreateBaseVersion(context, t)); + return tagsOnBranch.Select(t => CreateBaseVersion(Context, t)); } private BaseVersion CreateBaseVersion(GitVersionContext context, VersionTaggedCommit version) { var shouldUpdateVersion = version.Commit.Sha != context.CurrentCommit.Sha; - var baseVersion = new BaseVersion(context, FormatSource(version), shouldUpdateVersion, version.SemVer, version.Commit, null); + var baseVersion = new BaseVersion(FormatSource(version), shouldUpdateVersion, version.SemVer, version.Commit, null); return baseVersion; } diff --git a/src/GitVersionCore/VersionCalculation/BaseVersionCalculators/TrackReleaseBranchesVersionStrategy.cs b/src/GitVersionCore/VersionCalculation/BaseVersionCalculators/TrackReleaseBranchesVersionStrategy.cs index bb7a9c0fc2..4d0c5a8e3a 100644 --- a/src/GitVersionCore/VersionCalculation/BaseVersionCalculators/TrackReleaseBranchesVersionStrategy.cs +++ b/src/GitVersionCore/VersionCalculation/BaseVersionCalculators/TrackReleaseBranchesVersionStrategy.cs @@ -1,9 +1,11 @@ +using System; using System.Collections.Generic; using System.Linq; using System.Text.RegularExpressions; +using GitVersion.Common; using GitVersion.Extensions; -using GitVersion.Logging; using LibGit2Sharp; +using Microsoft.Extensions.Options; namespace GitVersion.VersionCalculation { @@ -23,22 +25,26 @@ namespace GitVersion.VersionCalculation /// Increments if the tag is not the current commit (same as base strategy). /// /// - public class TrackReleaseBranchesVersionStrategy : IVersionStrategy + public class TrackReleaseBranchesVersionStrategy : VersionStrategyBase { + private readonly IGitRepoMetadataProvider gitRepoMetadataProvider; private readonly VersionInBranchNameVersionStrategy releaseVersionStrategy; private readonly TaggedCommitVersionStrategy taggedCommitVersionStrategy; - public TrackReleaseBranchesVersionStrategy(ILog log) + public TrackReleaseBranchesVersionStrategy(IGitRepoMetadataProvider gitRepoMetadataProvider, IRepository repository, IOptions versionContext) + : base(repository, versionContext) { - releaseVersionStrategy = new VersionInBranchNameVersionStrategy(); - taggedCommitVersionStrategy = new TaggedCommitVersionStrategy(log); + this.gitRepoMetadataProvider = gitRepoMetadataProvider ?? throw new ArgumentNullException(nameof(gitRepoMetadataProvider)); + + releaseVersionStrategy = new VersionInBranchNameVersionStrategy(gitRepoMetadataProvider, repository, versionContext); + taggedCommitVersionStrategy = new TaggedCommitVersionStrategy(gitRepoMetadataProvider, repository, versionContext); } - public virtual IEnumerable GetVersions(GitVersionContext context) + public override IEnumerable GetVersions() { - if (context.Configuration.TracksReleaseBranches) + if (Context.Configuration.TracksReleaseBranches) { - return ReleaseBranchBaseVersions(context).Union(MasterTagsVersions(context)); + return ReleaseBranchBaseVersions(Context).Union(MasterTagsVersions(Context)); } return new BaseVersion[0]; @@ -46,10 +52,10 @@ public virtual IEnumerable GetVersions(GitVersionContext context) private IEnumerable MasterTagsVersions(GitVersionContext context) { - var master = context.Repository.FindBranch("master"); + var master = Repository.FindBranch("master"); if (master != null) { - return taggedCommitVersionStrategy.GetTaggedVersions(context, master, null); + return taggedCommitVersionStrategy.GetTaggedVersions(master, null); } return new BaseVersion[0]; @@ -62,7 +68,7 @@ private IEnumerable ReleaseBranchBaseVersions(GitVersionContext con .ToList(); if (releaseBranchConfig.Any()) { - var releaseBranches = context.Repository.Branches + var releaseBranches = Repository.Branches .Where(b => releaseBranchConfig.Any(c => Regex.IsMatch(b.FriendlyName, c.Value.Regex))); return releaseBranches @@ -72,8 +78,7 @@ private IEnumerable ReleaseBranchBaseVersions(GitVersionContext con // Need to drop branch overrides and give a bit more context about // where this version came from var source1 = "Release branch exists -> " + baseVersion.Source; - return new BaseVersion(context, - source1, + return new BaseVersion(source1, baseVersion.ShouldIncrement, baseVersion.SemanticVersion, baseVersion.BaseVersionSource, @@ -89,7 +94,7 @@ private IEnumerable GetReleaseVersion(GitVersionContext context, Br var tagPrefixRegex = context.Configuration.GitTagPrefix; // Find the commit where the child branch was created. - var baseSource = context.RepositoryMetadataProvider.FindMergeBase(releaseBranch, context.CurrentBranch); + var baseSource = gitRepoMetadataProvider.FindMergeBase(releaseBranch, context.CurrentBranch); if (baseSource == context.CurrentCommit) { // Ignore the branch if it has no commits. @@ -97,8 +102,8 @@ private IEnumerable GetReleaseVersion(GitVersionContext context, Br } return releaseVersionStrategy - .GetVersions(context, tagPrefixRegex, releaseBranch) - .Select(b => new BaseVersion(context, b.Source, true, b.SemanticVersion, baseSource, b.BranchNameOverride)); + .GetVersions(tagPrefixRegex, releaseBranch) + .Select(b => new BaseVersion(b.Source, true, b.SemanticVersion, baseSource, b.BranchNameOverride)); } } } diff --git a/src/GitVersionCore/VersionCalculation/BaseVersionCalculators/VersionInBranchNameVersionStrategy.cs b/src/GitVersionCore/VersionCalculation/BaseVersionCalculators/VersionInBranchNameVersionStrategy.cs index a8c4437084..d09ada1b97 100644 --- a/src/GitVersionCore/VersionCalculation/BaseVersionCalculators/VersionInBranchNameVersionStrategy.cs +++ b/src/GitVersionCore/VersionCalculation/BaseVersionCalculators/VersionInBranchNameVersionStrategy.cs @@ -1,8 +1,10 @@ using System; using System.Collections.Generic; +using GitVersion.Common; using GitVersion.Configuration; using GitVersion.Extensions; using LibGit2Sharp; +using Microsoft.Extensions.Options; namespace GitVersion.VersionCalculation { @@ -11,18 +13,25 @@ namespace GitVersion.VersionCalculation /// BaseVersionSource is the commit where the branch was branched from its parent. /// Does not increment. /// - public class VersionInBranchNameVersionStrategy : IVersionStrategy + public class VersionInBranchNameVersionStrategy : VersionStrategyBase { - public virtual IEnumerable GetVersions(GitVersionContext context) + private IGitRepoMetadataProvider gitRepoMetadataProvider; + + public VersionInBranchNameVersionStrategy(IGitRepoMetadataProvider gitRepoMetadataProvider, IRepository repository, IOptions versionContext) : base(repository, versionContext) + { + this.gitRepoMetadataProvider = gitRepoMetadataProvider ?? throw new ArgumentNullException(nameof(gitRepoMetadataProvider)); + } + + public override IEnumerable GetVersions() { - var currentBranch = context.CurrentBranch; - var tagPrefixRegex = context.Configuration.GitTagPrefix; - return GetVersions(context, tagPrefixRegex, currentBranch); + var currentBranch = Context.CurrentBranch; + var tagPrefixRegex = Context.Configuration.GitTagPrefix; + return GetVersions(tagPrefixRegex, currentBranch); } - public IEnumerable GetVersions(GitVersionContext context, string tagPrefixRegex, Branch currentBranch) + internal IEnumerable GetVersions(string tagPrefixRegex, Branch currentBranch) { - if (!context.FullConfiguration.IsReleaseBranch(currentBranch.NameWithoutOrigin())) + if (!Context.FullConfiguration.IsReleaseBranch(currentBranch.NameWithoutOrigin())) { yield break; } @@ -31,9 +40,9 @@ public IEnumerable GetVersions(GitVersionContext context, string ta var versionInBranch = GetVersionInBranch(branchName, tagPrefixRegex); if (versionInBranch != null) { - var commitBranchWasBranchedFrom = context.RepositoryMetadataProvider.FindCommitBranchWasBranchedFrom(currentBranch); + var commitBranchWasBranchedFrom = gitRepoMetadataProvider.FindCommitBranchWasBranchedFrom(currentBranch, Context.FullConfiguration); var branchNameOverride = branchName.RegexReplace("[-/]" + versionInBranch.Item1, string.Empty); - yield return new BaseVersion(context, "Version in branch name", false, versionInBranch.Item2, commitBranchWasBranchedFrom.Commit, branchNameOverride); + yield return new BaseVersion("Version in branch name", false, versionInBranch.Item2, commitBranchWasBranchedFrom.Commit, branchNameOverride); } } diff --git a/src/GitVersionCore/VersionCalculation/BaseVersionCalculators/VersionStrategyBase.cs b/src/GitVersionCore/VersionCalculation/BaseVersionCalculators/VersionStrategyBase.cs new file mode 100644 index 0000000000..5bdfc32c03 --- /dev/null +++ b/src/GitVersionCore/VersionCalculation/BaseVersionCalculators/VersionStrategyBase.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using LibGit2Sharp; +using Microsoft.Extensions.Options; + +namespace GitVersion.VersionCalculation +{ + public class VersionStrategyBase : IVersionStrategy + { + protected readonly IRepository Repository; + protected readonly GitVersionContext Context; + + protected VersionStrategyBase(IRepository repository, IOptions versionContext) + { + Repository = repository; + Context = versionContext.Value; + } + public virtual IEnumerable GetVersions() + { + throw new NotImplementedException(); + } + } +} diff --git a/src/GitVersionCore/VersionCalculation/BaseVersionCalculators/VersionStrategyModule.cs b/src/GitVersionCore/VersionCalculation/BaseVersionCalculators/VersionStrategyModule.cs index 186477dbb4..7d7d15bc65 100644 --- a/src/GitVersionCore/VersionCalculation/BaseVersionCalculators/VersionStrategyModule.cs +++ b/src/GitVersionCore/VersionCalculation/BaseVersionCalculators/VersionStrategyModule.cs @@ -1,3 +1,4 @@ +using System.Linq; using System.Reflection; using Microsoft.Extensions.DependencyInjection; @@ -7,7 +8,7 @@ public class VersionStrategyModule : GitVersionModule { public override void RegisterTypes(IServiceCollection services) { - var versionStrategies = FindAllDerivedTypes(Assembly.GetAssembly(GetType())); + var versionStrategies = FindAllDerivedTypes(Assembly.GetAssembly(GetType())).Where(x => x != typeof(VersionStrategyBase)); foreach (var versionStrategy in versionStrategies) { diff --git a/src/GitVersionCore/Cache/GitVersionCache.cs b/src/GitVersionCore/VersionCalculation/Cache/GitVersionCache.cs similarity index 98% rename from src/GitVersionCore/Cache/GitVersionCache.cs rename to src/GitVersionCore/VersionCalculation/Cache/GitVersionCache.cs index 5a4c5a38c8..227fae2928 100644 --- a/src/GitVersionCore/Cache/GitVersionCache.cs +++ b/src/GitVersionCore/VersionCalculation/Cache/GitVersionCache.cs @@ -2,13 +2,14 @@ using System.Collections.Generic; using System.IO; using System.Linq; +using GitVersion.Cache; using GitVersion.Helpers; using GitVersion.Logging; using GitVersion.OutputVariables; using Microsoft.Extensions.Options; using YamlDotNet.Serialization; -namespace GitVersion.Cache +namespace GitVersion.VersionCalculation.Cache { public class GitVersionCache : IGitVersionCache { diff --git a/src/GitVersionCore/Cache/GitVersionCacheKeyFactory.cs b/src/GitVersionCore/VersionCalculation/Cache/GitVersionCacheKeyFactory.cs similarity index 98% rename from src/GitVersionCore/Cache/GitVersionCacheKeyFactory.cs rename to src/GitVersionCore/VersionCalculation/Cache/GitVersionCacheKeyFactory.cs index 4864bad77c..e6193eea0f 100644 --- a/src/GitVersionCore/Cache/GitVersionCacheKeyFactory.cs +++ b/src/GitVersionCore/VersionCalculation/Cache/GitVersionCacheKeyFactory.cs @@ -4,18 +4,14 @@ using System.Linq; using System.Security.Cryptography; using System.Text; +using GitVersion.Cache; using GitVersion.Configuration; using GitVersion.Logging; using LibGit2Sharp; using Microsoft.Extensions.Options; -namespace GitVersion.Cache +namespace GitVersion.VersionCalculation.Cache { - public interface IGitVersionCacheKeyFactory - { - GitVersionCacheKey Create(Config overrideConfig); - } - public class GitVersionCacheKeyFactory : IGitVersionCacheKeyFactory { private readonly IFileSystem fileSystem; diff --git a/src/GitVersionCore/Cache/IGitVersionCache.cs b/src/GitVersionCore/VersionCalculation/Cache/IGitVersionCache.cs similarity index 81% rename from src/GitVersionCore/Cache/IGitVersionCache.cs rename to src/GitVersionCore/VersionCalculation/Cache/IGitVersionCache.cs index a0a3f37f4f..00e49577f4 100644 --- a/src/GitVersionCore/Cache/IGitVersionCache.cs +++ b/src/GitVersionCore/VersionCalculation/Cache/IGitVersionCache.cs @@ -1,6 +1,7 @@ +using GitVersion.Cache; using GitVersion.OutputVariables; -namespace GitVersion.Cache +namespace GitVersion.VersionCalculation.Cache { public interface IGitVersionCache { diff --git a/src/GitVersionCore/VersionCalculation/Cache/IGitVersionCacheKeyFactory.cs b/src/GitVersionCore/VersionCalculation/Cache/IGitVersionCacheKeyFactory.cs new file mode 100644 index 0000000000..ba2fdcecfa --- /dev/null +++ b/src/GitVersionCore/VersionCalculation/Cache/IGitVersionCacheKeyFactory.cs @@ -0,0 +1,10 @@ +using GitVersion.Cache; +using GitVersion.Configuration; + +namespace GitVersion.VersionCalculation.Cache +{ + public interface IGitVersionCacheKeyFactory + { + GitVersionCacheKey Create(Config overrideConfig); + } +} diff --git a/src/GitVersionCore/VersionCalculation/IBaseVersionCalculator.cs b/src/GitVersionCore/VersionCalculation/IBaseVersionCalculator.cs index 421524aa6b..271607929d 100644 --- a/src/GitVersionCore/VersionCalculation/IBaseVersionCalculator.cs +++ b/src/GitVersionCore/VersionCalculation/IBaseVersionCalculator.cs @@ -2,6 +2,6 @@ namespace GitVersion.VersionCalculation { public interface IBaseVersionCalculator { - BaseVersion GetBaseVersion(GitVersionContext context); + BaseVersion GetBaseVersion(); } } diff --git a/src/GitVersionCore/VersionCalculation/IMainlineVersionCalculator.cs b/src/GitVersionCore/VersionCalculation/IMainlineVersionCalculator.cs index ef628bbf80..624a191d26 100644 --- a/src/GitVersionCore/VersionCalculation/IMainlineVersionCalculator.cs +++ b/src/GitVersionCore/VersionCalculation/IMainlineVersionCalculator.cs @@ -1,7 +1,10 @@ +using LibGit2Sharp; + namespace GitVersion.VersionCalculation { public interface IMainlineVersionCalculator { - SemanticVersion FindMainlineModeVersion(BaseVersion baseVersion, GitVersionContext context); + SemanticVersion FindMainlineModeVersion(BaseVersion baseVersion); + SemanticVersionBuildMetaData CreateVersionBuildMetaData(Commit baseVersionSource); } } diff --git a/src/GitVersionCore/VersionCalculation/IMetaDataCalculator.cs b/src/GitVersionCore/VersionCalculation/IMetaDataCalculator.cs deleted file mode 100644 index c574d6651e..0000000000 --- a/src/GitVersionCore/VersionCalculation/IMetaDataCalculator.cs +++ /dev/null @@ -1,9 +0,0 @@ -using LibGit2Sharp; - -namespace GitVersion.VersionCalculation -{ - public interface IMetaDataCalculator - { - SemanticVersionBuildMetaData Create(Commit baseVersionSource, GitVersionContext context); - } -} diff --git a/src/GitVersionCore/VersionCalculation/INextVersionCalculator.cs b/src/GitVersionCore/VersionCalculation/INextVersionCalculator.cs index 0167068618..93c9d1c7d0 100644 --- a/src/GitVersionCore/VersionCalculation/INextVersionCalculator.cs +++ b/src/GitVersionCore/VersionCalculation/INextVersionCalculator.cs @@ -1,10 +1,7 @@ -using GitVersion.Configuration; - namespace GitVersion.VersionCalculation { public interface INextVersionCalculator { - SemanticVersion FindVersion(GitVersionContext context); - string GetBranchSpecificTag(EffectiveConfiguration configuration, string branchFriendlyName, string branchNameOverride); + SemanticVersion FindVersion(); } } diff --git a/src/GitVersionCore/VersionCalculation/IVariableProvider.cs b/src/GitVersionCore/VersionCalculation/IVariableProvider.cs index 91f1801d7f..9820ddf9bd 100644 --- a/src/GitVersionCore/VersionCalculation/IVariableProvider.cs +++ b/src/GitVersionCore/VersionCalculation/IVariableProvider.cs @@ -1,6 +1,7 @@ using GitVersion.Configuration; +using GitVersion.OutputVariables; -namespace GitVersion.OutputVariables +namespace GitVersion.VersionCalculation { public interface IVariableProvider { diff --git a/src/GitVersionCore/VersionFilters/IVersionFilter.cs b/src/GitVersionCore/VersionCalculation/IVersionFilter.cs similarity index 60% rename from src/GitVersionCore/VersionFilters/IVersionFilter.cs rename to src/GitVersionCore/VersionCalculation/IVersionFilter.cs index 4cf806d9d9..3e58de0856 100644 --- a/src/GitVersionCore/VersionFilters/IVersionFilter.cs +++ b/src/GitVersionCore/VersionCalculation/IVersionFilter.cs @@ -1,6 +1,4 @@ -using GitVersion.VersionCalculation; - -namespace GitVersion.VersionFilters +namespace GitVersion.VersionCalculation { public interface IVersionFilter { diff --git a/src/GitVersionCore/VersionCalculation/IVersionStrategy.cs b/src/GitVersionCore/VersionCalculation/IVersionStrategy.cs index 7a50e87d51..d65b492ca4 100644 --- a/src/GitVersionCore/VersionCalculation/IVersionStrategy.cs +++ b/src/GitVersionCore/VersionCalculation/IVersionStrategy.cs @@ -5,14 +5,11 @@ namespace GitVersion.VersionCalculation public interface IVersionStrategy { /// - /// Calculates the values for the given . + /// Calculates the values. /// - /// - /// The context for calculating the . - /// /// /// An of the base version values found by the strategy. /// - IEnumerable GetVersions(GitVersionContext context); + IEnumerable GetVersions(); } } diff --git a/src/GitVersionCore/VersionCalculation/IncrementStrategyFinder.cs b/src/GitVersionCore/VersionCalculation/IncrementStrategyFinder.cs index cb680ef9fd..43ca78add1 100644 --- a/src/GitVersionCore/VersionCalculation/IncrementStrategyFinder.cs +++ b/src/GitVersionCore/VersionCalculation/IncrementStrategyFinder.cs @@ -29,9 +29,9 @@ public static class IncrementStrategyFinder private static readonly Regex DefaultPatchPatternRegex = new Regex(DefaultPatchPattern, RegexOptions.Compiled | RegexOptions.IgnoreCase); private static readonly Regex DefaultNoBumpPatternRegex = new Regex(DefaultNoBumpPattern, RegexOptions.Compiled | RegexOptions.IgnoreCase); - public static VersionField? DetermineIncrementedField(GitVersionContext context, BaseVersion baseVersion) + public static VersionField? DetermineIncrementedField(IRepository repository, GitVersionContext context, BaseVersion baseVersion) { - var commitMessageIncrement = FindCommitMessageIncrement(context, baseVersion); + var commitMessageIncrement = FindCommitMessageIncrement(repository, context, baseVersion); var defaultIncrement = context.Configuration.Increment.ToVersionField(); // use the default branch config increment strategy if there are no commit message overrides @@ -56,14 +56,14 @@ public static class IncrementStrategyFinder return commitMessageIncrement; } - private static VersionField? FindCommitMessageIncrement(GitVersionContext context, BaseVersion baseVersion) + private static VersionField? FindCommitMessageIncrement(IRepository repository, GitVersionContext context, BaseVersion baseVersion) { if (context.Configuration.CommitMessageIncrementing == CommitMessageIncrementMode.Disabled) { return null; } - var commits = GetIntermediateCommits(context.Repository, baseVersion.BaseVersionSource, context.CurrentCommit); + var commits = GetIntermediateCommits(repository, baseVersion.BaseVersionSource, context.CurrentCommit); if (context.Configuration.CommitMessageIncrementing == CommitMessageIncrementMode.MergeMessageOnly) { diff --git a/src/GitVersionCore/VersionCalculation/MainlineVersionCalculator.cs b/src/GitVersionCore/VersionCalculation/MainlineVersionCalculator.cs index 9b5d4578fe..968d1524cf 100644 --- a/src/GitVersionCore/VersionCalculation/MainlineVersionCalculator.cs +++ b/src/GitVersionCore/VersionCalculation/MainlineVersionCalculator.cs @@ -6,21 +6,24 @@ using GitVersion.Extensions; using GitVersion.Logging; using LibGit2Sharp; +using Microsoft.Extensions.Options; namespace GitVersion.VersionCalculation { internal class MainlineVersionCalculator : IMainlineVersionCalculator { - private readonly IMetaDataCalculator metaDataCalculator; private readonly ILog log; + private readonly IRepository repository; + private readonly GitVersionContext context; - public MainlineVersionCalculator(ILog log, IMetaDataCalculator metaDataCalculator) + public MainlineVersionCalculator(ILog log, IRepository repository, IOptions versionContext) { - this.metaDataCalculator = metaDataCalculator ?? throw new ArgumentNullException(nameof(metaDataCalculator)); this.log = log ?? throw new ArgumentNullException(nameof(log)); + this.repository = repository ?? throw new ArgumentNullException(nameof(repository)); + this.context = versionContext.Value; } - public SemanticVersion FindMainlineModeVersion(BaseVersion baseVersion, GitVersionContext context) + public SemanticVersion FindMainlineModeVersion(BaseVersion baseVersion) { if (baseVersion.SemanticVersion.PreReleaseTag.HasTag()) { @@ -35,20 +38,20 @@ public SemanticVersion FindMainlineModeVersion(BaseVersion baseVersion, GitVersi // * feature/foo // / | // master * * - // + // var mergeBase = baseVersion.BaseVersionSource; - var mainline = GetMainline(context, baseVersion.BaseVersionSource); + var mainline = GetMainline(baseVersion.BaseVersionSource); var mainlineTip = mainline.Tip; // when the current branch is not mainline, find the effective mainline tip for versioning the branch if (!context.CurrentBranch.IsSameBranch(mainline)) { - mergeBase = FindMergeBaseBeforeForwardMerge(context, baseVersion.BaseVersionSource, mainline, out mainlineTip); + mergeBase = FindMergeBaseBeforeForwardMerge(baseVersion.BaseVersionSource, mainline, out mainlineTip); log.Info($"Current branch ({context.CurrentBranch.FriendlyName}) was branch from {mergeBase}"); } - var mainlineCommitLog = context.Repository.GetMainlineCommitLog(baseVersion, mainlineTip); + var mainlineCommitLog = repository.GetMainlineCommitLog(baseVersion, mainlineTip); var directCommits = new List(mainlineCommitLog.Count); // Scans commit log in reverse, aggregating merge commits @@ -57,18 +60,18 @@ public SemanticVersion FindMainlineModeVersion(BaseVersion baseVersion, GitVersi directCommits.Add(commit); if (commit.Parents.Count() > 1) { - mainlineVersion = AggregateMergeCommitIncrement(context, commit, directCommits, mainlineVersion, mainline); + mainlineVersion = AggregateMergeCommitIncrement(commit, directCommits, mainlineVersion, mainline); } } // This will increment for any direct commits on mainline - mainlineVersion = IncrementForEachCommit(context, directCommits, mainlineVersion, mainline); - mainlineVersion.BuildMetaData = metaDataCalculator.Create(mergeBase, context); + mainlineVersion = IncrementForEachCommit(directCommits, mainlineVersion, mainline); + mainlineVersion.BuildMetaData = CreateVersionBuildMetaData(mergeBase); // branches other than master always get a bump for the act of branching if (context.CurrentBranch.FriendlyName != "master") { - var branchIncrement = FindMessageIncrement(context, null, context.CurrentCommit, mergeBase, mainlineCommitLog); + var branchIncrement = FindMessageIncrement(null, context.CurrentCommit, mergeBase, mainlineCommitLog); log.Info($"Performing {branchIncrement} increment for current branch "); mainlineVersion = mainlineVersion.IncrementVersion(branchIncrement); @@ -78,17 +81,33 @@ public SemanticVersion FindMainlineModeVersion(BaseVersion baseVersion, GitVersi } } - private SemanticVersion AggregateMergeCommitIncrement(GitVersionContext context, Commit commit, List directCommits, SemanticVersion mainlineVersion, Branch mainline) + public SemanticVersionBuildMetaData CreateVersionBuildMetaData(Commit baseVersionSource) + { + var commitLog = repository.GetCommitLog(baseVersionSource, context.CurrentCommit); + var commitsSinceTag = commitLog.Count(); + log.Info($"{commitsSinceTag} commits found between {baseVersionSource.Sha} and {context.CurrentCommit.Sha}"); + + var shortSha = repository.ObjectDatabase.ShortenObjectId(context.CurrentCommit); + return new SemanticVersionBuildMetaData( + baseVersionSource.Sha, + commitsSinceTag, + context.CurrentBranch.FriendlyName, + context.CurrentCommit.Sha, + shortSha, + context.CurrentCommit.When()); + } + + private SemanticVersion AggregateMergeCommitIncrement(Commit commit, List directCommits, SemanticVersion mainlineVersion, Branch mainline) { // Merge commit, process all merged commits as a batch var mergeCommit = commit; var mergedHead = GetMergedHead(mergeCommit); - var findMergeBase = context.Repository.ObjectDatabase.FindMergeBase(mergeCommit.Parents.First(), mergedHead); - var findMessageIncrement = FindMessageIncrement(context, mergeCommit, mergedHead, findMergeBase, directCommits); + var findMergeBase = repository.ObjectDatabase.FindMergeBase(mergeCommit.Parents.First(), mergedHead); + var findMessageIncrement = FindMessageIncrement(mergeCommit, mergedHead, findMergeBase, directCommits); // If this collection is not empty there has been some direct commits against master // Treat each commit as it's own 'release', we need to do this before we increment the branch - mainlineVersion = IncrementForEachCommit(context, directCommits, mainlineVersion, mainline); + mainlineVersion = IncrementForEachCommit(directCommits, mainlineVersion, mainline); directCommits.Clear(); // Finally increment for the branch @@ -97,17 +116,17 @@ private SemanticVersion AggregateMergeCommitIncrement(GitVersionContext context, return mainlineVersion; } - private Branch GetMainline(GitVersionContext context, Commit baseVersionSource) + private Branch GetMainline(Commit baseVersionSource) { var mainlineBranchConfigs = context.FullConfiguration.Branches.Where(b => b.Value.IsMainline == true).ToList(); - var mainlineBranches = context.Repository.Branches + var mainlineBranches = repository.Branches .Where(b => { return mainlineBranchConfigs.Any(c => Regex.IsMatch(b.FriendlyName, c.Value.Regex)); }) .Select(b => new { - MergeBase = context.Repository.ObjectDatabase.FindMergeBase(b.Tip, context.CurrentCommit), + MergeBase = repository.ObjectDatabase.FindMergeBase(b.Tip, context.CurrentCommit), Branch = b }) .Where(a => a.MergeBase != null) @@ -136,7 +155,7 @@ private Branch GetMainline(GitVersionContext context, Commit baseVersionSource) } // prefer a branch on which the merge base was a direct commit, if there is such a branch - var firstMatchingCommitBranch = possibleMainlineBranches.FirstOrDefault(b => context.Repository.GetMatchingCommitBranch(baseVersionSource, b, firstMatchingCommit)); + var firstMatchingCommitBranch = possibleMainlineBranches.FirstOrDefault(b => repository.GetMatchingCommitBranch(baseVersionSource, b, firstMatchingCommit)); if (firstMatchingCommitBranch != null) { var message = string.Format( @@ -181,15 +200,14 @@ private Commit GetEffectiveMainlineTip(IEnumerable mainlineCommitLog, Co /// /// Gets the best possible merge base between the current commit and that is not the child of a forward merge. /// - /// The current versioning context. /// The commit that establishes the contextual base version. /// The mainline branch. /// The commit on mainline at which the returned merge base was fully integrated. /// The best possible merge base between the current commit and that is not the child of a forward merge. - private Commit FindMergeBaseBeforeForwardMerge(GitVersionContext context, Commit baseVersionSource, Branch mainline, out Commit mainlineTip) + private Commit FindMergeBaseBeforeForwardMerge(Commit baseVersionSource, Branch mainline, out Commit mainlineTip) { - var mergeBase = context.Repository.ObjectDatabase.FindMergeBase(context.CurrentCommit, mainline.Tip); - var mainlineCommitLog = context.Repository.GetMainlineCommitLog(baseVersionSource, mainline); + var mergeBase = repository.ObjectDatabase.FindMergeBase(context.CurrentCommit, mainline.Tip); + var mainlineCommitLog = repository.GetMainlineCommitLog(baseVersionSource, mainline); // find the mainline commit effective for versioning the current branch mainlineTip = GetEffectiveMainlineTip(mainlineCommitLog, mergeBase, mainline.Tip); @@ -203,14 +221,14 @@ private Commit FindMergeBaseBeforeForwardMerge(GitVersionContext context, Commit log.Info(message); // re-do mergeBase detection before the forward merge - mergeBase = context.Repository.ObjectDatabase.FindMergeBase(context.CurrentCommit, mainlineTipPrevious); + mergeBase = repository.ObjectDatabase.FindMergeBase(context.CurrentCommit, mainlineTipPrevious); mainlineTip = GetEffectiveMainlineTip(mainlineCommitLog, mergeBase, mainlineTipPrevious); } return mergeBase; } - private SemanticVersion IncrementForEachCommit(GitVersionContext context, List directCommits, SemanticVersion mainlineVersion, Branch mainline) + private SemanticVersion IncrementForEachCommit(IEnumerable directCommits, SemanticVersion mainlineVersion, Branch mainline) { foreach (var directCommit in directCommits) { @@ -224,16 +242,15 @@ private SemanticVersion IncrementForEachCommit(GitVersionContext context, List commitLog) + private VersionField FindMessageIncrement(Commit mergeCommit, Commit mergedHead, Commit findMergeBase, List commitLog) { - var commits = context.Repository.GetMergeBaseCommits(mergeCommit, mergedHead, findMergeBase); + var commits = repository.GetMergeBaseCommits(mergeCommit, mergedHead, findMergeBase); commitLog.RemoveAll(c => commits.Any(c1 => c1.Sha == c.Sha)); return IncrementStrategyFinder.GetIncrementForCommits(context, commits) - ?? TryFindIncrementFromMergeMessage(mergeCommit, context); + ?? TryFindIncrementFromMergeMessage(mergeCommit); } - private static VersionField TryFindIncrementFromMergeMessage(Commit mergeCommit, GitVersionContext context) + private VersionField TryFindIncrementFromMergeMessage(Commit mergeCommit) { if (mergeCommit != null) { diff --git a/src/GitVersionCore/VersionCalculation/MetaDataCalculator.cs b/src/GitVersionCore/VersionCalculation/MetaDataCalculator.cs deleted file mode 100644 index 5afc940f9f..0000000000 --- a/src/GitVersionCore/VersionCalculation/MetaDataCalculator.cs +++ /dev/null @@ -1,34 +0,0 @@ -using System; -using System.Linq; -using GitVersion.Extensions; -using GitVersion.Logging; -using LibGit2Sharp; - -namespace GitVersion.VersionCalculation -{ - public class MetaDataCalculator : IMetaDataCalculator - { - private readonly ILog log; - - public MetaDataCalculator(ILog log) - { - this.log = log ?? throw new ArgumentNullException(nameof(log)); - } - - public SemanticVersionBuildMetaData Create(Commit baseVersionSource, GitVersionContext context) - { - var commitLog = context.Repository.GetCommitLog(baseVersionSource, context.CurrentCommit); - var commitsSinceTag = commitLog.Count(); - log.Info($"{commitsSinceTag} commits found between {baseVersionSource.Sha} and {context.CurrentCommit.Sha}"); - - var shortSha = context.Repository.ObjectDatabase.ShortenObjectId(context.CurrentCommit); - return new SemanticVersionBuildMetaData( - baseVersionSource.Sha, - commitsSinceTag, - context.CurrentBranch.FriendlyName, - context.CurrentCommit.Sha, - shortSha, - context.CurrentCommit.When()); - } - } -} diff --git a/src/GitVersionCore/VersionFilters/MinDateVersionFilter.cs b/src/GitVersionCore/VersionCalculation/MinDateVersionFilter.cs similarity index 91% rename from src/GitVersionCore/VersionFilters/MinDateVersionFilter.cs rename to src/GitVersionCore/VersionCalculation/MinDateVersionFilter.cs index bf038e3a95..a265dd82e6 100644 --- a/src/GitVersionCore/VersionFilters/MinDateVersionFilter.cs +++ b/src/GitVersionCore/VersionCalculation/MinDateVersionFilter.cs @@ -1,8 +1,7 @@ using System; using GitVersion.Extensions; -using GitVersion.VersionCalculation; -namespace GitVersion.VersionFilters +namespace GitVersion.VersionCalculation { public class MinDateVersionFilter : IVersionFilter { diff --git a/src/GitVersionCore/VersionCalculation/NextVersionCalculator.cs b/src/GitVersionCore/VersionCalculation/NextVersionCalculator.cs index a4a49a8639..ee3223e776 100644 --- a/src/GitVersionCore/VersionCalculation/NextVersionCalculator.cs +++ b/src/GitVersionCore/VersionCalculation/NextVersionCalculator.cs @@ -1,11 +1,12 @@ using System; using System.IO; using System.Linq; -using System.Text.RegularExpressions; +using GitVersion.Common; using GitVersion.Configuration; -using GitVersion.Exceptions; using GitVersion.Extensions; using GitVersion.Logging; +using LibGit2Sharp; +using Microsoft.Extensions.Options; namespace GitVersion.VersionCalculation { @@ -14,18 +15,24 @@ public class NextVersionCalculator : INextVersionCalculator private readonly ILog log; private readonly IBaseVersionCalculator baseVersionCalculator; private readonly IMainlineVersionCalculator mainlineVersionCalculator; - private readonly IMetaDataCalculator metaDataCalculator; + private readonly IGitRepoMetadataProvider gitRepoMetadataProvider; + private readonly IRepository repository; + private readonly GitVersionContext context; - public NextVersionCalculator(ILog log, IMetaDataCalculator metaDataCalculator, IBaseVersionCalculator baseVersionCalculator, IMainlineVersionCalculator mainlineVersionCalculator) + public NextVersionCalculator(ILog log, IBaseVersionCalculator baseVersionCalculator, + IMainlineVersionCalculator mainlineVersionCalculator, IGitRepoMetadataProvider gitRepoMetadataProvider, + IOptions versionContext, IRepository repository) { this.log = log ?? throw new ArgumentNullException(nameof(log)); - this.metaDataCalculator = metaDataCalculator ?? throw new ArgumentNullException(nameof(metaDataCalculator)); - this.baseVersionCalculator = baseVersionCalculator ?? throw new ArgumentNullException(nameof(baseVersionCalculator)); this.mainlineVersionCalculator = mainlineVersionCalculator ?? throw new ArgumentNullException(nameof(mainlineVersionCalculator)); + this.gitRepoMetadataProvider = gitRepoMetadataProvider ?? throw new ArgumentNullException(nameof(gitRepoMetadataProvider)); + this.repository = repository ?? throw new ArgumentNullException(nameof(repository)); + + context = versionContext.Value; } - public SemanticVersion FindVersion(GitVersionContext context) + public SemanticVersion FindVersion() { log.Info($"Running against branch: {context.CurrentBranch.FriendlyName} ({(context.CurrentCommit == null ? "-" : context.CurrentCommit.Sha)})"); if (context.IsCurrentCommitTagged) @@ -35,37 +42,23 @@ public SemanticVersion FindVersion(GitVersionContext context) } EnsureHeadIsNotDetached(context); - var filePath = Path.Combine(context.Repository.GetRepositoryDirectory(), "NextVersion.txt"); + var filePath = Path.Combine(repository.GetRepositoryDirectory(), "NextVersion.txt"); if (File.Exists(filePath)) { throw new WarningException("NextVersion.txt has been deprecated. See http://gitversion.readthedocs.org/en/latest/configuration/ for replacement"); } - return FindVersionInternal(context); + return FindVersionInternal(); } - private static void EnsureHeadIsNotDetached(GitVersionContext context) - { - if (!context.CurrentBranch.IsDetachedHead()) - { - return; - } - - var message = string.Format( - "It looks like the branch being examined is a detached Head pointing to commit '{0}'. " + - "Without a proper branch name GitVersion cannot determine the build version.", - context.CurrentCommit.Id.ToString(7)); - throw new WarningException(message); - } - - public SemanticVersion FindVersionInternal(GitVersionContext context) + internal SemanticVersion FindVersionInternal() { SemanticVersion taggedSemanticVersion = null; if (context.IsCurrentCommitTagged) { // Will always be 0, don't bother with the +0 on tags - var semanticVersionBuildMetaData = metaDataCalculator.Create(context.CurrentCommit, context); + var semanticVersionBuildMetaData = mainlineVersionCalculator.CreateVersionBuildMetaData(context.CurrentCommit); semanticVersionBuildMetaData.CommitsSinceTag = null; var semanticVersion = new SemanticVersion(context.CurrentCommitTaggedVersion) @@ -75,16 +68,16 @@ public SemanticVersion FindVersionInternal(GitVersionContext context) taggedSemanticVersion = semanticVersion; } - var baseVersion = baseVersionCalculator.GetBaseVersion(context); + var baseVersion = baseVersionCalculator.GetBaseVersion(); SemanticVersion semver; if (context.Configuration.VersioningMode == VersioningMode.Mainline) { - semver = mainlineVersionCalculator.FindMainlineModeVersion(baseVersion, context); + semver = mainlineVersionCalculator.FindMainlineModeVersion(baseVersion); } else { - semver = PerformIncrement(context, baseVersion); - semver.BuildMetaData = metaDataCalculator.Create(baseVersion.BaseVersionSource, context); + semver = PerformIncrement(baseVersion); + semver.BuildMetaData = mainlineVersionCalculator.CreateVersionBuildMetaData(baseVersion.BaseVersionSource); } var hasPreReleaseTag = semver.PreReleaseTag.HasTag(); @@ -92,7 +85,7 @@ public SemanticVersion FindVersionInternal(GitVersionContext context) var preReleaseTagDoesNotMatchConfiguration = hasPreReleaseTag && branchConfigHasPreReleaseTagConfigured && semver.PreReleaseTag.Name != context.Configuration.Tag; if (!semver.PreReleaseTag.HasTag() && branchConfigHasPreReleaseTagConfigured || preReleaseTagDoesNotMatchConfiguration) { - UpdatePreReleaseTag(context, semver, baseVersion.BranchNameOverride); + UpdatePreReleaseTag(semver, baseVersion.BranchNameOverride); } if (taggedSemanticVersion != null) @@ -112,10 +105,10 @@ public SemanticVersion FindVersionInternal(GitVersionContext context) return taggedSemanticVersion ?? semver; } - private SemanticVersion PerformIncrement(GitVersionContext context, BaseVersion baseVersion) + private SemanticVersion PerformIncrement(BaseVersion baseVersion) { var semver = baseVersion.SemanticVersion; - var increment = IncrementStrategyFinder.DetermineIncrementedField(context, baseVersion); + var increment = IncrementStrategyFinder.DetermineIncrementedField(repository, context, baseVersion); if (increment != null) { semver = semver.IncrementVersion(increment.Value); @@ -124,13 +117,13 @@ private SemanticVersion PerformIncrement(GitVersionContext context, BaseVersion return semver; } - private void UpdatePreReleaseTag(GitVersionContext context, SemanticVersion semanticVersion, string branchNameOverride) + private void UpdatePreReleaseTag(SemanticVersion semanticVersion, string branchNameOverride) { - var tagToUse = GetBranchSpecificTag(context.Configuration, context.CurrentBranch.FriendlyName, branchNameOverride); + var tagToUse = context.Configuration.GetBranchSpecificTag(log, context.CurrentBranch.FriendlyName, branchNameOverride); int? number = null; - var lastTag = context.RepositoryMetadataProvider + var lastTag = gitRepoMetadataProvider .GetVersionTagsOnBranch(context.CurrentBranch, context.Configuration.GitTagPrefix) .FirstOrDefault(v => v.PreReleaseTag.Name == tagToUse); @@ -149,27 +142,18 @@ private void UpdatePreReleaseTag(GitVersionContext context, SemanticVersion sema semanticVersion.PreReleaseTag = new SemanticVersionPreReleaseTag(tagToUse, number); } - public string GetBranchSpecificTag(EffectiveConfiguration configuration, string branchFriendlyName, string branchNameOverride) + private static void EnsureHeadIsNotDetached(GitVersionContext context) { - var tagToUse = configuration.Tag; - if (tagToUse == "useBranchName") + if (!context.CurrentBranch.IsDetachedHead()) { - tagToUse = "{BranchName}"; + return; } - if (tagToUse.Contains("{BranchName}")) - { - log.Info("Using branch name to calculate version tag"); - - var branchName = branchNameOverride ?? branchFriendlyName; - if (!string.IsNullOrWhiteSpace(configuration.BranchPrefixToTrim)) - { - branchName = branchName.RegexReplace(configuration.BranchPrefixToTrim, string.Empty, RegexOptions.IgnoreCase); - } - branchName = branchName.RegexReplace("[^a-zA-Z0-9-]", "-"); - tagToUse = tagToUse.Replace("{BranchName}", branchName); - } - return tagToUse; + var message = string.Format( + "It looks like the branch being examined is a detached Head pointing to commit '{0}'. " + + "Without a proper branch name GitVersion cannot determine the build version.", + context.CurrentCommit.Id.ToString(7)); + throw new WarningException(message); } private static bool MajorMinorPatchEqual(SemanticVersion lastTag, SemanticVersion baseVersion) diff --git a/src/GitVersionCore/SemanticVersioning/SemanticVersion.cs b/src/GitVersionCore/VersionCalculation/SemanticVersioning/SemanticVersion.cs similarity index 99% rename from src/GitVersionCore/SemanticVersioning/SemanticVersion.cs rename to src/GitVersionCore/VersionCalculation/SemanticVersioning/SemanticVersion.cs index 4dd3d10897..a016ce6c06 100644 --- a/src/GitVersionCore/SemanticVersioning/SemanticVersion.cs +++ b/src/GitVersionCore/VersionCalculation/SemanticVersioning/SemanticVersion.cs @@ -1,6 +1,5 @@ using System; using System.Text.RegularExpressions; -using GitVersion.Exceptions; namespace GitVersion { diff --git a/src/GitVersionCore/SemanticVersioning/SemanticVersionBuildMetaData.cs b/src/GitVersionCore/VersionCalculation/SemanticVersioning/SemanticVersionBuildMetaData.cs similarity index 100% rename from src/GitVersionCore/SemanticVersioning/SemanticVersionBuildMetaData.cs rename to src/GitVersionCore/VersionCalculation/SemanticVersioning/SemanticVersionBuildMetaData.cs diff --git a/src/GitVersionCore/SemanticVersioning/SemanticVersionExtensions.cs b/src/GitVersionCore/VersionCalculation/SemanticVersioning/SemanticVersionExtensions.cs similarity index 100% rename from src/GitVersionCore/SemanticVersioning/SemanticVersionExtensions.cs rename to src/GitVersionCore/VersionCalculation/SemanticVersioning/SemanticVersionExtensions.cs diff --git a/src/GitVersionCore/SemanticVersioning/SemanticVersionFormatValues.cs b/src/GitVersionCore/VersionCalculation/SemanticVersioning/SemanticVersionFormatValues.cs similarity index 100% rename from src/GitVersionCore/SemanticVersioning/SemanticVersionFormatValues.cs rename to src/GitVersionCore/VersionCalculation/SemanticVersioning/SemanticVersionFormatValues.cs diff --git a/src/GitVersionCore/SemanticVersioning/SemanticVersionPreReleaseTag.cs b/src/GitVersionCore/VersionCalculation/SemanticVersioning/SemanticVersionPreReleaseTag.cs similarity index 100% rename from src/GitVersionCore/SemanticVersioning/SemanticVersionPreReleaseTag.cs rename to src/GitVersionCore/VersionCalculation/SemanticVersioning/SemanticVersionPreReleaseTag.cs diff --git a/src/GitVersionCore/VersionFilters/ShaVersionFilter.cs b/src/GitVersionCore/VersionCalculation/ShaVersionFilter.cs similarity index 92% rename from src/GitVersionCore/VersionFilters/ShaVersionFilter.cs rename to src/GitVersionCore/VersionCalculation/ShaVersionFilter.cs index 6e50b16540..4534c1a882 100644 --- a/src/GitVersionCore/VersionFilters/ShaVersionFilter.cs +++ b/src/GitVersionCore/VersionCalculation/ShaVersionFilter.cs @@ -1,9 +1,8 @@ using System; using System.Collections.Generic; using System.Linq; -using GitVersion.VersionCalculation; -namespace GitVersion.VersionFilters +namespace GitVersion.VersionCalculation { public class ShaVersionFilter : IVersionFilter { diff --git a/src/GitVersionCore/VersionCalculation/VariableProvider.cs b/src/GitVersionCore/VersionCalculation/VariableProvider.cs index fe42fd7a79..9d34c9be8b 100644 --- a/src/GitVersionCore/VersionCalculation/VariableProvider.cs +++ b/src/GitVersionCore/VersionCalculation/VariableProvider.cs @@ -1,23 +1,20 @@ using System; using System.Text.RegularExpressions; using GitVersion.Configuration; -using GitVersion.Exceptions; using GitVersion.Extensions; using GitVersion.Helpers; using GitVersion.Logging; -using GitVersion.VersionCalculation; +using GitVersion.OutputVariables; -namespace GitVersion.OutputVariables +namespace GitVersion.VersionCalculation { public class VariableProvider : IVariableProvider { - private readonly INextVersionCalculator nextVersionCalculator; private readonly IEnvironment environment; private readonly ILog log; - public VariableProvider(INextVersionCalculator nextVersionCalculator, IEnvironment environment, ILog log) + public VariableProvider(IEnvironment environment, ILog log) { - this.nextVersionCalculator = nextVersionCalculator ?? throw new ArgumentNullException(nameof(nextVersionCalculator)); this.environment = environment ?? throw new ArgumentNullException(nameof(environment)); this.log = log ?? throw new ArgumentNullException(nameof(log)); } @@ -31,7 +28,7 @@ public VersionVariables GetVariablesFor(SemanticVersion semanticVersion, Effecti // Continuous Deployment always requires a pre-release tag unless the commit is tagged if (!semanticVersion.PreReleaseTag.HasTag()) { - semanticVersion.PreReleaseTag.Name = nextVersionCalculator.GetBranchSpecificTag(config, semanticVersion.BuildMetaData.Branch, null); + semanticVersion.PreReleaseTag.Name = config.GetBranchSpecificTag(log, semanticVersion.BuildMetaData.Branch, null); if (string.IsNullOrEmpty(semanticVersion.PreReleaseTag.Name)) { semanticVersion.PreReleaseTag.Name = config.ContinuousDeploymentFallbackTag; diff --git a/src/GitVersionExe.Tests/ArgumentBuilder.cs b/src/GitVersionExe.Tests/ArgumentBuilder.cs index d60a90eb08..488f35c497 100644 --- a/src/GitVersionExe.Tests/ArgumentBuilder.cs +++ b/src/GitVersionExe.Tests/ArgumentBuilder.cs @@ -9,7 +9,6 @@ public ArgumentBuilder(string workingDirectory) this.workingDirectory = workingDirectory; } - public ArgumentBuilder(string workingDirectory, string exec, string execArgs, string projectFile, string projectArgs, string logFile) { this.workingDirectory = workingDirectory; @@ -27,10 +26,8 @@ public ArgumentBuilder(string workingDirectory, string additionalArguments, stri this.logFile = logFile; } - public string WorkingDirectory => workingDirectory; - public string LogFile => logFile; public override string ToString() @@ -69,7 +66,6 @@ public override string ToString() return arguments.ToString(); } - private readonly string additionalArguments; private readonly string exec; private readonly string execArgs; diff --git a/src/GitVersionExe.Tests/ArgumentParserTests.cs b/src/GitVersionExe.Tests/ArgumentParserTests.cs index 451dec8844..caf76c50ee 100644 --- a/src/GitVersionExe.Tests/ArgumentParserTests.cs +++ b/src/GitVersionExe.Tests/ArgumentParserTests.cs @@ -1,5 +1,4 @@ using GitVersion; -using GitVersion.Exceptions; using GitVersion.Logging; using GitVersion.Model; using GitVersionCore.Tests.Helpers; diff --git a/src/GitVersionExe.Tests/ExecCmdLineArgumentTest.cs b/src/GitVersionExe.Tests/ExecCmdLineArgumentTest.cs index 3642b8f10b..0756b13f35 100644 --- a/src/GitVersionExe.Tests/ExecCmdLineArgumentTest.cs +++ b/src/GitVersionExe.Tests/ExecCmdLineArgumentTest.cs @@ -74,7 +74,7 @@ public void CheckBuildServerVerbosityConsole(string verbosityArg, string expecte [Test] public void WorkingDirectoryWithoutGitFolderFailsWithInformativeMessage() { - var result = GitVersionHelper.ExecuteIn(Environment.SystemDirectory, null, false); + var result = GitVersionHelper.ExecuteIn(Environment.SystemDirectory, arguments: null, logToFile: false); result.ExitCode.ShouldNotBe(0); result.Output.ShouldContain("Can't find the .git directory in"); diff --git a/src/GitVersionExe.Tests/HelpWriterTests.cs b/src/GitVersionExe.Tests/HelpWriterTests.cs index 69a37e98b7..357cfae325 100644 --- a/src/GitVersionExe.Tests/HelpWriterTests.cs +++ b/src/GitVersionExe.Tests/HelpWriterTests.cs @@ -40,7 +40,8 @@ public void AllArgsAreInHelp() nameof(Arguments.Authentication), nameof(Arguments.CommitId), nameof(Arguments.DynamicGitRepositoryPath), - nameof(Arguments.HasOverrideConfig) + nameof(Arguments.HasOverrideConfig), + nameof(Arguments.OnlyTrackedBranches) }; typeof(Arguments).GetFields() .Select(p => p.Name) diff --git a/src/GitVersionExe/ArgumentParser.cs b/src/GitVersionExe/ArgumentParser.cs index 93ff859de4..2708befa2a 100644 --- a/src/GitVersionExe/ArgumentParser.cs +++ b/src/GitVersionExe/ArgumentParser.cs @@ -4,7 +4,6 @@ using System.IO; using System.Linq; using GitVersion.Configuration; -using GitVersion.Exceptions; using GitVersion.Extensions; using GitVersion.Logging; using GitVersion.Model; @@ -18,7 +17,7 @@ public class ArgumentParser : IArgumentParser public ArgumentParser(IEnvironment environment) { - this.environment = environment; + this.environment = environment ?? throw new ArgumentNullException(nameof(environment)); } public Arguments ParseArguments(string commandLineArguments) @@ -99,6 +98,10 @@ public Arguments ParseArguments(string[] commandLineArguments) { EnsureArgumentValueCount(values); arguments.TargetPath = value; + if (!Directory.Exists(value)) + { + Console.WriteLine($"The working directory '{value}' does not exist."); + } continue; } diff --git a/src/GitVersionExe/ExecCommand.cs b/src/GitVersionExe/ExecCommand.cs index d001a58e39..bf41f74603 100644 --- a/src/GitVersionExe/ExecCommand.cs +++ b/src/GitVersionExe/ExecCommand.cs @@ -2,7 +2,6 @@ using System.Collections.Generic; using System.Linq; using System.Runtime.InteropServices; -using GitVersion.Exceptions; using GitVersion.Extensions; using GitVersion.Extensions.VersionAssemblyInfoResources; using GitVersion.Helpers; diff --git a/src/GitVersionExe/GitVersionExecutor.cs b/src/GitVersionExe/GitVersionExecutor.cs index 2b09c36044..ffbe249d80 100644 --- a/src/GitVersionExe/GitVersionExecutor.cs +++ b/src/GitVersionExe/GitVersionExecutor.cs @@ -2,7 +2,6 @@ using System.IO; using System.Reflection; using GitVersion.Configuration; -using GitVersion.Exceptions; using GitVersion.Extensions; using GitVersion.Logging; using GitVersion.Model; @@ -17,12 +16,11 @@ public class GitVersionExecutor : IGitVersionExecutor private readonly IExecCommand execCommand; private readonly IConfigProvider configProvider; private readonly IBuildServerResolver buildServerResolver; - private readonly IGitPreparer gitPreparer; private readonly IGitVersionCalculator gitVersionCalculator; private readonly IVersionWriter versionWriter; public GitVersionExecutor(ILog log, IConfigFileLocator configFileLocator, IConfigProvider configProvider, - IBuildServerResolver buildServerResolver, IGitPreparer gitPreparer, IGitVersionCalculator gitVersionCalculator, + IBuildServerResolver buildServerResolver, IGitVersionCalculator gitVersionCalculator, IVersionWriter versionWriter, IHelpWriter helpWriter, IExecCommand execCommand) { this.log = log ?? throw new ArgumentNullException(nameof(log)); @@ -30,7 +28,6 @@ public GitVersionExecutor(ILog log, IConfigFileLocator configFileLocator, IConfi this.configProvider = configProvider ?? throw new ArgumentNullException(nameof(configFileLocator)); this.buildServerResolver = buildServerResolver ?? throw new ArgumentNullException(nameof(buildServerResolver)); - this.gitPreparer = gitPreparer ?? throw new ArgumentNullException(nameof(gitPreparer)); this.gitVersionCalculator = gitVersionCalculator ?? throw new ArgumentNullException(nameof(gitVersionCalculator)); this.versionWriter = versionWriter ?? throw new ArgumentNullException(nameof(versionWriter)); @@ -57,7 +54,6 @@ private int VerifyArgumentsAndRun(Arguments arguments) { if (HandleNonMainCommand(arguments, out var exitCode)) return exitCode; - gitPreparer.Prepare(); var variables = gitVersionCalculator.CalculateVersionVariables(); execCommand.Execute(variables); } diff --git a/src/GitVersionTask.Tests/InvalidFileCheckerTests.cs b/src/GitVersionTask.Tests/InvalidFileCheckerTests.cs index fe41e6a00d..f3d0756119 100644 --- a/src/GitVersionTask.Tests/InvalidFileCheckerTests.cs +++ b/src/GitVersionTask.Tests/InvalidFileCheckerTests.cs @@ -1,6 +1,5 @@ using System; using System.IO; -using GitVersion.Exceptions; using GitVersion.MSBuildTask.Tests.Mocks; using GitVersionCore.Tests.Helpers; using Microsoft.Build.Framework; diff --git a/src/GitVersionTask/FileHelper.cs b/src/GitVersionTask/FileHelper.cs index eb9c754e50..a68db3ab10 100644 --- a/src/GitVersionTask/FileHelper.cs +++ b/src/GitVersionTask/FileHelper.cs @@ -3,7 +3,6 @@ using System.IO; using System.Linq; using System.Text.RegularExpressions; -using GitVersion.Exceptions; using Microsoft.Build.Framework; namespace GitVersion.MSBuildTask diff --git a/src/GitVersionTask/GitVersionTaskExecutor.cs b/src/GitVersionTask/GitVersionTaskExecutor.cs index 26a4ad5d30..79deb97ea6 100644 --- a/src/GitVersionTask/GitVersionTaskExecutor.cs +++ b/src/GitVersionTask/GitVersionTaskExecutor.cs @@ -15,12 +15,11 @@ public class GitVersionTaskExecutor : IGitVersionTaskExecutor private readonly IBuildServerResolver buildServerResolver; private VersionVariables versionVariables; - public GitVersionTaskExecutor(IFileSystem fileSystem, ILog log, IBuildServerResolver buildServerResolver, IGitVersionCalculator gitVersionCalculator, IGitPreparer preparer) + public GitVersionTaskExecutor(IFileSystem fileSystem, ILog log, IBuildServerResolver buildServerResolver, IGitVersionCalculator gitVersionCalculator) { this.fileSystem = fileSystem ?? throw new ArgumentNullException(nameof(fileSystem)); this.log = log ?? throw new ArgumentNullException(nameof(log)); this.buildServerResolver = buildServerResolver ?? throw new ArgumentNullException(nameof(buildServerResolver)); - preparer.Prepare(); versionVariables = gitVersionCalculator.CalculateVersionVariables(); } diff --git a/src/GitVersionTask/GitVersionTasks.cs b/src/GitVersionTask/GitVersionTasks.cs index 59bf8208d6..7243e36901 100644 --- a/src/GitVersionTask/GitVersionTasks.cs +++ b/src/GitVersionTask/GitVersionTasks.cs @@ -1,5 +1,4 @@ using System; -using GitVersion.Exceptions; using GitVersion.Extensions; using GitVersion.Logging; using GitVersion.MSBuildTask.Tasks;