diff --git a/src/GitVersion.App.Tests/PullRequestInBuildAgentTest.cs b/src/GitVersion.App.Tests/PullRequestInBuildAgentTest.cs index 63ed34f305..590e046499 100644 --- a/src/GitVersion.App.Tests/PullRequestInBuildAgentTest.cs +++ b/src/GitVersion.App.Tests/PullRequestInBuildAgentTest.cs @@ -163,7 +163,7 @@ private static async Task VerifyPullRequestVersionIsCalculatedProperly(string pu remoteRepository.Refs.Add(pullRequestRef, new ObjectId(mergeCommitSha)); // Checkout PR commit - Commands.Fetch((Repository)fixture.Repository, "origin", Array.Empty(), new FetchOptions(), null); + Commands.Fetch(fixture.Repository, "origin", Array.Empty(), new FetchOptions(), null); Commands.Checkout(fixture.Repository, mergeCommitSha); } @@ -199,7 +199,7 @@ public void VerifyPullRequestInput(string pullRequestRef, string friendly, bool var refName = new ReferenceName(pullRequestRef); Assert.AreEqual(friendly, refName.Friendly); - Assert.AreEqual(isBranch, refName.IsBranch); + Assert.AreEqual(isBranch, refName.IsLocalBranch); Assert.AreEqual(isPullRequest, refName.IsPullRequest); Assert.AreEqual(isRemote, refName.IsRemoteBranch); } diff --git a/src/GitVersion.App.Tests/TagCheckoutInBuildAgentTests.cs b/src/GitVersion.App.Tests/TagCheckoutInBuildAgentTests.cs index 6b7de3e013..b66dab1f9b 100644 --- a/src/GitVersion.App.Tests/TagCheckoutInBuildAgentTests.cs +++ b/src/GitVersion.App.Tests/TagCheckoutInBuildAgentTests.cs @@ -51,7 +51,7 @@ private static async Task VerifyTagCheckoutVersionIsCalculatedProperly(Dictionar remoteRepository.MergeNoFF("release/0.2.0", Generate.SignatureNow()); remoteRepository.MakeATaggedCommit("0.2.0"); - Commands.Fetch((Repository)fixture.Repository, "origin", Array.Empty(), new FetchOptions(), null); + Commands.Fetch(fixture.Repository, "origin", Array.Empty(), new FetchOptions(), null); Commands.Checkout(fixture.Repository, "0.2.0"); } diff --git a/src/GitVersion.Core.Tests/Configuration/ConfigurationExtensionsTests.cs b/src/GitVersion.Core.Tests/Configuration/ConfigurationExtensionsTests.cs index a245d9e578..e2d8d3f519 100644 --- a/src/GitVersion.Core.Tests/Configuration/ConfigurationExtensionsTests.cs +++ b/src/GitVersion.Core.Tests/Configuration/ConfigurationExtensionsTests.cs @@ -24,4 +24,37 @@ public void GetReleaseBranchConfigReturnsAllReleaseBranches() result.Count.ShouldBe(2); result.ShouldNotContain(b => b.Key == "foo"); } + + [TestCase("release/2.0.0", + "refs/heads/release/2.0.0", "release/2.0.0", "release/2.0.0", + true, false, false, false, true)] + [TestCase("upstream/release/2.0.0", + "refs/heads/upstream/release/2.0.0", "upstream/release/2.0.0", "upstream/release/2.0.0", + true, false, false, false, false)] + [TestCase("origin/release/2.0.0", + "refs/heads/origin/release/2.0.0", "origin/release/2.0.0", "origin/release/2.0.0", + true, false, false, false, false)] + [TestCase("refs/remotes/upstream/release/2.0.0", + "refs/remotes/upstream/release/2.0.0", "upstream/release/2.0.0", "upstream/release/2.0.0", + false, false, true, false, false)] + [TestCase("refs/remotes/origin/release/2.0.0", + "refs/remotes/origin/release/2.0.0", "origin/release/2.0.0", "release/2.0.0", + false, false, true, false, true)] + public void EnsureIsReleaseBranchWithReferenceNameWorksAsExpected(string branchName, string expectedCanonical, string expectedFriendly, string expectedWithoutRemote, + bool expectedIsLocalBranch, bool expectedIsPullRequest, bool expectedIsRemoteBranch, bool expectedIsTag, bool expectedIsReleaseBranch) + { + var configuration = GitFlowConfigurationBuilder.New.Build(); + + var actual = ReferenceName.FromBranchName(branchName); + var isReleaseBranch = configuration.IsReleaseBranch(actual); + + actual.Canonical.ShouldBe(expectedCanonical); + actual.Friendly.ShouldBe(expectedFriendly); + actual.WithoutRemote.ShouldBe(expectedWithoutRemote); + actual.IsLocalBranch.ShouldBe(expectedIsLocalBranch); + actual.IsPullRequest.ShouldBe(expectedIsPullRequest); + actual.IsRemoteBranch.ShouldBe(expectedIsRemoteBranch); + actual.IsTag.ShouldBe(expectedIsTag); + isReleaseBranch.ShouldBe(expectedIsReleaseBranch); + } } diff --git a/src/GitVersion.Core.Tests/Core/RepositoryStoreTests.cs b/src/GitVersion.Core.Tests/Core/RepositoryStoreTests.cs index fc5b9c62a7..717434b849 100644 --- a/src/GitVersion.Core.Tests/Core/RepositoryStoreTests.cs +++ b/src/GitVersion.Core.Tests/Core/RepositoryStoreTests.cs @@ -225,9 +225,12 @@ public void FindCommitBranchWasBranchedFromShouldReturnNullIfTheRemoteIsTheOnlyS var branch = localRepository.FindBranch("main"); branch.ShouldNotBeNull(); - var branchedCommit = gitRepoMetadataProvider.FindCommitBranchWasBranchedFrom(branch, new GitVersionConfiguration(), Array.Empty()); - Assert.IsNull(branchedCommit.Branch); - Assert.IsNull(branchedCommit.Commit); + var configuration = GitFlowConfigurationBuilder.New.Build(); + var branchedCommit = gitRepoMetadataProvider.FindCommitBranchWasBranchedFrom(branch, configuration, Array.Empty()); + branchedCommit.ShouldBe(BranchCommit.Empty); + + var branchedCommits = gitRepoMetadataProvider.FindCommitBranchesWasBranchedFrom(branch, configuration).ToArray(); + branchedCommits.ShouldBeEmpty(); } } diff --git a/src/GitVersion.Core.Tests/Extensions/GitToolsTestingExtensions.cs b/src/GitVersion.Core.Tests/Extensions/GitToolsTestingExtensions.cs index f36230507a..a0748dbfea 100644 --- a/src/GitVersion.Core.Tests/Extensions/GitToolsTestingExtensions.cs +++ b/src/GitVersion.Core.Tests/Extensions/GitToolsTestingExtensions.cs @@ -45,7 +45,9 @@ public static IBranch CreateMockBranch(string name, params ICommit[] commits) return branch; } - public static IBranch FindBranch(this IGitRepository repository, string branchName) => repository.Branches.First(x => x.Name.WithoutRemote == branchName) ?? throw new GitVersionException($"Branch {branchName} not found"); + public static IBranch FindBranch(this IGitRepository repository, string branchName) + => repository.Branches.FirstOrDefault(branch => branch.Name.WithoutRemote == branchName) + ?? throw new GitVersionException($"Branch {branchName} not found"); public static void DumpGraph(this IGitRepository repository, Action? writer = null, int? maxCommits = null) => GitExtensions.DumpGraph(repository.Path, writer, maxCommits); diff --git a/src/GitVersion.Core.Tests/Helpers/TestBase.cs b/src/GitVersion.Core.Tests/Helpers/TestBase.cs index 2a7028edc9..ff7d695671 100644 --- a/src/GitVersion.Core.Tests/Helpers/TestBase.cs +++ b/src/GitVersion.Core.Tests/Helpers/TestBase.cs @@ -18,13 +18,14 @@ protected static IServiceProvider ConfigureServices(Action? return services.BuildServiceProvider(); } - protected static IServiceProvider BuildServiceProvider(string workingDirectory, IGitRepository repository, string branch, IReadOnlyDictionary? configuration = null) + protected static IServiceProvider BuildServiceProvider(IGitRepository repository, + string? targetBranch = null, IReadOnlyDictionary? configuration = null) { var options = Options.Create(new GitVersionOptions { - WorkingDirectory = workingDirectory, + WorkingDirectory = repository.Path, ConfigurationInfo = { OverrideConfiguration = configuration }, - RepositoryInfo = { TargetBranch = branch } + RepositoryInfo = { TargetBranch = targetBranch } }); var sp = ConfigureServices(services => diff --git a/src/GitVersion.Core.Tests/IntegrationTests/OtherScenarios.cs b/src/GitVersion.Core.Tests/IntegrationTests/OtherScenarios.cs index 608b0e3865..e4f7104485 100644 --- a/src/GitVersion.Core.Tests/IntegrationTests/OtherScenarios.cs +++ b/src/GitVersion.Core.Tests/IntegrationTests/OtherScenarios.cs @@ -21,7 +21,7 @@ public void DoNotBlowUpWhenMainAndDevelopPointAtSameCommit() fixture.MakeACommit(); fixture.Repository.CreateBranch("develop"); - Commands.Fetch((Repository)fixture.LocalRepositoryFixture.Repository, fixture.LocalRepositoryFixture.Repository.Network.Remotes.First().Name, Array.Empty(), new FetchOptions(), null); + Commands.Fetch(fixture.LocalRepositoryFixture.Repository, fixture.LocalRepositoryFixture.Repository.Network.Remotes.First().Name, Array.Empty(), new FetchOptions(), null); Commands.Checkout(fixture.LocalRepositoryFixture.Repository, fixture.Repository.Head.Tip); fixture.LocalRepositoryFixture.Repository.Branches.Remove(MainBranch); fixture.InitializeRepo(); @@ -87,7 +87,7 @@ public void DoNotBlowUpWhenDevelopAndFeatureBranchPointAtSameCommit() fixture.MakeACommit(); fixture.Repository.CreateBranch("feature/someFeature"); - Commands.Fetch((Repository)fixture.LocalRepositoryFixture.Repository, fixture.LocalRepositoryFixture.Repository.Network.Remotes.First().Name, Array.Empty(), new FetchOptions(), null); + Commands.Fetch(fixture.LocalRepositoryFixture.Repository, fixture.LocalRepositoryFixture.Repository.Network.Remotes.First().Name, Array.Empty(), new FetchOptions(), null); Commands.Checkout(fixture.LocalRepositoryFixture.Repository, fixture.Repository.Head.Tip); fixture.LocalRepositoryFixture.Repository.Branches.Remove(MainBranch); fixture.InitializeRepo(); diff --git a/src/GitVersion.Core.Tests/IntegrationTests/RemoteRepositoryScenarios.cs b/src/GitVersion.Core.Tests/IntegrationTests/RemoteRepositoryScenarios.cs index 1a1a89d372..21f2dd8a39 100644 --- a/src/GitVersion.Core.Tests/IntegrationTests/RemoteRepositoryScenarios.cs +++ b/src/GitVersion.Core.Tests/IntegrationTests/RemoteRepositoryScenarios.cs @@ -79,7 +79,7 @@ public void GivenARemoteGitRepositoryAheadOfLocalRepositoryThenChangesShouldPull fixture.AssertFullSemver("0.0.1+6"); fixture.AssertFullSemver("0.0.1+5", repository: fixture.LocalRepositoryFixture.Repository); var buildSignature = fixture.LocalRepositoryFixture.Repository.Config.BuildSignature(new DateTimeOffset(DateTime.Now)); - Commands.Pull((Repository)fixture.LocalRepositoryFixture.Repository, buildSignature, new PullOptions()); + Commands.Pull(fixture.LocalRepositoryFixture.Repository, buildSignature, new PullOptions()); fixture.AssertFullSemver("0.0.1+6", repository: fixture.LocalRepositoryFixture.Repository); } @@ -135,4 +135,22 @@ private static void CopyRemoteBranchesToHeads(IRepository repository) } } } + + [TestCase("origin", "release-2.0.0", "2.1.0-alpha.0")] + [TestCase("custom", "release-2.0.0", "0.1.0-alpha.5")] + [TestCase("origin", "release/3.0.0", "3.1.0-alpha.0")] + [TestCase("custom", "release/3.0.0", "0.1.0-alpha.5")] + public void EnsureRemoteReleaseBranchesAreTracked(string origin, string branchName, string expectedVersion) + { + using var fixture = new RemoteRepositoryFixture("develop"); + + fixture.CreateBranch(branchName); + fixture.MakeACommit(); + + if (origin != "origin") fixture.LocalRepositoryFixture.Repository.Network.Remotes.Rename("origin", origin); + fixture.LocalRepositoryFixture.Fetch(origin); + fixture.LocalRepositoryFixture.Checkout("develop"); + + fixture.LocalRepositoryFixture.AssertFullSemver(expectedVersion); + } } diff --git a/src/GitVersion.Core.Tests/IntegrationTests/VersionInCurrentBranchNameScenarios.cs b/src/GitVersion.Core.Tests/IntegrationTests/VersionInCurrentBranchNameScenarios.cs index c29ac66e85..1944952d6e 100644 --- a/src/GitVersion.Core.Tests/IntegrationTests/VersionInCurrentBranchNameScenarios.cs +++ b/src/GitVersion.Core.Tests/IntegrationTests/VersionInCurrentBranchNameScenarios.cs @@ -44,7 +44,7 @@ public void TakesVersionFromNameOfRemoteReleaseBranchInOrigin() using var fixture = new RemoteRepositoryFixture(); fixture.BranchTo("release/2.0.0"); fixture.MakeACommit(); - Commands.Fetch((Repository)fixture.LocalRepositoryFixture.Repository, fixture.LocalRepositoryFixture.Repository.Network.Remotes.First().Name, Array.Empty(), new FetchOptions(), null); + Commands.Fetch(fixture.LocalRepositoryFixture.Repository, fixture.LocalRepositoryFixture.Repository.Network.Remotes.First().Name, Array.Empty(), new FetchOptions(), null); fixture.LocalRepositoryFixture.Checkout("origin/release/2.0.0"); @@ -52,16 +52,16 @@ public void TakesVersionFromNameOfRemoteReleaseBranchInOrigin() } [Test] - public void TakesVersionFromNameOfRemoteReleaseBranchInCustom() + public void DoesNotTakeVersionFromNameOfRemoteReleaseBranchInCustomRemote() { using var fixture = new RemoteRepositoryFixture(); fixture.LocalRepositoryFixture.Repository.Network.Remotes.Rename("origin", "upstream"); fixture.BranchTo("release/2.0.0"); fixture.MakeACommit(); - Commands.Fetch((Repository)fixture.LocalRepositoryFixture.Repository, fixture.LocalRepositoryFixture.Repository.Network.Remotes.First().Name, Array.Empty(), new FetchOptions(), null); + Commands.Fetch(fixture.LocalRepositoryFixture.Repository, fixture.LocalRepositoryFixture.Repository.Network.Remotes.First().Name, Array.Empty(), new FetchOptions(), null); fixture.LocalRepositoryFixture.Checkout("upstream/release/2.0.0"); - fixture.LocalRepositoryFixture.AssertFullSemver("2.0.0-beta.1+1"); + fixture.LocalRepositoryFixture.AssertFullSemver("0.0.1-upstream-release-2-0-0.1+6"); } } diff --git a/src/GitVersion.Core.Tests/IntegrationTests/VersionInMergedBranchNameScenarios.cs b/src/GitVersion.Core.Tests/IntegrationTests/VersionInMergedBranchNameScenarios.cs index e700c67038..63e297e7bd 100644 --- a/src/GitVersion.Core.Tests/IntegrationTests/VersionInMergedBranchNameScenarios.cs +++ b/src/GitVersion.Core.Tests/IntegrationTests/VersionInMergedBranchNameScenarios.cs @@ -45,7 +45,7 @@ public void TakesVersionFromNameOfRemoteReleaseBranchInOrigin() using var fixture = new RemoteRepositoryFixture(); fixture.BranchTo("release/2.0.0"); fixture.MakeACommit(); - Commands.Fetch((Repository)fixture.LocalRepositoryFixture.Repository, fixture.LocalRepositoryFixture.Repository.Network.Remotes.First().Name, Array.Empty(), new FetchOptions(), null); + Commands.Fetch(fixture.LocalRepositoryFixture.Repository, fixture.LocalRepositoryFixture.Repository.Network.Remotes.First().Name, Array.Empty(), new FetchOptions(), null); fixture.LocalRepositoryFixture.MergeNoFF("origin/release/2.0.0"); @@ -59,7 +59,7 @@ public void DoesNotTakeVersionFromNameOfRemoteReleaseBranchInCustomRemote() fixture.LocalRepositoryFixture.Repository.Network.Remotes.Rename("origin", "upstream"); fixture.BranchTo("release/2.0.0"); fixture.MakeACommit(); - Commands.Fetch((Repository)fixture.LocalRepositoryFixture.Repository, fixture.LocalRepositoryFixture.Repository.Network.Remotes.First().Name, Array.Empty(), new FetchOptions(), null); + fixture.LocalRepositoryFixture.Fetch("upstream"); fixture.LocalRepositoryFixture.MergeNoFF("upstream/release/2.0.0"); diff --git a/src/GitVersion.Core.Tests/VersionCalculation/Strategies/VersionInBranchNameBaseVersionStrategyTests.cs b/src/GitVersion.Core.Tests/VersionCalculation/Strategies/VersionInBranchNameBaseVersionStrategyTests.cs index 0994fba50a..f0f2d9db30 100644 --- a/src/GitVersion.Core.Tests/VersionCalculation/Strategies/VersionInBranchNameBaseVersionStrategyTests.cs +++ b/src/GitVersion.Core.Tests/VersionCalculation/Strategies/VersionInBranchNameBaseVersionStrategyTests.cs @@ -2,7 +2,6 @@ using GitVersion.Core.Tests.Helpers; using GitVersion.Extensions; using GitVersion.VersionCalculation; -using LibGit2Sharp; namespace GitVersion.Core.Tests.VersionCalculation.Strategies; @@ -14,97 +13,120 @@ public class VersionInBranchNameBaseVersionStrategyTests : TestBase public void CanTakeVersionFromNameOfReleaseBranch(string branchName, string expectedBaseVersion) { using var fixture = new EmptyRepositoryFixture(); - fixture.Repository.MakeACommit(); - fixture.Repository.CreateBranch(branchName); - var gitRepository = fixture.Repository.ToGitRepository(); - var strategy = GetVersionStrategy(fixture.RepositoryPath, gitRepository, branchName); + fixture.MakeACommit(); + fixture.CreateBranch(branchName); + + var repository = fixture.Repository.ToGitRepository(); + + var strategy = GetVersionStrategy(repository); + var branch = repository.FindBranch(branchName); + var configuration = GitFlowConfigurationBuilder.New.Build(); - var branchConfiguration = configuration.GetBranchConfiguration(branchName); + var branchConfiguration = configuration.GetBranchConfiguration(branch); var effectiveConfiguration = new EffectiveConfiguration(configuration, branchConfiguration); + var effectiveBranchConfiguration = new EffectiveBranchConfiguration(branch, effectiveConfiguration); strategy.ShouldNotBeNull(); - var baseVersion = strategy.GetBaseVersions(new(gitRepository.FindBranch(branchName), effectiveConfiguration)).Single(); + var baseVersion = strategy.GetBaseVersions(effectiveBranchConfiguration).Single(); baseVersion.SemanticVersion.ToString().ShouldBe(expectedBaseVersion); } [TestCase("hotfix-2.0.0")] + [TestCase("origin/hotfix-2.0.0")] + [TestCase("remotes/origin/hotfix-2.0.0")] [TestCase("hotfix/2.0.0")] + [TestCase("origin/hotfix/2.0.0")] + [TestCase("remotes/origin/hotfix/2.0.0")] [TestCase("custom/JIRA-123")] + [TestCase("remotes/custom/JIRA-123")] [TestCase("hotfix/downgrade-to-gitversion-3.6.5-to-fix-miscalculated-version")] + [TestCase("remotes/hotfix/downgrade-to-gitversion-3.6.5-to-fix-miscalculated-version")] public void ShouldNotTakeVersionFromNameOfNonReleaseBranch(string branchName) { using var fixture = new EmptyRepositoryFixture(); - fixture.Repository.MakeACommit(); - fixture.Repository.CreateBranch(branchName); - var gitRepository = fixture.Repository.ToGitRepository(); - var strategy = GetVersionStrategy(fixture.RepositoryPath, gitRepository, branchName); + fixture.MakeACommit(); + fixture.CreateBranch(branchName); + + var repository = fixture.Repository.ToGitRepository(); + + var strategy = GetVersionStrategy(repository); + var branch = repository.FindBranch(branchName); + var configuration = GitFlowConfigurationBuilder.New.Build(); - var branchConfiguration = configuration.GetBranchConfiguration(branchName); - branchConfiguration = branchConfiguration.Inherit(configuration.GetFallbackBranchConfiguration()); + var branchConfiguration = configuration.GetBranchConfiguration(branch); var effectiveConfiguration = new EffectiveConfiguration(configuration, branchConfiguration); + var effectiveBranchConfiguration = new EffectiveBranchConfiguration(branch, effectiveConfiguration); strategy.ShouldNotBeNull(); - var baseVersions = strategy.GetBaseVersions(new(gitRepository.FindBranch(branchName), effectiveConfiguration)); + var baseVersions = strategy.GetBaseVersions(effectiveBranchConfiguration); baseVersions.ShouldBeEmpty(); } + [TestCase("release-2.0.0", "2.0.0")] + [TestCase("release/3.0.0", "3.0.0")] [TestCase("support/lts-2.0.0", "2.0.0")] [TestCase("support-3.0.0-lts", "3.0.0")] public void CanTakeVersionFromNameOfConfiguredReleaseBranch(string branchName, string expectedBaseVersion) { using var fixture = new EmptyRepositoryFixture(); - fixture.Repository.MakeACommit(); - fixture.Repository.CreateBranch(branchName); + + fixture.MakeACommit(); + fixture.CreateBranch(branchName); + + var repository = fixture.Repository.ToGitRepository(); var configuration = GitFlowConfigurationBuilder.New .WithBranch("support", builder => builder.WithIsReleaseBranch(true)) .Build(); ConfigurationHelper configurationHelper = new(configuration); - var gitRepository = fixture.Repository.ToGitRepository(); - var strategy = GetVersionStrategy(fixture.RepositoryPath, gitRepository, branchName, configurationHelper.Dictionary); + var strategy = GetVersionStrategy(repository, null, configurationHelper.Dictionary); + var branch = repository.FindBranch(branchName); - var branchConfiguration = configuration.GetBranchConfiguration(branchName); + var branchConfiguration = configuration.GetBranchConfiguration(branch); var effectiveConfiguration = new EffectiveConfiguration(configuration, branchConfiguration); + var effectiveBranchConfiguration = new EffectiveBranchConfiguration(branch, effectiveConfiguration); strategy.ShouldNotBeNull(); - var baseVersion = strategy.GetBaseVersions(new(gitRepository.FindBranch(branchName), effectiveConfiguration)).Single(); + var baseVersion = strategy.GetBaseVersions(effectiveBranchConfiguration).Single(); baseVersion.SemanticVersion.ToString().ShouldBe(expectedBaseVersion); } - [TestCase("release-2.0.0", "2.0.0")] - [TestCase("release/3.0.0", "3.0.0")] - public void CanTakeVersionFromNameOfRemoteReleaseBranch(string branchName, string expectedBaseVersion) + [TestCase("origin", "release-2.0.0", "2.0.0")] + [TestCase("origin", "release/3.0.0", "3.0.0")] + public void CanTakeVersionFromNameOfRemoteReleaseBranch(string origin, string branchName, string expectedBaseVersion) { using var fixture = new RemoteRepositoryFixture(); - var branch = fixture.Repository.CreateBranch(branchName); - Commands.Checkout(fixture.Repository, branch); - fixture.MakeACommit(); - Commands.Fetch((Repository)fixture.LocalRepositoryFixture.Repository, fixture.LocalRepositoryFixture.Repository.Network.Remotes.First().Name, Array.Empty(), new FetchOptions(), null); - fixture.LocalRepositoryFixture.Checkout($"origin/{branchName}"); + fixture.CreateBranch(branchName); + if (origin != "origin") fixture.LocalRepositoryFixture.Repository.Network.Remotes.Rename("origin", origin); + fixture.LocalRepositoryFixture.Fetch(origin); + + var localRepository = fixture.LocalRepositoryFixture.Repository.ToGitRepository(); - var gitRepository = fixture.Repository.ToGitRepository(); - var strategy = GetVersionStrategy(fixture.RepositoryPath, gitRepository, branchName); + var strategy = GetVersionStrategy(localRepository); + var branch = localRepository.FindBranch(branchName); var configuration = GitFlowConfigurationBuilder.New.Build(); - var branchConfiguration = configuration.GetBranchConfiguration(branchName); + var branchConfiguration = configuration.GetBranchConfiguration(branch); var effectiveConfiguration = new EffectiveConfiguration(configuration, branchConfiguration); + var effectiveBranchConfiguration = new EffectiveBranchConfiguration(branch, effectiveConfiguration); strategy.ShouldNotBeNull(); - var baseVersion = strategy.GetBaseVersions(new(gitRepository.FindBranch(branchName), effectiveConfiguration)).Single(); + var baseVersion = strategy.GetBaseVersions(effectiveBranchConfiguration).Single(); baseVersion.SemanticVersion.ToString().ShouldBe(expectedBaseVersion); } - private static IVersionStrategy GetVersionStrategy(string workingDirectory, IGitRepository repository, string branch, IReadOnlyDictionary? overrideConfiguration = null) + private static IVersionStrategy GetVersionStrategy(IGitRepository repository, + string? targetBranch = null, IReadOnlyDictionary? overrideConfiguration = null) { - var sp = BuildServiceProvider(workingDirectory, repository, branch, overrideConfiguration); - return sp.GetServiceForType(); + var serviceProvider = BuildServiceProvider(repository, targetBranch, overrideConfiguration); + return serviceProvider.GetServiceForType(); } } diff --git a/src/GitVersion.Core.Tests/VersionCalculation/VersionSourceTests.cs b/src/GitVersion.Core.Tests/VersionCalculation/VersionSourceTests.cs index 9dd1f41fc6..8dbd3fdcca 100644 --- a/src/GitVersion.Core.Tests/VersionCalculation/VersionSourceTests.cs +++ b/src/GitVersion.Core.Tests/VersionCalculation/VersionSourceTests.cs @@ -1,6 +1,5 @@ using GitVersion.Core.Tests.Helpers; using GitVersion.VersionCalculation; -using LibGit2Sharp; using Microsoft.Extensions.DependencyInjection; namespace GitVersion.Core.Tests; @@ -12,14 +11,14 @@ public class VersionSourceTests : TestBase public void VersionSourceSha() { using var fixture = new EmptyRepositoryFixture(); - _ = fixture.Repository.MakeACommit(); - Commands.Checkout(fixture.Repository, fixture.Repository.CreateBranch("develop")); - _ = fixture.Repository.MakeACommit(); - var featureBranch = fixture.Repository.CreateBranch("feature/foo"); - Commands.Checkout(fixture.Repository, featureBranch); - _ = fixture.Repository.MakeACommit(); - var nextVersionCalculator = GetNextVersionCalculator(fixture); + fixture.MakeACommit(); + fixture.BranchTo("develop"); + fixture.MakeACommit(); + fixture.BranchTo("feature/foo"); + fixture.MakeACommit(); + + var nextVersionCalculator = GetNextVersionCalculator(fixture.Repository.ToGitRepository()); var nextVersion = nextVersionCalculator.FindVersion(); @@ -31,9 +30,10 @@ public void VersionSourceSha() public void VersionSourceShaOneCommit() { using var fixture = new EmptyRepositoryFixture(); - _ = fixture.Repository.MakeACommit(); - var nextVersionCalculator = GetNextVersionCalculator(fixture); + fixture.MakeACommit(); + + var nextVersionCalculator = GetNextVersionCalculator(fixture.Repository.ToGitRepository()); var nextVersion = nextVersionCalculator.FindVersion(); @@ -45,25 +45,24 @@ public void VersionSourceShaOneCommit() public void VersionSourceShaUsingTag() { using var fixture = new EmptyRepositoryFixture(); - _ = fixture.Repository.MakeACommit(); - Commands.Checkout(fixture.Repository, fixture.Repository.CreateBranch("develop")); - var secondCommit = fixture.Repository.MakeACommit(); - _ = fixture.Repository.Tags.Add("1.0.0", secondCommit); - var featureBranch = fixture.Repository.CreateBranch("feature/foo"); - Commands.Checkout(fixture.Repository, featureBranch); - _ = fixture.Repository.MakeACommit(); - var nextVersionCalculator = GetNextVersionCalculator(fixture); + fixture.MakeACommit(); + fixture.BranchTo("develop"); + var secondCommitSha = fixture.MakeATaggedCommit("1.0.0"); + fixture.BranchTo("feature/foo"); + fixture.MakeACommit(); + + var nextVersionCalculator = GetNextVersionCalculator(fixture.Repository.ToGitRepository()); var nextVersion = nextVersionCalculator.FindVersion(); - nextVersion.IncrementedVersion.BuildMetaData.VersionSourceSha.ShouldBe(secondCommit.Sha); + nextVersion.IncrementedVersion.BuildMetaData.VersionSourceSha.ShouldBe(secondCommitSha); nextVersion.IncrementedVersion.BuildMetaData.CommitsSinceVersionSource.ShouldBe(1); } - private static INextVersionCalculator GetNextVersionCalculator(RepositoryFixtureBase fixture) + private static INextVersionCalculator GetNextVersionCalculator(IGitRepository repository) { - var sp = BuildServiceProvider(fixture.RepositoryPath, fixture.Repository.ToGitRepository(), fixture.Repository.Head.CanonicalName); - return sp.GetRequiredService(); + var serviceProvider = BuildServiceProvider(repository); + return serviceProvider.GetRequiredService(); } } diff --git a/src/GitVersion.Core/BranchCommit.cs b/src/GitVersion.Core/BranchCommit.cs index 6b90f2fd30..40a068ecc0 100644 --- a/src/GitVersion.Core/BranchCommit.cs +++ b/src/GitVersion.Core/BranchCommit.cs @@ -5,6 +5,7 @@ namespace GitVersion; /// /// A commit, together with the branch to which the commit belongs. /// +[DebuggerDisplay("{Branch} {Commit}")] public readonly struct BranchCommit : IEquatable { public static readonly BranchCommit Empty = new(); diff --git a/src/GitVersion.Core/Configuration/ConfigurationExtensions.cs b/src/GitVersion.Core/Configuration/ConfigurationExtensions.cs index 13650c0376..441f97b34b 100644 --- a/src/GitVersion.Core/Configuration/ConfigurationExtensions.cs +++ b/src/GitVersion.Core/Configuration/ConfigurationExtensions.cs @@ -7,23 +7,23 @@ namespace GitVersion.Configuration; public static class ConfigurationExtensions { public static EffectiveConfiguration GetEffectiveConfiguration(this GitVersionConfiguration configuration, IBranch branch) - => GetEffectiveConfiguration(configuration, branch.NotNull().Name.WithoutRemote); + => GetEffectiveConfiguration(configuration, branch.NotNull().Name); - public static EffectiveConfiguration GetEffectiveConfiguration(this GitVersionConfiguration configuration, string branchName) + public static EffectiveConfiguration GetEffectiveConfiguration(this GitVersionConfiguration configuration, ReferenceName branchName) { BranchConfiguration branchConfiguration = configuration.GetBranchConfiguration(branchName); return new EffectiveConfiguration(configuration, branchConfiguration); } public static BranchConfiguration GetBranchConfiguration(this GitVersionConfiguration configuration, IBranch branch) - => GetBranchConfiguration(configuration, branch.NotNull().Name.WithoutRemote); + => GetBranchConfiguration(configuration, branch.NotNull().Name); - public static BranchConfiguration GetBranchConfiguration(this GitVersionConfiguration configuration, string branchName) + public static BranchConfiguration GetBranchConfiguration(this GitVersionConfiguration configuration, ReferenceName branchName) { - var branchConfiguration = GetBranchConfigurations(configuration, branchName).FirstOrDefault(); + var branchConfiguration = GetBranchConfigurations(configuration, branchName.WithoutRemote).FirstOrDefault(); branchConfiguration ??= new() { - Name = branchName, + Name = branchName.WithoutRemote, Regex = string.Empty, Label = ConfigurationConstants.BranchNamePlaceholder, Increment = IncrementStrategy.Inherit @@ -34,7 +34,7 @@ public static BranchConfiguration GetBranchConfiguration(this GitVersionConfigur private static IEnumerable GetBranchConfigurations(GitVersionConfiguration configuration, string branchName) { BranchConfiguration? unknownBranchConfiguration = null; - foreach (var item in configuration.Branches.Values.Where(b => b.Regex != null)) + foreach (var item in configuration.Branches.Values.Where(branch => branch.Regex != null)) { if (item.Regex != null && Regex.IsMatch(branchName, item.Regex, RegexOptions.IgnoreCase)) { @@ -57,7 +57,11 @@ public static BranchConfiguration GetFallbackBranchConfiguration(this GitVersion return result; } - public static bool IsReleaseBranch(this GitVersionConfiguration configuration, string branchName) => configuration.GetBranchConfiguration(branchName).IsReleaseBranch ?? false; + public static bool IsReleaseBranch(this GitVersionConfiguration configuration, IBranch branch) + => IsReleaseBranch(configuration, branch.NotNull().Name); + + public static bool IsReleaseBranch(this GitVersionConfiguration configuration, ReferenceName branchName) + => configuration.GetBranchConfiguration(branchName).IsReleaseBranch ?? false; public static string GetBranchSpecificTag(this EffectiveConfiguration configuration, ILog log, string? branchFriendlyName, string? branchNameOverride) { diff --git a/src/GitVersion.Core/Core/RepositoryStore.cs b/src/GitVersion.Core/Core/RepositoryStore.cs index f74572d7f9..c453202c70 100644 --- a/src/GitVersion.Core/Core/RepositoryStore.cs +++ b/src/GitVersion.Core/Core/RepositoryStore.cs @@ -115,7 +115,7 @@ public IBranch GetTargetBranch(string? targetBranchName) } return this.repository.Branches.FirstOrDefault(b => - Regex.IsMatch(b.Name.Friendly, mainBranchRegex, RegexOptions.IgnoreCase)); + Regex.IsMatch(b.Name.WithoutRemote, mainBranchRegex, RegexOptions.IgnoreCase)); } public IEnumerable FindMainlineBranches(GitVersionConfiguration configuration) @@ -135,6 +135,9 @@ public IEnumerable FindMainlineBranches(GitVersionConfiguration configu public IEnumerable GetReleaseBranches(IEnumerable> releaseBranchConfig) => this.repository.Branches.Where(b => IsReleaseBranch(b, releaseBranchConfig)); + private static bool IsReleaseBranch(INamedReference branch, IEnumerable> releaseBranchConfig) + => releaseBranchConfig.Any(c => c.Value.Regex != null && Regex.IsMatch(branch.Name.WithoutRemote, c.Value.Regex)); + public IEnumerable ExcludingBranches(IEnumerable branchesToExclude) => this.repository.Branches.ExcludeBranches(branchesToExclude); public IEnumerable GetBranchesContainingCommit(ICommit? commit, IEnumerable? branches = null, bool onlyTrackedBranches = false) @@ -296,9 +299,6 @@ public bool IsCommitOnBranch(ICommit? baseVersionSource, IBranch branch, ICommit public int GetNumberOfUncommittedChanges() => this.repository.GetNumberOfUncommittedChanges(); - private static bool IsReleaseBranch(INamedReference branch, IEnumerable> releaseBranchConfig) - => releaseBranchConfig.Any(c => c.Value.Regex != null && Regex.IsMatch(branch.Name.Friendly, c.Value.Regex)); - private IEnumerable GetCurrentCommitSemanticVersions(ICommit? commit, string? tagPrefix, ITag tag, SemanticVersionFormat versionFormat, bool handleDetachedBranch) { if (commit == null) diff --git a/src/GitVersion.Core/Core/SourceBranchFinder.cs b/src/GitVersion.Core/Core/SourceBranchFinder.cs index 83754ec9f1..99adf8ecf1 100644 --- a/src/GitVersion.Core/Core/SourceBranchFinder.cs +++ b/src/GitVersion.Core/Core/SourceBranchFinder.cs @@ -37,16 +37,14 @@ public bool IsSourceBranch(INamedReference sourceBranchCandidate) if (Equals(sourceBranchCandidate, this.branch)) return false; - var branchName = sourceBranchCandidate.Name.Friendly; + var branchName = sourceBranchCandidate.Name.WithoutRemote; - return this.sourceBranchRegexes - .Any(regex => Regex.IsMatch(branchName, regex)); + return this.sourceBranchRegexes.Any(regex => Regex.IsMatch(branchName, regex)); } private static IEnumerable GetSourceBranchRegexes(INamedReference branch, GitVersionConfiguration configuration) { - var branchName = branch.Name.WithoutRemote; - var currentBranchConfig = configuration.GetBranchConfiguration(branchName); + var currentBranchConfig = configuration.GetBranchConfiguration(branch.Name); if (currentBranchConfig.SourceBranches == null) { yield return ".*"; diff --git a/src/GitVersion.Core/Git/ReferenceName.cs b/src/GitVersion.Core/Git/ReferenceName.cs index b504c4a8a3..ccb33a48aa 100644 --- a/src/GitVersion.Core/Git/ReferenceName.cs +++ b/src/GitVersion.Core/Git/ReferenceName.cs @@ -1,3 +1,4 @@ +using System.Diagnostics.CodeAnalysis; using GitVersion.Extensions; using GitVersion.Helpers; @@ -8,9 +9,11 @@ public class ReferenceName : IEquatable, IComparable equalityHelper = new(x => x.Canonical); private static readonly LambdaKeyComparer comparerHelper = new(x => x.Canonical); - private const string LocalBranchPrefix = "refs/heads/"; - private const string RemoteTrackingBranchPrefix = "refs/remotes/"; - private const string TagPrefix = "refs/tags/"; + public const string LocalBranchPrefix = "refs/heads/"; + public const string RemoteTrackingBranchPrefix = "refs/remotes/"; + public const string TagPrefix = "refs/tags/"; + public const string RemotePrefix = "origin/"; + private static readonly string[] PullRequestPrefixes = { "refs/pull/", @@ -23,7 +26,7 @@ public ReferenceName(string canonical) { Canonical = canonical.NotNull(); - IsBranch = IsPrefixedBy(Canonical, LocalBranchPrefix); + IsLocalBranch = IsPrefixedBy(Canonical, LocalBranchPrefix); IsRemoteBranch = IsPrefixedBy(Canonical, RemoteTrackingBranchPrefix); IsTag = IsPrefixedBy(Canonical, TagPrefix); IsPullRequest = IsPrefixedBy(Canonical, PullRequestPrefixes); @@ -34,23 +37,35 @@ public ReferenceName(string canonical) public static ReferenceName Parse(string canonicalName) { + if (TryParse(out ReferenceName? value, canonicalName)) return value; + throw new ArgumentException($"The {nameof(canonicalName)} is not a Canonical name"); + } + + public static bool TryParse([NotNullWhen(true)] out ReferenceName? value, string canonicalName) + { + value = null; + if (IsPrefixedBy(canonicalName, LocalBranchPrefix) || IsPrefixedBy(canonicalName, RemoteTrackingBranchPrefix) || IsPrefixedBy(canonicalName, TagPrefix) || IsPrefixedBy(canonicalName, PullRequestPrefixes)) { - return new ReferenceName(canonicalName); + value = new ReferenceName(canonicalName); } - throw new ArgumentException($"The {nameof(canonicalName)} is not a Canonical name"); + return value != null; } - public static ReferenceName FromBranchName(string branchName) => Parse(LocalBranchPrefix + branchName); + public static ReferenceName FromBranchName(string branchName) + { + if (TryParse(out ReferenceName? value, branchName)) return value; + return Parse(LocalBranchPrefix + branchName); + } public string Canonical { get; } public string Friendly { get; } public string WithoutRemote { get; } - public bool IsBranch { get; } + public bool IsLocalBranch { get; } public bool IsRemoteBranch { get; } public bool IsTag { get; } public bool IsPullRequest { get; } @@ -68,7 +83,7 @@ public bool EquivalentTo(string? name) => private string Shorten() { - if (IsBranch) + if (IsLocalBranch) return Canonical.Substring(LocalBranchPrefix.Length); if (IsRemoteBranch) @@ -82,12 +97,10 @@ private string Shorten() private string RemoveRemote() { - if (IsRemoteBranch) + if (IsRemoteBranch && !IsPullRequest && Friendly.StartsWith(RemotePrefix, StringComparison.Ordinal)) { - if (!IsPullRequest) - return Friendly.Substring(Friendly.IndexOf("/", StringComparison.Ordinal) + 1); + return Friendly.Substring(RemotePrefix.Length); } - return Friendly; } diff --git a/src/GitVersion.Core/MergeMessage.cs b/src/GitVersion.Core/MergeMessage.cs index 4068f5ff11..9a3f26dc61 100644 --- a/src/GitVersion.Core/MergeMessage.cs +++ b/src/GitVersion.Core/MergeMessage.cs @@ -89,4 +89,14 @@ public MergeMessageFormat(string name, string pattern) public Regex Pattern { get; } } + + public ReferenceName GetMergedBranchName() + { + var mergedBranch = MergedBranch; + if (FormatName == "RemoteTracking" && !mergedBranch.StartsWith(ReferenceName.RemoteTrackingBranchPrefix)) + { + mergedBranch = $"{ReferenceName.RemoteTrackingBranchPrefix}{mergedBranch}"; + } + return ReferenceName.FromBranchName(mergedBranch); + } } diff --git a/src/GitVersion.Core/PublicAPI.Unshipped.txt b/src/GitVersion.Core/PublicAPI.Unshipped.txt index 4f6be2af5c..ee86d3fbf5 100644 --- a/src/GitVersion.Core/PublicAPI.Unshipped.txt +++ b/src/GitVersion.Core/PublicAPI.Unshipped.txt @@ -1,4 +1,8 @@ #nullable enable +const GitVersion.ReferenceName.LocalBranchPrefix = "refs/heads/" -> string! +const GitVersion.ReferenceName.RemotePrefix = "origin/" -> string! +const GitVersion.ReferenceName.RemoteTrackingBranchPrefix = "refs/remotes/" -> string! +const GitVersion.ReferenceName.TagPrefix = "refs/tags/" -> string! GitVersion.Agents.BuildAgentBase GitVersion.Agents.BuildAgentBase.BuildAgentBase(GitVersion.IEnvironment! environment, GitVersion.Logging.ILog! log) -> void GitVersion.Agents.BuildAgentBase.Environment.get -> GitVersion.IEnvironment! @@ -608,6 +612,7 @@ GitVersion.Logging.Verbosity.Quiet = 0 -> GitVersion.Logging.Verbosity GitVersion.Logging.Verbosity.Verbose = 3 -> GitVersion.Logging.Verbosity GitVersion.MergeMessage GitVersion.MergeMessage.FormatName.get -> string? +GitVersion.MergeMessage.GetMergedBranchName() -> GitVersion.ReferenceName! GitVersion.MergeMessage.IsMergedPullRequest.get -> bool GitVersion.MergeMessage.MergeMessage(string? mergeMessage, GitVersion.Configuration.GitVersionConfiguration! configuration) -> void GitVersion.MergeMessage.MergedBranch.get -> string! @@ -705,6 +710,7 @@ GitVersion.OutputVariables.VersionVariablesJsonModel.WeightedPreReleaseNumber.ge GitVersion.OutputVariables.VersionVariablesJsonModel.WeightedPreReleaseNumber.set -> void GitVersion.OutputVariables.VersionVariablesJsonStringConverter GitVersion.OutputVariables.VersionVariablesJsonStringConverter.VersionVariablesJsonStringConverter() -> void +GitVersion.ReferenceName.IsLocalBranch.get -> bool GitVersion.RefSpecDirection GitVersion.RefSpecDirection.Fetch = 0 -> GitVersion.RefSpecDirection GitVersion.RefSpecDirection.Push = 1 -> GitVersion.RefSpecDirection @@ -714,7 +720,6 @@ GitVersion.ReferenceName.CompareTo(GitVersion.ReferenceName? other) -> int GitVersion.ReferenceName.Equals(GitVersion.ReferenceName? other) -> bool GitVersion.ReferenceName.EquivalentTo(string? name) -> bool GitVersion.ReferenceName.Friendly.get -> string! -GitVersion.ReferenceName.IsBranch.get -> bool GitVersion.ReferenceName.IsPullRequest.get -> bool GitVersion.ReferenceName.IsRemoteBranch.get -> bool GitVersion.ReferenceName.IsTag.get -> bool @@ -977,7 +982,6 @@ const GitVersion.VersionCalculation.IncrementStrategyFinder.DefaultMajorPattern const GitVersion.VersionCalculation.IncrementStrategyFinder.DefaultMinorPattern = "\\+semver:\\s?(feature|minor)" -> string! const GitVersion.VersionCalculation.IncrementStrategyFinder.DefaultNoBumpPattern = "\\+semver:\\s?(none|skip)" -> string! const GitVersion.VersionCalculation.IncrementStrategyFinder.DefaultPatchPattern = "\\+semver:\\s?(fix|patch)" -> string! -const GitVersion.VersionCalculation.MergeMessageVersionStrategy.MergeMessageStrategyPrefix = "Merge message" -> string! override GitVersion.Agents.LocalBuild.CanApplyToCurrentContext() -> bool override GitVersion.Agents.LocalBuild.EnvironmentVariable.get -> string! override GitVersion.Agents.LocalBuild.GenerateSetParameterMessage(string! name, string! value) -> string![]! @@ -1065,13 +1069,14 @@ static GitVersion.BranchCommit.operator !=(GitVersion.BranchCommit left, GitVers static GitVersion.BranchCommit.operator ==(GitVersion.BranchCommit left, GitVersion.BranchCommit right) -> bool static GitVersion.Configuration.BranchConfigurationBuilder.New.get -> GitVersion.Configuration.BranchConfigurationBuilder! static GitVersion.Configuration.ConfigurationExtensions.GetBranchConfiguration(this GitVersion.Configuration.GitVersionConfiguration! configuration, GitVersion.IBranch! branch) -> GitVersion.Configuration.BranchConfiguration! -static GitVersion.Configuration.ConfigurationExtensions.GetBranchConfiguration(this GitVersion.Configuration.GitVersionConfiguration! configuration, string! branchName) -> GitVersion.Configuration.BranchConfiguration! +static GitVersion.Configuration.ConfigurationExtensions.GetBranchConfiguration(this GitVersion.Configuration.GitVersionConfiguration! configuration, GitVersion.ReferenceName! branchName) -> GitVersion.Configuration.BranchConfiguration! static GitVersion.Configuration.ConfigurationExtensions.GetBranchSpecificTag(this GitVersion.Configuration.EffectiveConfiguration! configuration, GitVersion.Logging.ILog! log, string? branchFriendlyName, string? branchNameOverride) -> string! static GitVersion.Configuration.ConfigurationExtensions.GetEffectiveConfiguration(this GitVersion.Configuration.GitVersionConfiguration! configuration, GitVersion.IBranch! branch) -> GitVersion.Configuration.EffectiveConfiguration! -static GitVersion.Configuration.ConfigurationExtensions.GetEffectiveConfiguration(this GitVersion.Configuration.GitVersionConfiguration! configuration, string! branchName) -> GitVersion.Configuration.EffectiveConfiguration! +static GitVersion.Configuration.ConfigurationExtensions.GetEffectiveConfiguration(this GitVersion.Configuration.GitVersionConfiguration! configuration, GitVersion.ReferenceName! branchName) -> GitVersion.Configuration.EffectiveConfiguration! static GitVersion.Configuration.ConfigurationExtensions.GetFallbackBranchConfiguration(this GitVersion.Configuration.GitVersionConfiguration! configuration) -> GitVersion.Configuration.BranchConfiguration! static GitVersion.Configuration.ConfigurationExtensions.GetReleaseBranchConfiguration(this GitVersion.Configuration.GitVersionConfiguration! configuration) -> System.Collections.Generic.List>! -static GitVersion.Configuration.ConfigurationExtensions.IsReleaseBranch(this GitVersion.Configuration.GitVersionConfiguration! configuration, string! branchName) -> bool +static GitVersion.Configuration.ConfigurationExtensions.IsReleaseBranch(this GitVersion.Configuration.GitVersionConfiguration! configuration, GitVersion.IBranch! branch) -> bool +static GitVersion.Configuration.ConfigurationExtensions.IsReleaseBranch(this GitVersion.Configuration.GitVersionConfiguration! configuration, GitVersion.ReferenceName! branchName) -> bool static GitVersion.Configuration.ConfigurationSerializer.Deserialize(string! input) -> T static GitVersion.Configuration.ConfigurationSerializer.Read(System.IO.TextReader! reader) -> GitVersion.Configuration.GitVersionConfiguration! static GitVersion.Configuration.ConfigurationSerializer.Serialize(object! graph) -> string! @@ -1153,6 +1158,7 @@ static GitVersion.OutputVariables.VersionVariables.FromFile(string! filePath, Gi static GitVersion.OutputVariables.VersionVariables.FromJson(string! json) -> GitVersion.OutputVariables.VersionVariables! static GitVersion.ReferenceName.FromBranchName(string! branchName) -> GitVersion.ReferenceName! static GitVersion.ReferenceName.Parse(string! canonicalName) -> GitVersion.ReferenceName! +static GitVersion.ReferenceName.TryParse(out GitVersion.ReferenceName? value, string! canonicalName) -> bool static GitVersion.SemanticVersion.Parse(string! version, string? tagPrefixRegex, GitVersion.SemanticVersionFormat versionFormat = GitVersion.SemanticVersionFormat.Strict) -> GitVersion.SemanticVersion! static GitVersion.SemanticVersion.TryParse(string! version, string? tagPrefixRegex, out GitVersion.SemanticVersion? semanticVersion, GitVersion.SemanticVersionFormat format = GitVersion.SemanticVersionFormat.Strict) -> bool static GitVersion.SemanticVersion.operator !=(GitVersion.SemanticVersion? v1, GitVersion.SemanticVersion? v2) -> bool diff --git a/src/GitVersion.Core/VersionCalculation/BaseVersionCalculators/MergeMessageVersionStrategy.cs b/src/GitVersion.Core/VersionCalculation/BaseVersionCalculators/MergeMessageVersionStrategy.cs index 8593ce74f0..de980119f2 100644 --- a/src/GitVersion.Core/VersionCalculation/BaseVersionCalculators/MergeMessageVersionStrategy.cs +++ b/src/GitVersion.Core/VersionCalculation/BaseVersionCalculators/MergeMessageVersionStrategy.cs @@ -1,5 +1,4 @@ using System.Diagnostics.CodeAnalysis; -using System.Text.RegularExpressions; using GitVersion.Common; using GitVersion.Configuration; using GitVersion.Extensions; @@ -32,9 +31,8 @@ public override IEnumerable GetBaseVersions(EffectiveBranchConfigur var baseVersions = commitsPriorToThan .SelectMany(c => { - if (TryParse(c, Context, out var mergeMessage) && - mergeMessage.Version != null && - Context.Configuration.IsReleaseBranch(TrimRemote(mergeMessage.MergedBranch))) + if (TryParse(c, Context, out var mergeMessage) && mergeMessage.Version != null + && Context.Configuration.IsReleaseBranch(mergeMessage.GetMergedBranchName())) { this.log.Info($"Found commit [{Context.CurrentCommit}] matching merge message format: {mergeMessage.FormatName}"); var shouldIncrement = !configuration.Value.PreventIncrementOfMergedBranchVersion; @@ -53,7 +51,7 @@ public override IEnumerable GetBaseVersions(EffectiveBranchConfigur } var baseVersion = new BaseVersion( - source: $"{MergeMessageStrategyPrefix} '{message}'", + source: $"Merge message '{message}'", shouldIncrement: shouldIncrement, semanticVersion: mergeMessage.Version, baseVersionSource: baseVersionSource, @@ -68,8 +66,6 @@ public override IEnumerable GetBaseVersions(EffectiveBranchConfigur return baseVersions; } - public const string MergeMessageStrategyPrefix = "Merge message"; - private static bool TryParse(ICommit mergeCommit, GitVersionContext context, [NotNullWhen(true)] out MergeMessage? mergeMessage) { mergeMessage = Inner(mergeCommit, context); @@ -86,8 +82,4 @@ private static bool TryParse(ICommit mergeCommit, GitVersionContext context, [No var mergeMessage = new MergeMessage(mergeCommit.Message, context.Configuration); return mergeMessage; } - - private static string TrimRemote(string branchName) => branchName - .RegexReplace("^refs/remotes/", string.Empty, RegexOptions.IgnoreCase) - .RegexReplace("^origin/", string.Empty, RegexOptions.IgnoreCase); } diff --git a/src/GitVersion.Core/VersionCalculation/BaseVersionCalculators/VersionInBranchNameVersionStrategy.cs b/src/GitVersion.Core/VersionCalculation/BaseVersionCalculators/VersionInBranchNameVersionStrategy.cs index 137e7accc2..86eb4f12a7 100644 --- a/src/GitVersion.Core/VersionCalculation/BaseVersionCalculators/VersionInBranchNameVersionStrategy.cs +++ b/src/GitVersion.Core/VersionCalculation/BaseVersionCalculators/VersionInBranchNameVersionStrategy.cs @@ -21,7 +21,7 @@ public override IEnumerable GetBaseVersions(EffectiveBranchConfigur if (!configuration.Value.IsReleaseBranch) yield break; var versionInBranch = GetVersionInBranch( - configuration.Branch.Name.Friendly, configuration.Value.LabelPrefix, configuration.Value.SemanticVersionFormat + configuration.Branch.Name, configuration.Value.LabelPrefix, configuration.Value.SemanticVersionFormat ); if (versionInBranch != null) { @@ -33,9 +33,10 @@ public override IEnumerable GetBaseVersions(EffectiveBranchConfigur } } - private static Tuple? GetVersionInBranch(string branchName, string? tagPrefixRegex, SemanticVersionFormat versionFormat) + private static Tuple? GetVersionInBranch( + ReferenceName branchName, string? tagPrefixRegex, SemanticVersionFormat versionFormat) { - var branchParts = branchName.Split('/', '-'); + var branchParts = branchName.WithoutRemote.Split('/', '-'); foreach (var part in branchParts) { if (SemanticVersion.TryParse(part, tagPrefixRegex, out var semanticVersion, versionFormat)) diff --git a/src/GitVersion.Core/VersionCalculation/MainlineVersionCalculator.cs b/src/GitVersion.Core/VersionCalculation/MainlineVersionCalculator.cs index 23a2f91014..9627c8f7a0 100644 --- a/src/GitVersion.Core/VersionCalculation/MainlineVersionCalculator.cs +++ b/src/GitVersion.Core/VersionCalculation/MainlineVersionCalculator.cs @@ -299,7 +299,8 @@ private VersionField TryFindIncrementFromMergeMessage(ICommit? mergeCommit) if (mergeCommit != null) { var mergeMessage = new MergeMessage(mergeCommit.Message, context.Configuration); - var configuration = context.Configuration.GetBranchConfiguration(mergeMessage.MergedBranch); + var branchName = mergeMessage.GetMergedBranchName(); + var configuration = context.Configuration.GetBranchConfiguration(branchName); if (configuration.Increment != IncrementStrategy.Inherit) { return configuration.Increment.ToVersionField(); diff --git a/src/GitVersion.MsBuild.Tests/Tasks/TestTaskBase.cs b/src/GitVersion.MsBuild.Tests/Tasks/TestTaskBase.cs index bd9cd6bdc2..c7ccb7dd31 100644 --- a/src/GitVersion.MsBuild.Tests/Tasks/TestTaskBase.cs +++ b/src/GitVersion.MsBuild.Tests/Tasks/TestTaskBase.cs @@ -118,7 +118,7 @@ private static RemoteRepositoryFixture CreateRemoteRepositoryFixture() fixture.Repository.MakeACommit(); fixture.Repository.CreateBranch("develop"); - Commands.Fetch((Repository)fixture.LocalRepositoryFixture.Repository, fixture.LocalRepositoryFixture.Repository.Network.Remotes.First().Name, Array.Empty(), new FetchOptions(), null); + Commands.Fetch(fixture.LocalRepositoryFixture.Repository, fixture.LocalRepositoryFixture.Repository.Network.Remotes.First().Name, Array.Empty(), new FetchOptions(), null); Commands.Checkout(fixture.LocalRepositoryFixture.Repository, fixture.Repository.Head.Tip); fixture.LocalRepositoryFixture.Repository.Branches.Remove(MainBranch); fixture.InitializeRepo(); diff --git a/src/GitVersion.Testing/Fixtures/EmptyRepositoryFixture.cs b/src/GitVersion.Testing/Fixtures/EmptyRepositoryFixture.cs index b2e6f899f0..fb4e8f5ea6 100644 --- a/src/GitVersion.Testing/Fixtures/EmptyRepositoryFixture.cs +++ b/src/GitVersion.Testing/Fixtures/EmptyRepositoryFixture.cs @@ -13,7 +13,7 @@ public EmptyRepositoryFixture(string branchName) { } - private static IRepository CreateNewRepository(string path, string branchName) + private static Repository CreateNewRepository(string path, string branchName) { Init(path, branchName); Console.WriteLine("Created git repository at '{0}'", path); diff --git a/src/GitVersion.Testing/Fixtures/LocalRepositoryFixture.cs b/src/GitVersion.Testing/Fixtures/LocalRepositoryFixture.cs index 24a572a88f..b9e8483e9f 100644 --- a/src/GitVersion.Testing/Fixtures/LocalRepositoryFixture.cs +++ b/src/GitVersion.Testing/Fixtures/LocalRepositoryFixture.cs @@ -4,7 +4,7 @@ namespace GitVersion.Testing; public class LocalRepositoryFixture : RepositoryFixtureBase { - public LocalRepositoryFixture(IRepository repository) : base(repository) + public LocalRepositoryFixture(Repository repository) : base(repository) { } } diff --git a/src/GitVersion.Testing/Fixtures/RemoteRepositoryFixture.cs b/src/GitVersion.Testing/Fixtures/RemoteRepositoryFixture.cs index efe3359c76..9ba142908d 100644 --- a/src/GitVersion.Testing/Fixtures/RemoteRepositoryFixture.cs +++ b/src/GitVersion.Testing/Fixtures/RemoteRepositoryFixture.cs @@ -9,15 +9,15 @@ namespace GitVersion.Testing; /// public class RemoteRepositoryFixture : RepositoryFixtureBase { - public RemoteRepositoryFixture(Func builder) + public RemoteRepositoryFixture(Func builder) : base(builder) => CreateLocalRepository(); public RemoteRepositoryFixture() : this("main") { } - public RemoteRepositoryFixture(string branchName) : - this(path => CreateNewRepository(path, branchName)) + public RemoteRepositoryFixture(string branchName) + : this(path => CreateNewRepository(path, branchName)) { } @@ -26,14 +26,14 @@ public RemoteRepositoryFixture(string branchName) : /// public LocalRepositoryFixture LocalRepositoryFixture { get; private set; } - private static IRepository CreateNewRepository(string path, string branchName) + private static Repository CreateNewRepository(string path, string branchName) { Init(path, branchName); Console.WriteLine("Created git repository at '{0}'", path); - var repo = new Repository(path); - repo.MakeCommits(5); - return repo; + var repository = new Repository(path); + repository.MakeCommits(5); + return repository; } private void CreateLocalRepository() => LocalRepositoryFixture = CloneRepository(); diff --git a/src/GitVersion.Testing/Fixtures/RepositoryFixtureBase.cs b/src/GitVersion.Testing/Fixtures/RepositoryFixtureBase.cs index 3eab8e1d1c..4d2a8a4a64 100644 --- a/src/GitVersion.Testing/Fixtures/RepositoryFixtureBase.cs +++ b/src/GitVersion.Testing/Fixtures/RepositoryFixtureBase.cs @@ -9,26 +9,25 @@ namespace GitVersion.Testing; public abstract class RepositoryFixtureBase : IDisposable { - protected RepositoryFixtureBase(Func repoBuilder) - : this(repoBuilder(PathHelper.GetTempPath())) + protected RepositoryFixtureBase(Func repositoryBuilder) + : this(repositoryBuilder(PathHelper.GetTempPath())) { } - protected RepositoryFixtureBase(IRepository repository) + protected RepositoryFixtureBase(Repository repository) { this.SequenceDiagram = new SequenceDiagram(); - Repository = repository; + Repository = repository ?? throw new ArgumentNullException(nameof(repository)); Repository.Config.Set("user.name", "Test"); Repository.Config.Set("user.email", "test@email.com"); } - public IRepository Repository { get; } + public Repository Repository { get; } public string RepositoryPath => Repository.Info.WorkingDirectory.TrimEnd('\\'); public SequenceDiagram SequenceDiagram { get; } - /// /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. /// @@ -69,10 +68,11 @@ protected virtual void Dispose(bool disposing) public static void Init(string path, string branchName) => GitTestExtensions.ExecuteGitCmd($"init {path} -b {branchName}"); - public void MakeATaggedCommit(string tag) + public string MakeATaggedCommit(string tag) { - MakeACommit(); + var sha = MakeACommit(); ApplyTag(tag); + return sha; } public void ApplyTag(string tag) @@ -81,6 +81,12 @@ public void ApplyTag(string tag) Repository.ApplyTag(tag); } + public void CreateBranch(string branchName, string? @as = null) + { + this.SequenceDiagram.BranchTo(branchName, Repository.Head.FriendlyName, @as); + Repository.CreateBranch(branchName); + } + public void BranchTo(string branchName, string? @as = null) { this.SequenceDiagram.BranchTo(branchName, Repository.Head.FriendlyName, @as); @@ -95,11 +101,12 @@ public void BranchToFromTag(string branchName, string fromTag, string onBranch, Commands.Checkout(Repository, branch); } - public void MakeACommit() + public string MakeACommit() { var to = Repository.Head.FriendlyName; this.SequenceDiagram.MakeACommit(to); - Repository.MakeACommit(); + var commit = Repository.MakeACommit(); + return commit.Sha; } /// @@ -117,7 +124,10 @@ public void MergeNoFF(string mergeSource) public LocalRepositoryFixture CloneRepository() { var localPath = PathHelper.GetTempPath(); - LibGit2Sharp.Repository.Clone(RepositoryPath, localPath); + Repository.Clone(RepositoryPath, localPath); return new LocalRepositoryFixture(new Repository(localPath)); } + + public void Fetch(string remote, FetchOptions? options = null) + => Commands.Fetch(Repository, remote, Array.Empty(), options, null); }