diff --git a/src/GitVersionCore.Tests/IntegrationTests/OtherBranchScenarios.cs b/src/GitVersionCore.Tests/IntegrationTests/OtherBranchScenarios.cs index 0efcc15121..a5c7177fce 100644 --- a/src/GitVersionCore.Tests/IntegrationTests/OtherBranchScenarios.cs +++ b/src/GitVersionCore.Tests/IntegrationTests/OtherBranchScenarios.cs @@ -1,4 +1,4 @@ -using GitTools.Testing; +using GitTools.Testing; using GitVersionCore.Tests; using LibGit2Sharp; using NUnit.Framework; @@ -15,10 +15,10 @@ public void CanTakeVersionFromReleaseBranch() const string TaggedVersion = "1.0.3"; fixture.Repository.MakeATaggedCommit(TaggedVersion); fixture.Repository.MakeCommits(5); - fixture.Repository.CreateBranch("alpha-2.0.0"); - Commands.Checkout(fixture.Repository, "alpha-2.0.0"); + fixture.Repository.CreateBranch("release/beta-2.0.0"); + Commands.Checkout(fixture.Repository, "release/beta-2.0.0"); - fixture.AssertFullSemver("2.0.0-alpha.1+0"); + fixture.AssertFullSemver("2.0.0-beta.1+0"); } } @@ -57,4 +57,4 @@ public void ShouldNotGetVersionFromFeatureBranchIfNotMerged() version.SemVer.ShouldBe("1.0.0-alpha.1"); } } -} \ No newline at end of file +} diff --git a/src/GitVersionCore.Tests/IntegrationTests/VersionInCurrentBranchNameScenarios.cs b/src/GitVersionCore.Tests/IntegrationTests/VersionInCurrentBranchNameScenarios.cs new file mode 100644 index 0000000000..a879436ef4 --- /dev/null +++ b/src/GitVersionCore.Tests/IntegrationTests/VersionInCurrentBranchNameScenarios.cs @@ -0,0 +1,88 @@ +namespace GitVersionCore.Tests.IntegrationTests +{ + using System.Collections.Generic; + using System.Linq; + + using GitTools.Testing; + + using GitVersion; + + using GitVersionCore.Tests; + + using LibGit2Sharp; + + using NUnit.Framework; + + [TestFixture] + public class VersionInCurrentBranchNameScenarios : TestBase + { + [Test] + public void TakesVersionFromNameOfReleaseBranch() + { + using (var fixture = new BaseGitFlowRepositoryFixture("1.0.0")) + { + fixture.BranchTo("release/2.0.0"); + + fixture.AssertFullSemver("2.0.0-beta.1+0"); + } + } + + [Test] + public void DoesNotTakeVersionFromNameOfNonReleaseBranch() + { + using (var fixture = new BaseGitFlowRepositoryFixture("1.0.0")) + { + fixture.BranchTo("feature/upgrade-power-level-to-9000.0.1"); + + fixture.AssertFullSemver("1.1.0-upgrade-power-level-to-9000-0-1.1+1"); + } + } + + [Test] + public void TakesVersionFromNameOfBranchThatIsReleaseByConfig() + { + var config = new Config + { + Branches = new Dictionary { { "support", new BranchConfig { IsReleaseBranch = true } } } + }; + + using (var fixture = new BaseGitFlowRepositoryFixture("1.0.0")) + { + fixture.BranchTo("support/2.0.0"); + + fixture.AssertFullSemver(config, "2.0.0+1"); + } + } + + [Test] + 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, new string[0], new FetchOptions(), null); + + fixture.LocalRepositoryFixture.Checkout("origin/release/2.0.0"); + + fixture.LocalRepositoryFixture.AssertFullSemver("2.0.0-beta.1+1"); + } + } + + [Test] + 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, new string[0], new FetchOptions(), null); + + fixture.LocalRepositoryFixture.Checkout("upstream/release/2.0.0"); + + fixture.LocalRepositoryFixture.AssertFullSemver("0.1.0-beta.1+5"); + } + } + } +} diff --git a/src/GitVersionCore.Tests/IntegrationTests/VersionInMergedBranchNameScenarios.cs b/src/GitVersionCore.Tests/IntegrationTests/VersionInMergedBranchNameScenarios.cs new file mode 100644 index 0000000000..f0dad729d8 --- /dev/null +++ b/src/GitVersionCore.Tests/IntegrationTests/VersionInMergedBranchNameScenarios.cs @@ -0,0 +1,100 @@ +namespace GitVersionCore.Tests.IntegrationTests +{ + using System.Collections.Generic; + using System.Linq; + + using GitTools.Testing; + + using GitVersion; + + using GitVersionCore.Tests; + + using LibGit2Sharp; + + using NUnit.Framework; + + [TestFixture] + public class VersionInMergedBranchNameScenarios : TestBase + { + [Test] + public void TakesVersionFromNameOfReleaseBranch() + { + using (var fixture = new BaseGitFlowRepositoryFixture("1.0.0")) + { + fixture.CreateAndMergeBranchIntoDevelop("release/2.0.0"); + + fixture.AssertFullSemver("2.1.0-alpha.2"); + } + } + + [Test] + public void DoesNotTakeVersionFromNameOfNonReleaseBranch() + { + using (var fixture = new BaseGitFlowRepositoryFixture("1.0.0")) + { + fixture.CreateAndMergeBranchIntoDevelop("pull-request/improved-by-upgrading-some-lib-to-4.5.6"); + fixture.CreateAndMergeBranchIntoDevelop("hotfix/downgrade-some-lib-to-3.2.1-to-avoid-breaking-changes"); + + fixture.AssertFullSemver("1.1.0-alpha.5"); + } + } + + [Test] + public void TakesVersionFromNameOfBranchThatIsReleaseByConfig() + { + var config = new Config + { + Branches = new Dictionary { { "support", new BranchConfig { IsReleaseBranch = true } } } + }; + + using (var fixture = new BaseGitFlowRepositoryFixture("1.0.0")) + { + fixture.CreateAndMergeBranchIntoDevelop("support/2.0.0"); + + fixture.AssertFullSemver(config, "2.1.0-alpha.2"); + } + } + + [Test] + 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, new string[0], new FetchOptions(), null); + + fixture.LocalRepositoryFixture.MergeNoFF("origin/release/2.0.0"); + + fixture.LocalRepositoryFixture.AssertFullSemver("2.0.0+0"); + } + } + + [Test] + 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, new string[0], new FetchOptions(), null); + + fixture.LocalRepositoryFixture.MergeNoFF("upstream/release/2.0.0"); + + fixture.LocalRepositoryFixture.AssertFullSemver("0.1.0+6"); + } + } + } + + internal static class BaseGitFlowRepositoryFixtureExtensions + { + public static void CreateAndMergeBranchIntoDevelop(this BaseGitFlowRepositoryFixture fixture, string branchName) + { + fixture.BranchTo(branchName); + fixture.MakeACommit(); + fixture.Checkout("develop"); + fixture.MergeNoFF(branchName); + } + } +} diff --git a/src/GitVersionCore.Tests/VersionCalculation/Strategies/MergeMessageBaseVersionStrategyTests.cs b/src/GitVersionCore.Tests/VersionCalculation/Strategies/MergeMessageBaseVersionStrategyTests.cs index 407940265a..b5fe2e3e43 100644 --- a/src/GitVersionCore.Tests/VersionCalculation/Strategies/MergeMessageBaseVersionStrategyTests.cs +++ b/src/GitVersionCore.Tests/VersionCalculation/Strategies/MergeMessageBaseVersionStrategyTests.cs @@ -1,7 +1,9 @@ -namespace GitVersionCore.Tests.VersionCalculation.Strategies +namespace GitVersionCore.Tests.VersionCalculation.Strategies { using System.Collections.Generic; using System.Linq; + + using GitVersion; using GitVersion.VersionCalculation.BaseVersionCalculators; using LibGit2Sharp; using NUnit.Framework; @@ -19,7 +21,7 @@ public void ShouldNotAllowIncrementOfVersion() { Head = new MockBranch("master") { new MockCommit { - MessageEx = "Merge branch 'hotfix-0.1.5'", + MessageEx = "Merge branch 'release-0.1.5'", ParentsEx = GetParents(true) } } }).Build(); @@ -30,38 +32,22 @@ public void ShouldNotAllowIncrementOfVersion() baseVersion.ShouldIncrement.ShouldBe(false); } - [TestCase("Merge branch 'hotfix-0.1.5'", false, null)] - [TestCase("Merge branch 'develop' of github.com:Particular/NServiceBus into develop", true, null)] - [TestCase("Merge branch '4.0.3'", true, "4.0.3")] //TODO: possible make it a config option to support this [TestCase("Merge branch 'release-10.10.50'", true, "10.10.50")] - [TestCase("Merge branch 's'", true, null)] // Must start with a number - [TestCase("Merge tag '10.10.50'", true, "10.10.50")] [TestCase("Merge branch 'release-0.2.0'", true, "0.2.0")] [TestCase("Merge branch 'Release-0.2.0'", true, "0.2.0")] [TestCase("Merge branch 'Release/0.2.0'", true, "0.2.0")] - [TestCase("Merge branch 'hotfix-4.6.6' into support-4.6", true, "4.6.6")] - [TestCase("Merge branch 'hotfix-10.10.50'", true, "10.10.50")] - [TestCase("Merge branch 'Hotfix-10.10.50'", true, "10.10.50")] - [TestCase("Merge branch 'Hotfix/10.10.50'", true, "10.10.50")] - [TestCase("Merge branch 'hotfix-0.1.5'", true, "0.1.5")] - [TestCase("Merge branch 'hotfix-4.2.2' into support-4.2", true, "4.2.2")] - [TestCase("Merge branch 'somebranch' into release-3.0.0", true, null)] - [TestCase("Merge branch 'hotfix-0.1.5'\n\nRelates to: TicketId", true, "0.1.5")] - [TestCase("Merge branch 'alpha-0.1.5'", true, "0.1.5")] - [TestCase("Merge pull request #165 from Particular/release-1.0.0", true, "1.0.0")] - [TestCase("Merge pull request #95 from Particular/issue-94", false, null)] - [TestCase("Merge pull request #165 in Particular/release-1.0.0", true, "1.0.0")] - [TestCase("Merge pull request #95 in Particular/issue-94", true, null)] - [TestCase("Merge pull request #95 in Particular/issue-94", false, null)] - [TestCase("Merge pull request #64 from arledesma/feature-VS2013_3rd_party_test_framework_support", true, null)] - [TestCase("Merge pull request #500 in FOO/bar from Particular/release-1.0.0 to develop)", true, "1.0.0")] - [TestCase("Merge pull request #500 in FOO/bar from feature/new-service to develop)", true, null)] + [TestCase("Merge branch 'releases-0.2.0'", true, "0.2.0")] + [TestCase("Merge branch 'Releases-0.2.0'", true, "0.2.0")] + [TestCase("Merge branch 'Releases/0.2.0'", true, "0.2.0")] + [TestCase("Merge branch 'release-4.6.6' into support-4.6", true, "4.6.6")] + [TestCase("Merge branch 'release-10.10.50'", true, "10.10.50")] + [TestCase("Merge branch 'release-0.1.5'\n\nRelates to: TicketId", true, "0.1.5")] [TestCase("Finish Release-0.12.0", true, "0.12.0")] //Support Syntevo SmartGit/Hg's Gitflow merge commit messages for finishing a 'Release' branch - [TestCase("Finish 0.14.1", true, "0.14.1")] //Support Syntevo SmartGit/Hg's Gitflow merge commit messages for finishing a 'Hotfix' branch [TestCase("Merge branch 'Release-v0.2.0'", true, "0.2.0")] [TestCase("Merge branch 'Release-v2.2'", true, "2.2.0")] [TestCase("Merge remote-tracking branch 'origin/release/0.8.0' into develop/master", true, "0.8.0")] - public void AssertMergeMessage(string message, bool isMergeCommit, string expectedVersion) + [TestCase("Merge remote-tracking branch 'refs/remotes/origin/release/2.0.0'", true, "2.0.0")] + public void TakesVersionFromMergeOfReleaseBranch(string message, bool isMergeCommit, string expectedVersion) { var parents = GetParents(isMergeCommit); AssertMergeMessage(message, expectedVersion, parents); @@ -74,6 +60,56 @@ public void AssertMergeMessage(string message, bool isMergeCommit, string expect AssertMergeMessage(message + "\n ", expectedVersion, parents); } + [TestCase("Merge branch 'hotfix-0.1.5'", false)] + [TestCase("Merge branch 'develop' of github.com:Particular/NServiceBus into develop", true)] + [TestCase("Merge branch '4.0.3'", true)] + [TestCase("Merge branch 's'", true)] + [TestCase("Merge tag '10.10.50'", true)] + [TestCase("Merge branch 'hotfix-4.6.6' into support-4.6", true)] + [TestCase("Merge branch 'hotfix-10.10.50'", true)] + [TestCase("Merge branch 'Hotfix-10.10.50'", true)] + [TestCase("Merge branch 'Hotfix/10.10.50'", true)] + [TestCase("Merge branch 'hotfix-0.1.5'", true)] + [TestCase("Merge branch 'hotfix-4.2.2' into support-4.2", true)] + [TestCase("Merge branch 'somebranch' into release-3.0.0", true)] + [TestCase("Merge branch 'hotfix-0.1.5'\n\nRelates to: TicketId", true)] + [TestCase("Merge branch 'alpha-0.1.5'", true)] + [TestCase("Merge pull request #95 from Particular/issue-94", false)] + [TestCase("Merge pull request #95 in Particular/issue-94", true)] + [TestCase("Merge pull request #95 in Particular/issue-94", false)] + [TestCase("Merge pull request #64 from arledesma/feature-VS2013_3rd_party_test_framework_support", true)] + [TestCase("Merge pull request #500 in FOO/bar from Particular/release-1.0.0 to develop)", true)] + [TestCase("Merge pull request #500 in FOO/bar from feature/new-service to develop)", true)] + [TestCase("Finish 0.14.1", true)] // Don't support Syntevo SmartGit/Hg's Gitflow merge commit messages for finishing a 'Hotfix' branch + public void ShouldNotTakeVersionFromMergeOfNonReleaseBranch(string message, bool isMergeCommit) + { + var parents = GetParents(isMergeCommit); + AssertMergeMessage(message, null, parents); + AssertMergeMessage(message + " ", null, parents); + AssertMergeMessage(message + "\r ", null, parents); + AssertMergeMessage(message + "\r", null, parents); + AssertMergeMessage(message + "\r\n", null, parents); + AssertMergeMessage(message + "\r\n ", null, parents); + AssertMergeMessage(message + "\n", null, parents); + AssertMergeMessage(message + "\n ", null, parents); + } + + [TestCase("Merge pull request #165 from Particular/release-1.0.0", true)] + [TestCase("Merge pull request #165 in Particular/release-1.0.0", true)] + [TestCase("Merge pull request #500 in FOO/bar from Particular/release-1.0.0 to develop)", true)] + public void ShouldNotTakeVersionFromMergeOfReleaseBranchWithRemoteOtherThanOrigin(string message, bool isMergeCommit) + { + var parents = GetParents(isMergeCommit); + AssertMergeMessage(message, null, parents); + AssertMergeMessage(message + " ", null, parents); + AssertMergeMessage(message + "\r ", null, parents); + AssertMergeMessage(message + "\r", null, parents); + AssertMergeMessage(message + "\r\n", null, parents); + AssertMergeMessage(message + "\r\n ", null, parents); + AssertMergeMessage(message + "\n", null, parents); + AssertMergeMessage(message + "\n ", null, parents); + } + [TestCase(@"Merge pull request #1 in FOO/bar from feature/ISSUE-1 to develop * commit '38560a7eed06e8d3f3f1aaf091befcdf8bf50fea': @@ -89,14 +125,26 @@ Another commit message [TestCase(@"Merge branch 'master' of http://172.16.3.10:8082/r/asu_tk/p_sd")] [TestCase(@"Merge branch 'master' of http://212.248.89.56:8082/r/asu_tk/p_sd")] [TestCase(@"Merge branch 'DEMO' of http://10.10.10.121/gitlab/mtolland/orcid into DEMO")] - public void MergeMessagesThatIsNotRelatedToGitVersion(string commitMessage) + public void ShouldNotTakeVersionFromUnrelatedMerge(string commitMessage) { var parents = GetParents(true); AssertMergeMessage(commitMessage, null, parents); } - static void AssertMergeMessage(string message, string expectedVersion, List parents) + [TestCase("Merge branch 'support/0.2.0'", "support", "0.2.0")] + [TestCase("Merge branch 'support/0.2.0'", null, null)] + [TestCase("Merge branch 'release/2.0.0'", null, "2.0.0")] + public void TakesVersionFromMergeOfConfiguredReleaseBranch(string message, string releaseBranch, string expectedVersion) + { + var config = new Config(); + if (releaseBranch != null) config.Branches[releaseBranch] = new BranchConfig { IsReleaseBranch = true }; + var parents = GetParents(true); + + AssertMergeMessage(message, expectedVersion, parents, config); + } + + static void AssertMergeMessage(string message, string expectedVersion, List parents, Config config = null) { var commit = new MockCommit { @@ -105,6 +153,7 @@ static void AssertMergeMessage(string message, string expectedVersion, List GetParents(bool isMergeCommit) }; } } -} \ No newline at end of file +} diff --git a/src/GitVersionCore.Tests/VersionCalculation/Strategies/VersionInBranchNameBaseVersionStrategyTests.cs b/src/GitVersionCore.Tests/VersionCalculation/Strategies/VersionInBranchNameBaseVersionStrategyTests.cs index 106d729260..a4e96e9847 100644 --- a/src/GitVersionCore.Tests/VersionCalculation/Strategies/VersionInBranchNameBaseVersionStrategyTests.cs +++ b/src/GitVersionCore.Tests/VersionCalculation/Strategies/VersionInBranchNameBaseVersionStrategyTests.cs @@ -1,5 +1,6 @@ -namespace GitVersionCore.Tests.VersionCalculation.Strategies +namespace GitVersionCore.Tests.VersionCalculation.Strategies { + using System.Collections.Generic; using System.Linq; using GitTools.Testing; using GitVersion; @@ -11,13 +12,9 @@ [TestFixture] public class VersionInBranchNameBaseVersionStrategyTests : TestBase { - [Test] [TestCase("release-2.0.0", "2.0.0")] - [TestCase("release/2.0.0", "2.0.0")] - [TestCase("hotfix-2.0.0", "2.0.0")] - [TestCase("hotfix/2.0.0", "2.0.0")] - [TestCase("custom/JIRA-123", null)] - public void CanTakeVersionFromBranchName(string branchName, string expectedBaseVersion) + [TestCase("release/3.0.0", "3.0.0")] + public void CanTakeVersionFromNameOfReleaseBranch(string branchName, string expectedBaseVersion) { using (var fixture = new EmptyRepositoryFixture()) { @@ -26,12 +23,68 @@ public void CanTakeVersionFromBranchName(string branchName, string expectedBaseV var sut = new VersionInBranchNameBaseVersionStrategy(); var gitVersionContext = new GitVersionContext(fixture.Repository, branch, new Config().ApplyDefaults()); - var baseVersion = sut.GetVersions(gitVersionContext).SingleOrDefault(); + var baseVersion = sut.GetVersions(gitVersionContext).Single(); - if (expectedBaseVersion == null) - baseVersion.ShouldBe(null); - else - baseVersion.SemanticVersion.ToString().ShouldBe(expectedBaseVersion); + baseVersion.SemanticVersion.ToString().ShouldBe(expectedBaseVersion); + } + } + + [TestCase("hotfix-2.0.0")] + [TestCase("hotfix/2.0.0")] + [TestCase("custom/JIRA-123")] + [TestCase("hotfix/downgrade-to-gitversion-3.6.5-to-fix-miscalculated-version")] + public void ShouldNotTakeVersionFromNameOfNonReleaseBranch(string branchName) + { + using (var fixture = new EmptyRepositoryFixture()) + { + fixture.Repository.MakeACommit(); + var branch = fixture.Repository.CreateBranch(branchName); + var sut = new VersionInBranchNameBaseVersionStrategy(); + + var gitVersionContext = new GitVersionContext(fixture.Repository, branch, new Config().ApplyDefaults()); + var baseVersions = sut.GetVersions(gitVersionContext); + + baseVersions.ShouldBeEmpty(); + } + } + + [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(); + var branch = fixture.Repository.CreateBranch(branchName); + var sut = new VersionInBranchNameBaseVersionStrategy(); + var branchConfigs = new Dictionary { { "support", new BranchConfig { IsReleaseBranch = true } } }; + var config = new Config { Branches = branchConfigs }.ApplyDefaults(); + + var gitVersionContext = new GitVersionContext(fixture.Repository, branch, config); + var baseVersion = sut.GetVersions(gitVersionContext).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) + { + 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, new string[0], new FetchOptions(), null); + fixture.LocalRepositoryFixture.Checkout($"origin/{branchName}"); + + var sut = new VersionInBranchNameBaseVersionStrategy(); + var gitVersionContext = new GitVersionContext(fixture.Repository, branch, new Config().ApplyDefaults()); + var baseVersion = sut.GetVersions(gitVersionContext).Single(); + + baseVersion.SemanticVersion.ToString().ShouldBe(expectedBaseVersion); } } } diff --git a/src/GitVersionCore/AssemblyInfo.cs b/src/GitVersionCore/AssemblyInfo.cs index 6e1a098179..9067589fbb 100644 --- a/src/GitVersionCore/AssemblyInfo.cs +++ b/src/GitVersionCore/AssemblyInfo.cs @@ -1,4 +1,4 @@ -using System.Reflection; +using System.Reflection; using System.Runtime.CompilerServices; [assembly: AssemblyTitle("GitVersionCore")] diff --git a/src/GitVersionCore/Configuration/Config.cs b/src/GitVersionCore/Configuration/Config.cs index ba2481d5d6..ba04dff821 100644 --- a/src/GitVersionCore/Configuration/Config.cs +++ b/src/GitVersionCore/Configuration/Config.cs @@ -135,6 +135,8 @@ T MergeObjects(T target, T source) return target; } + public bool IsReleaseBranch(string branchName) => GetConfigForBranch(branchName)?.IsReleaseBranch ?? false; + [YamlMember(Alias = "ignore")] public IgnoreConfig Ignore { get; set; } diff --git a/src/GitVersionCore/LibGitExtensions.cs b/src/GitVersionCore/LibGitExtensions.cs index 711787d6af..fc9a32c108 100644 --- a/src/GitVersionCore/LibGitExtensions.cs +++ b/src/GitVersionCore/LibGitExtensions.cs @@ -15,14 +15,18 @@ public static DateTimeOffset When(this Commit commit) return commit.Committer.When; } - /// - /// Checks if the two branch objects refer to the same branch (have the same friendly name). - /// public static string NameWithoutRemote(this Branch branch) { - return branch.IsRemote ? - branch.FriendlyName.Substring(branch.FriendlyName.IndexOf("/", StringComparison.Ordinal) + 1) : - branch.FriendlyName; + return branch.IsRemote + ? branch.FriendlyName.Substring(branch.FriendlyName.IndexOf("/", StringComparison.Ordinal) + 1) + : branch.FriendlyName; + } + + public static string NameWithoutOrigin(this Branch branch) + { + return branch.IsRemote && branch.FriendlyName.StartsWith("origin/") + ? branch.FriendlyName.Substring("origin/".Length) + : branch.FriendlyName; } /// diff --git a/src/GitVersionCore/MergeMessage.cs b/src/GitVersionCore/MergeMessage.cs index d3fb58cfed..059bcf36dd 100644 --- a/src/GitVersionCore/MergeMessage.cs +++ b/src/GitVersionCore/MergeMessage.cs @@ -18,16 +18,14 @@ class MergeMessage @"^Finish (?.*)", RegexOptions.IgnoreCase | RegexOptions.Compiled); static Regex parseRemoteTrackingMergeMessage = new Regex( - @"^Merge remote-tracking branch '(?.*)' into (?.*)", + @"^Merge remote-tracking branch '(?.*)'( into (?.*))?", RegexOptions.IgnoreCase | RegexOptions.Compiled); private string mergeMessage; - private Config config; public MergeMessage(string mergeMessage, Config config) { this.mergeMessage = mergeMessage; - this.config = config; var lastIndexOf = mergeMessage.LastIndexOf("into", StringComparison.OrdinalIgnoreCase); if (lastIndexOf != -1) diff --git a/src/GitVersionCore/VersionCalculation/BaseVersionCalculators/MergeMessageBaseVersionStrategy.cs b/src/GitVersionCore/VersionCalculation/BaseVersionCalculators/MergeMessageBaseVersionStrategy.cs index e9fac9c84c..dae854251b 100644 --- a/src/GitVersionCore/VersionCalculation/BaseVersionCalculators/MergeMessageBaseVersionStrategy.cs +++ b/src/GitVersionCore/VersionCalculation/BaseVersionCalculators/MergeMessageBaseVersionStrategy.cs @@ -1,7 +1,8 @@ -namespace GitVersion.VersionCalculation.BaseVersionCalculators +namespace GitVersion.VersionCalculation.BaseVersionCalculators { using System.Collections.Generic; using System.Linq; + using System.Text.RegularExpressions; using LibGit2Sharp; /// @@ -18,13 +19,14 @@ public override IEnumerable GetVersions(GitVersionContext context) var baseVersions = commitsPriorToThan .SelectMany(c => { - SemanticVersion semanticVersion; - if (TryParse(c, context, out semanticVersion)) + if (TryParse(c, context, out var mergeMessage) && + mergeMessage.Version != null && + context.FullConfiguration.IsReleaseBranch(TrimRemote(mergeMessage.MergedBranch))) { var shouldIncrement = !context.Configuration.PreventIncrementForMergedBranchVersion; return new[] { - new BaseVersion(context, string.Format("Merge message '{0}'", c.Message.Trim()), shouldIncrement, semanticVersion, c, null) + new BaseVersion(context, $"Merge message '{c.Message.Trim()}'", shouldIncrement, mergeMessage.Version, c, null) }; } return Enumerable.Empty(); @@ -32,13 +34,13 @@ public override IEnumerable GetVersions(GitVersionContext context) return baseVersions; } - static bool TryParse(Commit mergeCommit, GitVersionContext context, out SemanticVersion semanticVersion) + static bool TryParse(Commit mergeCommit, GitVersionContext context, out MergeMessage mergeMessage) { - semanticVersion = Inner(mergeCommit, context); - return semanticVersion != null; + mergeMessage = Inner(mergeCommit, context); + return mergeMessage != null; } - static SemanticVersion Inner(Commit mergeCommit, GitVersionContext context) + static MergeMessage Inner(Commit mergeCommit, GitVersionContext context) { if (mergeCommit.Parents.Count() < 2) { @@ -46,7 +48,11 @@ static SemanticVersion Inner(Commit mergeCommit, GitVersionContext context) } var mergeMessage = new MergeMessage(mergeCommit.Message, context.FullConfiguration); - return mergeMessage.Version; + return mergeMessage; } + + static string TrimRemote(string branchName) => branchName + .RegexReplace("^refs/remotes/", string.Empty, RegexOptions.IgnoreCase) + .RegexReplace("^origin/", string.Empty, RegexOptions.IgnoreCase); } -} \ No newline at end of file +} diff --git a/src/GitVersionCore/VersionCalculation/BaseVersionCalculators/VersionInBranchNameBaseVersionStrategy.cs b/src/GitVersionCore/VersionCalculation/BaseVersionCalculators/VersionInBranchNameBaseVersionStrategy.cs index db2546e06a..8bb11d0a51 100644 --- a/src/GitVersionCore/VersionCalculation/BaseVersionCalculators/VersionInBranchNameBaseVersionStrategy.cs +++ b/src/GitVersionCore/VersionCalculation/BaseVersionCalculators/VersionInBranchNameBaseVersionStrategy.cs @@ -1,7 +1,8 @@ -namespace GitVersion.VersionCalculation.BaseVersionCalculators +namespace GitVersion.VersionCalculation.BaseVersionCalculators { using System; using System.Collections.Generic; + using LibGit2Sharp; /// @@ -15,12 +16,16 @@ public override IEnumerable GetVersions(GitVersionContext context) { var currentBranch = context.CurrentBranch; var tagPrefixRegex = context.Configuration.GitTagPrefix; - var repository = context.Repository; - return GetVersions(context, tagPrefixRegex, currentBranch, repository); + return GetVersions(context, tagPrefixRegex, currentBranch); } - public IEnumerable GetVersions(GitVersionContext context, string tagPrefixRegex, Branch currentBranch, IRepository repository) + public IEnumerable GetVersions(GitVersionContext context, string tagPrefixRegex, Branch currentBranch) { + if (!context.FullConfiguration.IsReleaseBranch(currentBranch.NameWithoutOrigin())) + { + yield break; + } + var branchName = currentBranch.FriendlyName; var versionInBranch = GetVersionInBranch(branchName, tagPrefixRegex); if (versionInBranch != null) @@ -46,4 +51,4 @@ Tuple GetVersionInBranch(string branchName, string tagP return null; } } -} \ No newline at end of file +} diff --git a/src/GitVersionCore/VersionCalculation/DevelopVersionStrategy.cs b/src/GitVersionCore/VersionCalculation/DevelopVersionStrategy.cs index 9333863f9d..57ee1edf56 100644 --- a/src/GitVersionCore/VersionCalculation/DevelopVersionStrategy.cs +++ b/src/GitVersionCore/VersionCalculation/DevelopVersionStrategy.cs @@ -91,7 +91,7 @@ IEnumerable GetReleaseVersion(GitVersionContext context, Branch rel } return releaseVersionStrategy - .GetVersions(context, tagPrefixRegex, releaseBranch, repository) + .GetVersions(context, tagPrefixRegex, releaseBranch) .Select(b => new BaseVersion(context, b.Source, true, b.SemanticVersion, baseSource, b.BranchNameOverride)); } } diff --git a/src/GitVersionExe/AssemblyInfo.cs b/src/GitVersionExe/AssemblyInfo.cs index 5ca2afeb27..e75c30ff1b 100644 --- a/src/GitVersionExe/AssemblyInfo.cs +++ b/src/GitVersionExe/AssemblyInfo.cs @@ -1,4 +1,4 @@ -using System.Reflection; +using System.Reflection; using System.Runtime.CompilerServices; [assembly: AssemblyTitle("GitVersion")]