diff --git a/GitVersionCore.Tests/Fixtures/EmptyRepositoryFixture.cs b/GitVersionCore.Tests/Fixtures/EmptyRepositoryFixture.cs index 8726144b78..f57a38f3c7 100644 --- a/GitVersionCore.Tests/Fixtures/EmptyRepositoryFixture.cs +++ b/GitVersionCore.Tests/Fixtures/EmptyRepositoryFixture.cs @@ -1,4 +1,4 @@ -using System; +using System.Diagnostics; using System.Text; using GitVersion; using GitVersion.Helpers; @@ -23,13 +23,13 @@ public void DumpGraph() @"log --graph --abbrev-commit --decorate --date=relative --all", RepositoryPath); - Console.Write(output.ToString()); + Trace.Write(output.ToString()); } static IRepository CreateNewRepository(string path) { LibGit2Sharp.Repository.Init(path); - Console.WriteLine("Created git repository at '{0}'", path); + Trace.WriteLine("Created git repository at '{0}'", path); return new Repository(path); } diff --git a/GitVersionCore.Tests/GitVersionContextTests.cs b/GitVersionCore.Tests/GitVersionContextTests.cs index 1b31db2850..3247cf506c 100644 --- a/GitVersionCore.Tests/GitVersionContextTests.cs +++ b/GitVersionCore.Tests/GitVersionContextTests.cs @@ -48,7 +48,6 @@ public void UsesBranchSpecificConfigOverTopLevelDefaults() } }; var context = new GitVersionContext(mockRepository, develop, config); - context.Configuration.VersioningMode.ShouldBe(VersioningMode.ContinuousDeployment); context.Configuration.Tag.ShouldBe("alpha"); } diff --git a/GitVersionCore.Tests/GitVersionCore.Tests.csproj b/GitVersionCore.Tests/GitVersionCore.Tests.csproj index db34a9827e..b76eadfead 100644 --- a/GitVersionCore.Tests/GitVersionCore.Tests.csproj +++ b/GitVersionCore.Tests/GitVersionCore.Tests.csproj @@ -81,20 +81,17 @@ - - - - - - - - - - - + + + + + + + + + - @@ -113,7 +110,7 @@ - + diff --git a/GitVersionCore.Tests/IntegrationTests/GitFlow/DevelopScenarios.cs b/GitVersionCore.Tests/IntegrationTests/DevelopScenarios.cs similarity index 90% rename from GitVersionCore.Tests/IntegrationTests/GitFlow/DevelopScenarios.cs rename to GitVersionCore.Tests/IntegrationTests/DevelopScenarios.cs index b86c33d6cc..e865ca613d 100644 --- a/GitVersionCore.Tests/IntegrationTests/GitFlow/DevelopScenarios.cs +++ b/GitVersionCore.Tests/IntegrationTests/DevelopScenarios.cs @@ -57,7 +57,7 @@ public void WhenDevelopBranchedFromMaster_MinorIsIncreased() } [Test] - public void MergingReleaseBranchBackIntoDevelopWithoutMergingToMaster_DoesNotBumpDevelopVersion() + public void MergingReleaseBranchBackIntoDevelopWithMergingToMaster_DoesBumpDevelopVersion() { using (var fixture = new EmptyRepositoryFixture(new Config())) { @@ -65,11 +65,13 @@ public void MergingReleaseBranchBackIntoDevelopWithoutMergingToMaster_DoesNotBum fixture.Repository.CreateBranch("develop").Checkout(); fixture.Repository.MakeACommit(); fixture.Repository.CreateBranch("release-2.0.0").Checkout(); - fixture.AssertFullSemver("2.0.0-beta.1+0"); + fixture.Repository.MakeACommit(); + fixture.Repository.Checkout("master"); + fixture.Repository.MergeNoFF("release-2.0.0", Constants.SignatureNow()); + fixture.Repository.Checkout("develop"); - fixture.AssertFullSemver("1.1.0-unstable.1+1"); fixture.Repository.MergeNoFF("release-2.0.0", Constants.SignatureNow()); - fixture.AssertFullSemver("1.1.0-unstable.1+1"); + fixture.AssertFullSemver("2.1.0-unstable.1+0"); } } diff --git a/GitVersionCore.Tests/IntegrationTests/GitHubFlow/GitHubFlowFeatureBranchTests.cs b/GitVersionCore.Tests/IntegrationTests/FeatureBranchTests.cs similarity index 60% rename from GitVersionCore.Tests/IntegrationTests/GitHubFlow/GitHubFlowFeatureBranchTests.cs rename to GitVersionCore.Tests/IntegrationTests/FeatureBranchTests.cs index 953ab54f59..ef4bf5d0f9 100644 --- a/GitVersionCore.Tests/IntegrationTests/GitHubFlow/GitHubFlowFeatureBranchTests.cs +++ b/GitVersionCore.Tests/IntegrationTests/FeatureBranchTests.cs @@ -3,10 +3,26 @@ using NUnit.Framework; [TestFixture] -public class GitHubFlowFeatureBranchTests +public class FeatureBranchTests { [Test] - public void ShouldNotUseNumberInFeatureBranchAsPreReleaseNumber() + public void ShouldNotUseNumberInFeatureBranchAsPreReleaseNumberOffDevelop() + { + using (var fixture = new EmptyRepositoryFixture(new Config())) + { + fixture.Repository.MakeATaggedCommit("1.0.0"); + fixture.Repository.CreateBranch("develop"); + fixture.Repository.Checkout("develop"); + fixture.Repository.CreateBranch("feature/JIRA-123"); + fixture.Repository.Checkout("feature/JIRA-123"); + fixture.Repository.MakeCommits(5); + + fixture.AssertFullSemver("1.1.0-JIRA-123.1+5"); + } + } + + [Test] + public void ShouldNotUseNumberInFeatureBranchAsPreReleaseNumberOffMaster() { using (var fixture = new EmptyRepositoryFixture(new Config())) { diff --git a/GitVersionCore.Tests/IntegrationTests/GitFlow/GitFlowFeatureBranchTests.cs b/GitVersionCore.Tests/IntegrationTests/GitFlow/GitFlowFeatureBranchTests.cs deleted file mode 100644 index ac13fa8d9a..0000000000 --- a/GitVersionCore.Tests/IntegrationTests/GitFlow/GitFlowFeatureBranchTests.cs +++ /dev/null @@ -1,23 +0,0 @@ -using GitVersion; -using LibGit2Sharp; -using NUnit.Framework; - -[TestFixture] -public class GitFlowFeatureBranchTests -{ - [Test] - public void ShouldNotUseNumberInFeatureBranchAsPreReleaseNumber() - { - using (var fixture = new EmptyRepositoryFixture(new Config())) - { - fixture.Repository.MakeATaggedCommit("1.0.0"); - fixture.Repository.CreateBranch("develop"); - fixture.Repository.Checkout("develop"); - fixture.Repository.CreateBranch("feature/JIRA-123"); - fixture.Repository.Checkout("feature/JIRA-123"); - fixture.Repository.MakeCommits(5); - - fixture.AssertFullSemver("1.1.0-JIRA-123.1+5"); - } - } -} \ No newline at end of file diff --git a/GitVersionCore.Tests/IntegrationTests/GitFlow/GitFlowSupportBranchScenarios.cs b/GitVersionCore.Tests/IntegrationTests/GitFlow/GitFlowSupportBranchScenarios.cs deleted file mode 100644 index 4d7878e681..0000000000 --- a/GitVersionCore.Tests/IntegrationTests/GitFlow/GitFlowSupportBranchScenarios.cs +++ /dev/null @@ -1,49 +0,0 @@ -using LibGit2Sharp; -using NUnit.Framework; - -[TestFixture] -public class GitFlowSupportBranchScenarios -{ - [Test] - public void SupportIsCalculatedCorrectly() - { - using (var fixture = new BaseGitFlowRepositoryFixture("1.1.0")) - { - // Create 2.0.0 release - fixture.Repository.CreateBranch("release-2.0.0").Checkout(); - fixture.Repository.MakeCommits(2); - - // Merge into develop and master - fixture.Repository.Checkout("master"); - fixture.Repository.MergeNoFF("release-2.0.0"); - fixture.Repository.ApplyTag("2.0.0"); - fixture.Repository.Checkout("develop"); - fixture.Repository.MergeNoFF("release-2.0.0"); - fixture.AssertFullSemver("2.1.0-unstable.1+1"); - - // Now lets support 1.x release - fixture.Repository.Checkout("1.1.0"); - fixture.Repository.CreateBranch("support/1.0.0").Checkout(); - fixture.AssertFullSemver("1.1.0"); - - // Create release branch from support branch - fixture.Repository.CreateBranch("release/1.2.0").Checkout(); - fixture.Repository.MakeACommit(); - fixture.AssertFullSemver("1.2.0-beta.1+1"); - - // Create 1.2.0 release - fixture.Repository.Checkout("support/1.0.0"); - fixture.Repository.MergeNoFF("release/1.2.0"); - fixture.AssertFullSemver("1.2.0"); - fixture.Repository.ApplyTag("1.2.0"); - - // Create 1.2.1 hotfix - fixture.Repository.CreateBranch("hotfix/1.2.1").Checkout(); - fixture.Repository.MakeACommit(); - fixture.AssertFullSemver("1.2.1-beta.1+3"); // TODO This should be +1 - fixture.Repository.Checkout("support/1.0.0"); - fixture.Repository.MergeNoFF("hotfix/1.2.1"); - fixture.AssertFullSemver("1.2.1"); - } - } -} \ No newline at end of file diff --git a/GitVersionCore.Tests/IntegrationTests/GitHubFlow/ReleaseBranchTests.cs b/GitVersionCore.Tests/IntegrationTests/GitHubFlow/ReleaseBranchTests.cs deleted file mode 100644 index 4626bca28d..0000000000 --- a/GitVersionCore.Tests/IntegrationTests/GitHubFlow/ReleaseBranchTests.cs +++ /dev/null @@ -1,117 +0,0 @@ -using GitVersion; -using LibGit2Sharp; -using NUnit.Framework; - -[TestFixture] -public class ReleaseBranchTests -{ - [Test] - public void CanTakeVersionFromReleaseBranch() - { - using (var fixture = new EmptyRepositoryFixture(new Config())) - { - fixture.Repository.MakeATaggedCommit("1.0.3"); - fixture.Repository.MakeCommits(5); - fixture.Repository.CreateBranch("release-2.0.0"); - fixture.Repository.Checkout("release-2.0.0"); - - fixture.AssertFullSemver("2.0.0-beta.1+0"); - fixture.Repository.MakeCommits(2); - fixture.AssertFullSemver("2.0.0-beta.1+2"); - } - } - - [Test] - public void CanTakeVersionFromReleaseBranchWithTagOverriden() - { - var config = new Config(); - config.Branches["release[/-]"].Tag = "rc"; - using (var fixture = new EmptyRepositoryFixture(config)) - { - fixture.Repository.MakeATaggedCommit("1.0.3"); - fixture.Repository.MakeCommits(5); - fixture.Repository.CreateBranch("release-2.0.0"); - fixture.Repository.Checkout("release-2.0.0"); - - fixture.AssertFullSemver("2.0.0-rc.1+0"); - fixture.Repository.MakeCommits(2); - fixture.AssertFullSemver("2.0.0-rc.1+2"); - } - } - - [Test] - public void WhenReleaseBranchIsMergedIntoMasterVersionIsTakenWithIt() - { - using (var fixture = new EmptyRepositoryFixture(new Config())) - { - fixture.Repository.MakeATaggedCommit("1.0.3"); - fixture.Repository.MakeCommits(1); - fixture.Repository.CreateBranch("release-2.0.0"); - fixture.Repository.Checkout("release-2.0.0"); - fixture.Repository.MakeCommits(4); - fixture.Repository.Checkout("master"); - fixture.Repository.MergeNoFF("release-2.0.0", Constants.SignatureNow()); - - fixture.AssertFullSemver("2.0.0+0"); - } - } - [Test] - public void WhenReleaseBranchIsMergedIntoMasterHighestVersionIsTakenWithIt() - { - using (var fixture = new EmptyRepositoryFixture(new Config())) - { - fixture.Repository.MakeATaggedCommit("1.0.3"); - fixture.Repository.MakeCommits(1); - - fixture.Repository.CreateBranch("release-2.0.0"); - fixture.Repository.Checkout("release-2.0.0"); - fixture.Repository.MakeCommits(4); - fixture.Repository.Checkout("master"); - fixture.Repository.MergeNoFF("release-2.0.0", Constants.SignatureNow()); - - fixture.Repository.CreateBranch("release-1.0.0"); - fixture.Repository.Checkout("release-1.0.0"); - fixture.Repository.MakeCommits(4); - fixture.Repository.Checkout("master"); - fixture.Repository.MergeNoFF("release-1.0.0", Constants.SignatureNow()); - - fixture.AssertFullSemver("2.0.0+5"); - } - } - - [Test] - public void WhenMergingReleaseBackToDevShouldNotResetBetaVersion() - { - using (var fixture = new EmptyRepositoryFixture(new Config())) - { - const string TaggedVersion = "1.0.3"; - fixture.Repository.MakeATaggedCommit(TaggedVersion); - fixture.Repository.CreateBranch("develop"); - fixture.Repository.Checkout("develop"); - - fixture.Repository.MakeCommits(1); - - fixture.Repository.CreateBranch("release-2.0.0"); - fixture.Repository.Checkout("release-2.0.0"); - fixture.Repository.MakeCommits(1); - - fixture.AssertFullSemver("2.0.0-beta.1+1"); - - //tag it to bump to beta 2 - fixture.Repository.ApplyTag("2.0.0-beta1"); - - fixture.Repository.MakeCommits(1); - - fixture.AssertFullSemver("2.0.0-beta.2+0"); - - //merge down to develop - fixture.Repository.Checkout("develop"); - fixture.Repository.MergeNoFF("release-2.0.0", Constants.SignatureNow()); - - //but keep working on the release - fixture.Repository.Checkout("release-2.0.0"); - - fixture.AssertFullSemver("2.0.0-beta.2+0"); - } - } -} \ No newline at end of file diff --git a/GitVersionCore.Tests/IntegrationTests/GitHubFlow/MasterTests.cs b/GitVersionCore.Tests/IntegrationTests/MasterTests.cs similarity index 98% rename from GitVersionCore.Tests/IntegrationTests/GitHubFlow/MasterTests.cs rename to GitVersionCore.Tests/IntegrationTests/MasterTests.cs index 994e515cbb..f7d25c5058 100644 --- a/GitVersionCore.Tests/IntegrationTests/GitHubFlow/MasterTests.cs +++ b/GitVersionCore.Tests/IntegrationTests/MasterTests.cs @@ -56,7 +56,7 @@ public void GivenARepositoryWithTagAndNextVersionInConfig_VersionShouldMatchVers [Test] public void GivenARepositoryWithTagAndANextVersionTxtFileAndNoCommits_VersionShouldBeTag() { - const string ExpectedNextVersion = "1.1.0"; + const string ExpectedNextVersion = "1.1.0"; using (var fixture = new EmptyRepositoryFixture(new Config { NextVersion = ExpectedNextVersion })) { const string TaggedVersion = "1.0.3"; diff --git a/GitVersionCore.Tests/IntegrationTests/GitFlow/MetaDataByCommitScenarios.cs b/GitVersionCore.Tests/IntegrationTests/MetaDataByCommitScenarios.cs similarity index 100% rename from GitVersionCore.Tests/IntegrationTests/GitFlow/MetaDataByCommitScenarios.cs rename to GitVersionCore.Tests/IntegrationTests/MetaDataByCommitScenarios.cs diff --git a/GitVersionCore.Tests/IntegrationTests/GitHubFlow/OtherBranchTests.cs b/GitVersionCore.Tests/IntegrationTests/OtherBranchTests.cs similarity index 90% rename from GitVersionCore.Tests/IntegrationTests/GitHubFlow/OtherBranchTests.cs rename to GitVersionCore.Tests/IntegrationTests/OtherBranchTests.cs index 11b3893fea..1e3a545c29 100644 --- a/GitVersionCore.Tests/IntegrationTests/GitHubFlow/OtherBranchTests.cs +++ b/GitVersionCore.Tests/IntegrationTests/OtherBranchTests.cs @@ -16,7 +16,7 @@ public void CanTakeVersionFromReleaseBranch() fixture.Repository.CreateBranch("alpha-2.0.0"); fixture.Repository.Checkout("alpha-2.0.0"); - fixture.AssertFullSemver("2.0.0-alpha.1+5"); + fixture.AssertFullSemver("2.0.0-alpha.1+0"); } } } \ No newline at end of file diff --git a/GitVersionCore.Tests/IntegrationTests/GitFlow/PatchScenarios.cs b/GitVersionCore.Tests/IntegrationTests/PatchScenarios.cs similarity index 74% rename from GitVersionCore.Tests/IntegrationTests/GitFlow/PatchScenarios.cs rename to GitVersionCore.Tests/IntegrationTests/PatchScenarios.cs index cf6189d8c1..ab9c7219c2 100644 --- a/GitVersionCore.Tests/IntegrationTests/GitFlow/PatchScenarios.cs +++ b/GitVersionCore.Tests/IntegrationTests/PatchScenarios.cs @@ -17,26 +17,26 @@ public void PatchLatestReleaseExample() fixture.Repository.MakeACommit(); fixture.AssertFullSemver("1.2.1-beta.1+1"); fixture.Repository.ApplyTag("1.2.1-beta.1"); - fixture.AssertFullSemver("1.2.1-beta.1+0"); + fixture.AssertFullSemver("1.2.1-beta.1+1"); fixture.Repository.MakeACommit(); - fixture.AssertFullSemver("1.2.1-beta.2+1"); + fixture.AssertFullSemver("1.2.1-beta.2+2"); // Merge hotfix branch to master fixture.Repository.Checkout("master"); fixture.Repository.MergeNoFF("hotfix-1.2.1", Constants.SignatureNow()); - fixture.AssertFullSemver("1.2.1"); + fixture.AssertFullSemver("1.2.1+0"); fixture.Repository.ApplyTag("1.2.1"); - fixture.AssertFullSemver("1.2.1"); + fixture.AssertFullSemver("1.2.1+0"); // Verify develop version fixture.Repository.Checkout("develop"); - fixture.AssertFullSemver("1.3.0-unstable.0+0"); + fixture.AssertFullSemver("1.3.0-unstable.1+1"); fixture.Repository.MergeNoFF("hotfix-1.2.1", Constants.SignatureNow()); - fixture.AssertFullSemver("1.3.0-unstable.1+1"); + fixture.AssertFullSemver("1.3.0-unstable.1+0"); } } @@ -50,22 +50,23 @@ public void PatchOlderReleaseExample() r.MakeATaggedCommit("1.2.0"); })) { + var targetCommit = ((Commit) fixture.Repository.Tags.Single(t => t.Name == "1.1.0").Target); // create hotfix branch - fixture.Repository.CreateBranch("hotfix-1.1.1", (Commit) fixture.Repository.Tags.Single(t => t.Name == "1.1.0").Target).Checkout(); + fixture.Repository.CreateBranch("hotfix-1.1.1", targetCommit).Checkout(); fixture.AssertFullSemver("1.1.1-beta.1+0"); fixture.Repository.MakeACommit(); fixture.AssertFullSemver("1.1.1-beta.1+1"); // Merge hotfix branch to support - fixture.Repository.CreateBranch("support-1.2", (Commit) fixture.Repository.Tags.Single(t => t.Name == "1.1.0").Target).Checkout(); - fixture.AssertFullSemver("1.1.0"); + fixture.Repository.CreateBranch("support-1.1", (Commit) fixture.Repository.Tags.Single(t => t.Name == "1.1.0").Target).Checkout(); + fixture.AssertFullSemver("1.1.0+0"); fixture.Repository.MergeNoFF("hotfix-1.1.1", Constants.SignatureNow()); - fixture.AssertFullSemver("1.1.1"); + fixture.AssertFullSemver("1.1.1+0"); fixture.Repository.ApplyTag("1.1.1"); - fixture.AssertFullSemver("1.1.1"); + fixture.AssertFullSemver("1.1.1+0"); // Verify develop version fixture.Repository.Checkout("develop"); diff --git a/GitVersionCore.Tests/IntegrationTests/PullRequestScenarios.cs b/GitVersionCore.Tests/IntegrationTests/PullRequestScenarios.cs index d6eceedd69..37fb557385 100644 --- a/GitVersionCore.Tests/IntegrationTests/PullRequestScenarios.cs +++ b/GitVersionCore.Tests/IntegrationTests/PullRequestScenarios.cs @@ -91,9 +91,8 @@ public void CanCalculatePullRequestChangesInheritingConfigFromRemoteRepo() fixture.Repository.Checkout("pull/2/merge"); // If we delete the branch, it is effectively the same as remote PR fixture.Repository.Branches.Remove("feature/Foo"); - - fixture.DumpGraph(); - fixture.AssertFullSemver("0.2.0-PullRequest.1+3"); + + fixture.AssertFullSemver("0.2.0-PullRequest.2+3"); } } } \ No newline at end of file diff --git a/GitVersionCore.Tests/IntegrationTests/GitFlow/ReleaseBranchTests.cs b/GitVersionCore.Tests/IntegrationTests/ReleaseBranchTests.cs similarity index 59% rename from GitVersionCore.Tests/IntegrationTests/GitFlow/ReleaseBranchTests.cs rename to GitVersionCore.Tests/IntegrationTests/ReleaseBranchTests.cs index dd7812fa08..58d32c5dde 100644 --- a/GitVersionCore.Tests/IntegrationTests/GitFlow/ReleaseBranchTests.cs +++ b/GitVersionCore.Tests/IntegrationTests/ReleaseBranchTests.cs @@ -11,7 +11,6 @@ public void CanTakeVersionFromReleaseBranch() using (var fixture = new EmptyRepositoryFixture(new Config())) { fixture.Repository.MakeATaggedCommit("1.0.3"); - fixture.Repository.CreateBranch("develop"); fixture.Repository.MakeCommits(5); fixture.Repository.CreateBranch("release-2.0.0"); fixture.Repository.Checkout("release-2.0.0"); @@ -30,7 +29,6 @@ public void CanTakeVersionFromReleaseBranchWithTagOverriden() using (var fixture = new EmptyRepositoryFixture(config)) { fixture.Repository.MakeATaggedCommit("1.0.3"); - fixture.Repository.CreateBranch("develop"); fixture.Repository.MakeCommits(5); fixture.Repository.CreateBranch("release-2.0.0"); fixture.Repository.Checkout("release-2.0.0"); @@ -59,13 +57,14 @@ public void CanHandleReleaseBranchWithStability() } [Test] - public void WhenReleaseBranchIsMergedIntoMasterVersionIsTakenWithIt() + public void WhenReleaseBranch_OffDevelop_IsMergedIntoMasterAndDevelop_VersionIsTakenWithIt() { using (var fixture = new EmptyRepositoryFixture(new Config())) { fixture.Repository.MakeATaggedCommit("1.0.3"); fixture.Repository.CreateBranch("develop"); fixture.Repository.MakeCommits(1); + fixture.Repository.CreateBranch("release-2.0.0"); fixture.Repository.Checkout("release-2.0.0"); fixture.Repository.MakeCommits(4); @@ -79,7 +78,24 @@ public void WhenReleaseBranchIsMergedIntoMasterVersionIsTakenWithIt() } [Test] - public void WhenReleaseBranchIsMergedIntoMasterHighestVersionIsTakenWithIt() + public void WhenReleaseBranch_OffMaster_IsMergedIntoMaster_VersionIsTakenWithIt() + { + using (var fixture = new EmptyRepositoryFixture(new Config())) + { + fixture.Repository.MakeATaggedCommit("1.0.3"); + fixture.Repository.MakeCommits(1); + fixture.Repository.CreateBranch("release-2.0.0"); + fixture.Repository.Checkout("release-2.0.0"); + fixture.Repository.MakeCommits(4); + fixture.Repository.Checkout("master"); + fixture.Repository.MergeNoFF("release-2.0.0", Constants.SignatureNow()); + + fixture.AssertFullSemver("2.0.0+0"); + } + } + + [Test] + public void WhenReleaseBranchIsMergedIntoDevelopHighestVersionIsTakenWithIt() { using (var fixture = new EmptyRepositoryFixture(new Config())) { @@ -90,9 +106,31 @@ public void WhenReleaseBranchIsMergedIntoMasterHighestVersionIsTakenWithIt() fixture.Repository.CreateBranch("release-2.0.0"); fixture.Repository.Checkout("release-2.0.0"); fixture.Repository.MakeCommits(4); - fixture.Repository.Checkout("master"); + fixture.Repository.Checkout("develop"); fixture.Repository.MergeNoFF("release-2.0.0", Constants.SignatureNow()); + + fixture.Repository.CreateBranch("release-1.0.0"); + fixture.Repository.Checkout("release-1.0.0"); + fixture.Repository.MakeCommits(4); fixture.Repository.Checkout("develop"); + fixture.Repository.MergeNoFF("release-1.0.0", Constants.SignatureNow()); + + fixture.AssertFullSemver("2.1.0-unstable.1+5"); + } + } + + [Test] + public void WhenReleaseBranchIsMergedIntoMasterHighestVersionIsTakenWithIt() + { + using (var fixture = new EmptyRepositoryFixture(new Config())) + { + fixture.Repository.MakeATaggedCommit("1.0.3"); + fixture.Repository.MakeCommits(1); + + fixture.Repository.CreateBranch("release-2.0.0"); + fixture.Repository.Checkout("release-2.0.0"); + fixture.Repository.MakeCommits(4); + fixture.Repository.Checkout("master"); fixture.Repository.MergeNoFF("release-2.0.0", Constants.SignatureNow()); fixture.Repository.CreateBranch("release-1.0.0"); @@ -100,10 +138,44 @@ public void WhenReleaseBranchIsMergedIntoMasterHighestVersionIsTakenWithIt() fixture.Repository.MakeCommits(4); fixture.Repository.Checkout("master"); fixture.Repository.MergeNoFF("release-1.0.0", Constants.SignatureNow()); + + fixture.AssertFullSemver("2.0.0+5"); + } + } + + [Test] + public void WhenMergingReleaseBackToDevShouldNotResetBetaVersion() + { + using (var fixture = new EmptyRepositoryFixture(new Config())) + { + const string TaggedVersion = "1.0.3"; + fixture.Repository.MakeATaggedCommit(TaggedVersion); + fixture.Repository.CreateBranch("develop"); fixture.Repository.Checkout("develop"); - fixture.Repository.MergeNoFF("release-1.0.0", Constants.SignatureNow()); - fixture.AssertFullSemver("2.0.0-unstable.1+5"); + fixture.Repository.MakeCommits(1); + + fixture.Repository.CreateBranch("release-2.0.0"); + fixture.Repository.Checkout("release-2.0.0"); + fixture.Repository.MakeCommits(1); + + fixture.AssertFullSemver("2.0.0-beta.1+1"); + + //tag it to bump to beta 2 + fixture.Repository.ApplyTag("2.0.0-beta1"); + + fixture.Repository.MakeCommits(1); + + fixture.AssertFullSemver("2.0.0-beta.2+2"); + + //merge down to develop + fixture.Repository.Checkout("develop"); + fixture.Repository.MergeNoFF("release-2.0.0", Constants.SignatureNow()); + + //but keep working on the release + fixture.Repository.Checkout("release-2.0.0"); + + fixture.AssertFullSemver("2.0.0-beta.2+3"); } } } \ No newline at end of file diff --git a/GitVersionCore.Tests/IntegrationTests/GitHubFlow/GitHubFlowSupportBranchScenarios.cs b/GitVersionCore.Tests/IntegrationTests/SupportBranchScenarios.cs similarity index 96% rename from GitVersionCore.Tests/IntegrationTests/GitHubFlow/GitHubFlowSupportBranchScenarios.cs rename to GitVersionCore.Tests/IntegrationTests/SupportBranchScenarios.cs index ee6e4cabd7..af8fab6f65 100644 --- a/GitVersionCore.Tests/IntegrationTests/GitHubFlow/GitHubFlowSupportBranchScenarios.cs +++ b/GitVersionCore.Tests/IntegrationTests/SupportBranchScenarios.cs @@ -3,7 +3,7 @@ using NUnit.Framework; [TestFixture] -public class GitHubFlowSupportBranchScenarios +public class SupportBranchScenarios { [Test] public void SupportIsCalculatedCorrectly() @@ -69,7 +69,7 @@ public void WhenSupportIsBranchedAndTaggedFromAnotherSupportEnsureNewMinorIsUsed fixture.Repository.MakeACommit(); fixture.Repository.MakeACommit(); - fixture.AssertFullSemver("1.3.1+0"); + fixture.AssertFullSemver("1.3.0+2"); } } } \ No newline at end of file diff --git a/GitVersionCore.Tests/IntegrationTests/GitFlow/SwitchingToGitFlowScenarios.cs b/GitVersionCore.Tests/IntegrationTests/SwitchingToGitFlowScenarios.cs similarity index 100% rename from GitVersionCore.Tests/IntegrationTests/GitFlow/SwitchingToGitFlowScenarios.cs rename to GitVersionCore.Tests/IntegrationTests/SwitchingToGitFlowScenarios.cs diff --git a/GitVersionCore.Tests/IntegrationTests/GitFlow/WikiScenarios.cs b/GitVersionCore.Tests/IntegrationTests/WikiScenarios.cs similarity index 100% rename from GitVersionCore.Tests/IntegrationTests/GitFlow/WikiScenarios.cs rename to GitVersionCore.Tests/IntegrationTests/WikiScenarios.cs diff --git a/GitVersionCore.Tests/Mocks/MockBranch.cs b/GitVersionCore.Tests/Mocks/MockBranch.cs index f4a2865d6f..11d08e158b 100644 --- a/GitVersionCore.Tests/Mocks/MockBranch.cs +++ b/GitVersionCore.Tests/Mocks/MockBranch.cs @@ -26,6 +26,8 @@ public MockBranch() public override string Name { get { return name; } } public override ICommitLog Commits { get { return commits; } } public override Commit Tip { get { return commits.First(); } } + public override bool IsTracking { get { return true; } } + public override string CanonicalName { get { return canonicalName; } diff --git a/GitVersionCore.Tests/TestEffectiveConfiguration.cs b/GitVersionCore.Tests/TestEffectiveConfiguration.cs index e0bb2704a4..a1470e8ac8 100644 --- a/GitVersionCore.Tests/TestEffectiveConfiguration.cs +++ b/GitVersionCore.Tests/TestEffectiveConfiguration.cs @@ -10,8 +10,9 @@ public TestEffectiveConfiguration( string gitTagPrefix = "v", string tag = "", string nextVersion = null, - string branchPrefixToTrim = "") : - base(assemblyVersioningScheme, versioningMode, gitTagPrefix, tag, nextVersion, IncrementStrategy.Patch, branchPrefixToTrim) + string branchPrefixToTrim = "", + bool preventIncrementForMergedBranchVersion = false) : + base(assemblyVersioningScheme, versioningMode, gitTagPrefix, tag, nextVersion, IncrementStrategy.Patch, branchPrefixToTrim, preventIncrementForMergedBranchVersion) { } } diff --git a/GitVersionCore.Tests/VersionCalculation/NewNextVersionCalculatorTests.cs b/GitVersionCore.Tests/VersionCalculation/NewNextVersionCalculatorTests.cs index dc61b7a4e1..8fda45ef48 100644 --- a/GitVersionCore.Tests/VersionCalculation/NewNextVersionCalculatorTests.cs +++ b/GitVersionCore.Tests/VersionCalculation/NewNextVersionCalculatorTests.cs @@ -15,15 +15,11 @@ public void ShouldIncrementVersionBasedOnConfig() var semanticVersionBuildMetaData = new SemanticVersionBuildMetaData(1, "master", "b1a34e", DateTimeOffset.Now); var sut = new NewNextVersionCalculator(baseCalculator, new TestMetaDataCalculator(semanticVersionBuildMetaData)); var config = new Config(); - config.Branches.Add("master", new BranchConfig - { - Increment = IncrementStrategy.Major - }); var context = new GitVersionContextBuilder().WithConfig(config).Build(); var version = sut.FindVersion(context); - version.ToString().ShouldBe("2.0.0"); + version.ToString().ShouldBe("1.0.1"); } [Test] @@ -33,10 +29,6 @@ public void DoesNotIncrementWhenBaseVersionSaysNotTo() var semanticVersionBuildMetaData = new SemanticVersionBuildMetaData(1, "master", "b1a34e", DateTimeOffset.Now); var sut = new NewNextVersionCalculator(baseCalculator, new TestMetaDataCalculator(semanticVersionBuildMetaData)); var config = new Config(); - config.Branches.Add("master", new BranchConfig - { - Increment = IncrementStrategy.Major - }); var context = new GitVersionContextBuilder().WithConfig(config).Build(); var version = sut.FindVersion(context); diff --git a/GitVersionCore.Tests/VersionCalculation/Strategies/VersionInBranchBaseVersionStrategyTests.cs b/GitVersionCore.Tests/VersionCalculation/Strategies/VersionInBranchBaseVersionStrategyTests.cs index 9900c795a5..ea8430d013 100644 --- a/GitVersionCore.Tests/VersionCalculation/Strategies/VersionInBranchBaseVersionStrategyTests.cs +++ b/GitVersionCore.Tests/VersionCalculation/Strategies/VersionInBranchBaseVersionStrategyTests.cs @@ -1,6 +1,8 @@ namespace GitVersionCore.Tests.VersionCalculation.Strategies { + using GitVersion; using GitVersion.VersionCalculation.BaseVersionCalculators; + using LibGit2Sharp; using NUnit.Framework; using Shouldly; @@ -16,19 +18,20 @@ public class VersionInBranchBaseVersionStrategyTests [TestCase("custom/JIRA-123", null)] public void CanTakeVersionFromBranchName(string branchName, string expectedBaseVersion) { - var context = new GitVersionContextBuilder() - .WithBranch(branchName) - .AddCommit() - .Build(); + var configuration = new Config(); + using (var fixture = new EmptyRepositoryFixture(configuration)) + { + fixture.Repository.MakeACommit(); + var branch = fixture.Repository.CreateBranch(branchName); + var sut = new VersionInBranchBaseVersionStrategy(); - var sut = new VersionInBranchBaseVersionStrategy(); + var baseVersion = sut.GetVersion(new GitVersionContext(fixture.Repository, branch, configuration)); - var baseVersion = sut.GetVersion(context); - - if (expectedBaseVersion == null) - baseVersion.ShouldBe(null); - else - baseVersion.SemanticVersion.ToString().ShouldBe(expectedBaseVersion); + if (expectedBaseVersion == null) + baseVersion.ShouldBe(null); + else + baseVersion.SemanticVersion.ToString().ShouldBe(expectedBaseVersion); + } } } } diff --git a/GitVersionCore/Configuration/BranchConfig.cs b/GitVersionCore/Configuration/BranchConfig.cs index b24942d096..a5717eb979 100644 --- a/GitVersionCore/Configuration/BranchConfig.cs +++ b/GitVersionCore/Configuration/BranchConfig.cs @@ -26,5 +26,8 @@ public BranchConfig(BranchConfig branchConfiguration) [YamlMember(Alias = "increment")] public IncrementStrategy? Increment { get; set; } + + [YamlMember(Alias = "preventIncrementOfMergedBranchVersion")] + public bool? PreventIncrementOfMergedBranchVersion { get; set; } } } diff --git a/GitVersionCore/Configuration/Config.cs b/GitVersionCore/Configuration/Config.cs index 6a1767fed0..16db0f0c6f 100644 --- a/GitVersionCore/Configuration/Config.cs +++ b/GitVersionCore/Configuration/Config.cs @@ -18,6 +18,7 @@ public Config() { Tag = string.Empty, Increment = IncrementStrategy.Patch, + PreventIncrementOfMergedBranchVersion = true }; Branches["release[/-]"] = new BranchConfig { Tag = "beta" }; Branches["feature[/-]"] = new BranchConfig @@ -26,6 +27,12 @@ public Config() Tag = "useBranchName" }; Branches["hotfix[/-]"] = new BranchConfig { Tag = "beta" }; + Branches["support[/-]"] = new BranchConfig + { + Tag = string.Empty, + Increment = IncrementStrategy.Patch, + PreventIncrementOfMergedBranchVersion = true + }; Branches["develop"] = new BranchConfig { Tag = "unstable", diff --git a/GitVersionCore/EffectiveConfiguration.cs b/GitVersionCore/EffectiveConfiguration.cs index 0c8a66c3ae..b7dd6cd946 100644 --- a/GitVersionCore/EffectiveConfiguration.cs +++ b/GitVersionCore/EffectiveConfiguration.cs @@ -5,7 +5,12 @@ /// public class EffectiveConfiguration { - public EffectiveConfiguration(AssemblyVersioningScheme assemblyVersioningScheme, VersioningMode versioningMode, string gitTagPrefix, string tag, string nextVersion, IncrementStrategy increment, string branchPrefixToTrim) + public EffectiveConfiguration( + AssemblyVersioningScheme assemblyVersioningScheme, + VersioningMode versioningMode, string gitTagPrefix, + string tag, string nextVersion, IncrementStrategy increment, + string branchPrefixToTrim, + bool preventIncrementForMergedBranchVersion) { AssemblyVersioningScheme = assemblyVersioningScheme; VersioningMode = versioningMode; @@ -14,6 +19,7 @@ public EffectiveConfiguration(AssemblyVersioningScheme assemblyVersioningScheme, NextVersion = nextVersion; Increment = increment; BranchPrefixToTrim = branchPrefixToTrim; + PreventIncrementForMergedBranchVersion = preventIncrementForMergedBranchVersion; } public VersioningMode VersioningMode { get; private set; } @@ -35,5 +41,7 @@ public EffectiveConfiguration(AssemblyVersioningScheme assemblyVersioningScheme, public IncrementStrategy Increment { get; private set; } public string BranchPrefixToTrim { get; private set; } + + public bool PreventIncrementForMergedBranchVersion { get; private set; } } } \ No newline at end of file diff --git a/GitVersionCore/GitVersionContext.cs b/GitVersionCore/GitVersionContext.cs index 25b6891ece..63831f17a0 100644 --- a/GitVersionCore/GitVersionContext.cs +++ b/GitVersionCore/GitVersionContext.cs @@ -11,7 +11,6 @@ /// public class GitVersionContext { - readonly bool IsContextForTrackedBranchesOnly; readonly Config configuration; public GitVersionContext(IRepository repository, Config configuration, bool isForTrackingBranchOnly = true) @@ -19,20 +18,21 @@ public GitVersionContext(IRepository repository, Config configuration, bool isFo { } - public GitVersionContext(IRepository repository, Branch currentBranch, Config configuration, bool isForTrackingBranchOnly = true) + public GitVersionContext(IRepository repository, Branch currentBranch, Config configuration, bool isForTrackingBranch = true) { Repository = repository; this.configuration = configuration; - IsContextForTrackedBranchesOnly = isForTrackingBranchOnly; + OnlyEvaluateTrackedBranches = isForTrackingBranch; if (currentBranch == null) throw new InvalidOperationException("Need a branch to operate on"); CurrentCommit = currentBranch.Tip; + IsCurrentCommitTagged = repository.Tags.Any(t => t.Target == CurrentCommit); - if (repository != null && currentBranch.IsDetachedHead()) + if (currentBranch.IsDetachedHead()) { - CurrentBranch = GetBranchesContainingCommit(CurrentCommit.Sha).OnlyOrDefault() ?? currentBranch; + CurrentBranch = CurrentCommit.GetBranchesContainingCommit(repository, OnlyEvaluateTrackedBranches).OnlyOrDefault() ?? currentBranch; } else { @@ -42,42 +42,12 @@ public GitVersionContext(IRepository repository, Branch currentBranch, Config co CalculateEffectiveConfiguration(); } + public bool OnlyEvaluateTrackedBranches { get; private set; } public EffectiveConfiguration Configuration { get; private set; } public IRepository Repository { get; private set; } public Branch CurrentBranch { get; private set; } public Commit CurrentCommit { get; private set; } - - IEnumerable GetBranchesContainingCommit(string commitSha) - { - var directBranchHasBeenFound = false; - foreach (var branch in Repository.Branches) - { - if (branch.Tip.Sha != commitSha || (IsContextForTrackedBranchesOnly && !branch.IsTracking)) - { - continue; - } - - directBranchHasBeenFound = true; - yield return branch; - } - - if (directBranchHasBeenFound) - { - yield break; - } - - foreach (var branch in Repository.Branches) - { - var commits = Repository.Commits.QueryBy(new CommitFilter { Since = branch }).Where(c => c.Sha == commitSha); - - if (!commits.Any()) - { - continue; - } - - yield return branch; - } - } + public bool IsCurrentCommitTagged { get; private set; } void CalculateEffectiveConfiguration() { @@ -89,14 +59,15 @@ void CalculateEffectiveConfiguration() var tag = currentBranchConfig.Value.Tag ?? "useBranchName"; var nextVersion = configuration.NextVersion; var incrementStrategy = currentBranchConfig.Value.Increment ?? IncrementStrategy.Patch; + var preventIncrementForMergedBranchVersion = currentBranchConfig.Value.PreventIncrementOfMergedBranchVersion ?? false; var assemblyVersioningScheme = configuration.AssemblyVersioningScheme; var gitTagPrefix = configuration.TagPrefix; - Configuration = new EffectiveConfiguration(assemblyVersioningScheme, versioningMode, gitTagPrefix, tag, nextVersion, incrementStrategy, currentBranchConfig.Key); + Configuration = new EffectiveConfiguration(assemblyVersioningScheme, versioningMode, gitTagPrefix, tag, nextVersion, incrementStrategy, currentBranchConfig.Key, preventIncrementForMergedBranchVersion); } KeyValuePair GetBranchConfiguration(Branch currentBranch) { - var matchingBranches = configuration.Branches.Where(b => Regex.IsMatch("^" + currentBranch.Name, b.Key)).ToArray(); + var matchingBranches = configuration.Branches.Where(b => Regex.IsMatch(currentBranch.Name, "^" + b.Key, RegexOptions.IgnoreCase)).ToArray(); if (matchingBranches.Length == 0) { @@ -121,6 +92,7 @@ KeyValuePair GetBranchConfiguration(Branch currentBranch) KeyValuePair InheritBranchConfiguration(Branch currentBranch, KeyValuePair keyValuePair, BranchConfig branchConfiguration) { + Logger.WriteInfo("Attempting to inherit branch configuration from parent branch"); var excludedBranches = new Branch[0]; // Check if we are a merge commit. If so likely we are a pull request var parentCount = CurrentCommit.Parents.Count(); @@ -141,9 +113,11 @@ KeyValuePair InheritBranchConfiguration(Branch currentBran { currentBranch = Repository.Branches.SingleOrDefault(b => !b.IsRemote && b.Tip == parents[0]) ?? currentBranch; } + + Logger.WriteInfo("HEAD is merge commit, this is likely a pull request using " + currentBranch.Name + " as base"); } - var branchPoint = currentBranch.FindCommitBranchWasBranchedFrom(Repository, excludedBranches); + var branchPoint = currentBranch.FindCommitBranchWasBranchedFrom(Repository, OnlyEvaluateTrackedBranches, excludedBranches); List possibleParents; if (branchPoint.Sha == CurrentCommit.Sha) @@ -162,6 +136,8 @@ KeyValuePair InheritBranchConfiguration(Branch currentBran .ToList(); } + Logger.WriteInfo("Found possible parent branches: " + string.Join(", ", possibleParents.Select(p => p.Name))); + // If it comes down to master and something, master is always first so we pick other branch if (possibleParents.Count == 2 && possibleParents.Any(p => p.Name == "master")) { @@ -178,7 +154,10 @@ KeyValuePair InheritBranchConfiguration(Branch currentBran }); } - throw new Exception("Failed to inherit Increment branch configuration"); + if (possibleParents.Count == 0) + throw new Exception("Failed to inherit Increment branch configuration, no branches found"); + + throw new Exception("Failed to inherit Increment branch configuration, ended up with: " + string.Join(", ", possibleParents.Select(p => p.Name))); } static IEnumerable ListBranchesContaininingCommit(IRepository repo, string commitSha, Branch[] excludedBranches) diff --git a/GitVersionCore/LibGitExtensions.cs b/GitVersionCore/LibGitExtensions.cs index ec87573844..ebe289f8e4 100644 --- a/GitVersionCore/LibGitExtensions.cs +++ b/GitVersionCore/LibGitExtensions.cs @@ -24,10 +24,44 @@ public static Branch FindBranch(this IRepository repository, string branchName) return repository.Branches.FirstOrDefault(x => x.Name == "origin/" + branchName); } - public static Commit FindCommitBranchWasBranchedFrom(this Branch branch, IRepository repository, params Branch[] excludedBranches) + public static Commit FindCommitBranchWasBranchedFrom(this Branch branch, IRepository repository, bool onlyTrackedBranches, params Branch[] excludedBranches) { + var currentBranches = branch.Tip.GetBranchesContainingCommit(repository, onlyTrackedBranches).ToList(); var tips = repository.Branches.Except(excludedBranches).Where(b => b != branch && !b.IsRemote).Select(b => b.Tip).ToList(); - return branch.Commits.FirstOrDefault(c => tips.Contains(c) || c.Parents.Count() > 1) ?? branch.Tip; + var branchPoint = branch.Commits.FirstOrDefault(c => tips.Contains(c) || c.GetBranchesContainingCommit(repository, onlyTrackedBranches).Count() > currentBranches.Count); + return branchPoint ?? branch.Tip; + } + + public static IEnumerable GetBranchesContainingCommit(this Commit commit, IRepository repository, bool onlyTrackedBranches) + { + var directBranchHasBeenFound = false; + foreach (var branch in repository.Branches) + { + if (branch.Tip.Sha != commit.Sha || (onlyTrackedBranches && !branch.IsTracking)) + { + continue; + } + + directBranchHasBeenFound = true; + yield return branch; + } + + if (directBranchHasBeenFound) + { + yield break; + } + + foreach (var branch in repository.Branches) + { + var commits = repository.Commits.QueryBy(new CommitFilter { Since = branch }).Where(c => c.Sha == commit.Sha); + + if (!commits.Any()) + { + continue; + } + + yield return branch; + } } public static IEnumerable TagsByDate(this IRepository repository, Commit commit) diff --git a/GitVersionCore/VersionCalculation/BaseVersionCalculators/ConfigNextVersionBaseVersionStrategy.cs b/GitVersionCore/VersionCalculation/BaseVersionCalculators/ConfigNextVersionBaseVersionStrategy.cs index d2d971e3e6..8c5c99da2e 100644 --- a/GitVersionCore/VersionCalculation/BaseVersionCalculators/ConfigNextVersionBaseVersionStrategy.cs +++ b/GitVersionCore/VersionCalculation/BaseVersionCalculators/ConfigNextVersionBaseVersionStrategy.cs @@ -4,7 +4,7 @@ public class ConfigNextVersionBaseVersionStrategy : BaseVersionStrategy { public override BaseVersion GetVersion(GitVersionContext context) { - if (string.IsNullOrEmpty(context.Configuration.NextVersion)) + if (string.IsNullOrEmpty(context.Configuration.NextVersion) || context.IsCurrentCommitTagged) return null; var semanticVersion = SemanticVersion.Parse(context.Configuration.NextVersion, context.Configuration.GitTagPrefix); return new BaseVersion("NextVersion in GitVersionConfig.yaml", false, true, semanticVersion, null, null); diff --git a/GitVersionCore/VersionCalculation/BaseVersionCalculators/MergeMessageBaseVersionStrategy.cs b/GitVersionCore/VersionCalculation/BaseVersionCalculators/MergeMessageBaseVersionStrategy.cs index 3cc422f936..39e74e1f87 100644 --- a/GitVersionCore/VersionCalculation/BaseVersionCalculators/MergeMessageBaseVersionStrategy.cs +++ b/GitVersionCore/VersionCalculation/BaseVersionCalculators/MergeMessageBaseVersionStrategy.cs @@ -14,10 +14,13 @@ public override BaseVersion GetVersion(GitVersionContext context) SemanticVersion semanticVersion; // TODO when this approach works, inline the other class into here if (MergeMessageParser.TryParse(c, context.Configuration, out semanticVersion)) + { + var shouldIncrement = !context.Configuration.PreventIncrementForMergedBranchVersion; return new[] { - new BaseVersion(string.Format("Merge message '{0}'", c.Message.Trim()), false, true, semanticVersion, c, null) + new BaseVersion(string.Format("Merge message '{0}'", c.Message.Trim()), shouldIncrement, true, semanticVersion, c, null) }; + } return Enumerable.Empty(); }) .ToArray(); diff --git a/GitVersionCore/VersionCalculation/BaseVersionCalculators/VersionInBranchBaseVersionStrategy.cs b/GitVersionCore/VersionCalculation/BaseVersionCalculators/VersionInBranchBaseVersionStrategy.cs index f2d0bfe2d1..5cbf22cc83 100644 --- a/GitVersionCore/VersionCalculation/BaseVersionCalculators/VersionInBranchBaseVersionStrategy.cs +++ b/GitVersionCore/VersionCalculation/BaseVersionCalculators/VersionInBranchBaseVersionStrategy.cs @@ -9,7 +9,7 @@ public override BaseVersion GetVersion(GitVersionContext context) var versionInBranch = GetVersionInBranch(context); if (versionInBranch != null) { - var commitBranchWasBranchedFrom = context.CurrentBranch.FindCommitBranchWasBranchedFrom(context.Repository); + var commitBranchWasBranchedFrom = context.CurrentBranch.FindCommitBranchWasBranchedFrom(context.Repository, context.OnlyEvaluateTrackedBranches); var branchNameOverride = context.CurrentBranch.Name.RegexReplace("[-/]" + versionInBranch.Item1, string.Empty); return new BaseVersion("Version in branch name", false, true, versionInBranch.Item2, commitBranchWasBranchedFrom, branchNameOverride); } diff --git a/GitVersionCore/VersionCalculation/NewNextVersionCalculator.cs b/GitVersionCore/VersionCalculation/NewNextVersionCalculator.cs index 6d9c40f5c9..81cd7d135f 100644 --- a/GitVersionCore/VersionCalculation/NewNextVersionCalculator.cs +++ b/GitVersionCore/VersionCalculation/NewNextVersionCalculator.cs @@ -8,15 +8,17 @@ public class NewNextVersionCalculator { IBaseVersionCalculator baseVersionFinder; IMetaDataCalculator metaDataCalculator; + LastTagBaseVersionStrategy lastTagBaseVersionStrategy; public NewNextVersionCalculator(IBaseVersionCalculator baseVersionCalculator = null, IMetaDataCalculator metaDataCalculator = null) { this.metaDataCalculator = metaDataCalculator ?? new MetaDataCalculator(); + lastTagBaseVersionStrategy = new LastTagBaseVersionStrategy(); baseVersionFinder = baseVersionCalculator ?? new BaseVersionCalculator( new FallbackBaseVersionStrategy(), new ConfigNextVersionBaseVersionStrategy(), - new LastTagBaseVersionStrategy(), + lastTagBaseVersionStrategy, new MergeMessageBaseVersionStrategy(), new VersionInBranchBaseVersionStrategy()); } @@ -37,7 +39,17 @@ public SemanticVersion FindVersion(GitVersionContext context) var name = baseVersion.BranchNameOverride ?? context.CurrentBranch.Name; tagToUse = name.RegexReplace(context.Configuration.BranchPrefixToTrim, string.Empty, RegexOptions.IgnoreCase); } - baseVersion.SemanticVersion.PreReleaseTag = new SemanticVersionPreReleaseTag(tagToUse, 1); + int? number = 1; + var lastTag = lastTagBaseVersionStrategy.GetVersion(context); + if (lastTag != null && + !context.IsCurrentCommitTagged && + MajorMinorPatchEqual(lastTag.SemanticVersion, baseVersion.SemanticVersion) && + lastTag.SemanticVersion.PreReleaseTag.HasTag()) + { + number = lastTag.SemanticVersion.PreReleaseTag.Number + 1; + } + + baseVersion.SemanticVersion.PreReleaseTag = new SemanticVersionPreReleaseTag(tagToUse, number); } baseVersion.SemanticVersion.BuildMetaData = metaDataCalculator.Create(baseVersion.BaseVersionSource, context); @@ -45,6 +57,13 @@ public SemanticVersion FindVersion(GitVersionContext context) return baseVersion.SemanticVersion; } + static bool MajorMinorPatchEqual(SemanticVersion lastTag, SemanticVersion baseVersion) + { + return lastTag.Major == baseVersion.Major && + lastTag.Minor == baseVersion.Minor && + lastTag.Patch == baseVersion.Patch; + } + static void IncrementVersion(GitVersionContext context, BaseVersion baseVersion) { if (!baseVersion.SemanticVersion.PreReleaseTag.HasTag()) @@ -57,9 +76,12 @@ static void IncrementVersion(GitVersionContext context, BaseVersion baseVersion) case IncrementStrategy.Major: Logger.WriteInfo("Incrementing Major Version"); baseVersion.SemanticVersion.Major++; + baseVersion.SemanticVersion.Minor = 0; + baseVersion.SemanticVersion.Patch = 0; break; case IncrementStrategy.Minor: baseVersion.SemanticVersion.Minor++; + baseVersion.SemanticVersion.Patch = 0; Logger.WriteInfo("Incrementing Minor Version"); break; case IncrementStrategy.Patch: diff --git a/GitVersionTask.Tests/GitFlow/GitFlowVersionFinderTests.cs b/GitVersionTask.Tests/GitFlow/GitFlowVersionFinderTests.cs index c36a91aac9..7512a99248 100644 --- a/GitVersionTask.Tests/GitFlow/GitFlowVersionFinderTests.cs +++ b/GitVersionTask.Tests/GitFlow/GitFlowVersionFinderTests.cs @@ -1,5 +1,4 @@ -using System.IO; -using GitVersion; +using GitVersion; using LibGit2Sharp; using NUnit.Framework; using ObjectApproval; @@ -23,64 +22,6 @@ public void RequiresALocalMasterBranch() } } - [Test, Ignore("Need a way to enforce this check")] - public void RequiresALocalDevelopBranch() - { - var repoPath = Clone(ASBMTestRepoWorkingDirPath); - using (var repo = new Repository(repoPath)) - { - repo.Branches["feature/one"].ForceCheckout(); - - repo.Branches.Remove("develop"); - - var finder = new GitVersionFinder(); - - Assert.Throws(() => finder.FindVersion(new GitVersionContext(repo, new Config()))); - } - } - - [Test] - public void AHotfixBranchIsRequiredToBranchOffOfMasterBranch() - { - var repoPath = Clone(ASBMTestRepoWorkingDirPath); - using (var repo = new Repository(repoPath)) - { - const string branchName = "hotfix/1.0.2"; - - // Create a new unborn hotfix branch sharing no history with "master" - repo.Refs.UpdateTarget(repo.Refs.Head.CanonicalName, "refs/heads/" + branchName); - - AddOneCommitToHead(repo, "hotfix"); - - var feature = repo.Branches[branchName]; - - var finder = new GitVersionFinder(); - - Assert.Throws(() => finder.FindVersion(new GitVersionContext(repo, feature, new Config()))); - } - } - - [Test] - public void APullRequestBranchIsRequiredToBranchOffOfDevelopBranch() - { - var repoPath = Clone(ASBMTestRepoWorkingDirPath); - using (var repo = new Repository(repoPath)) - { - const string branchName = "pull/1735/merge"; - - // Create a new unborn pull request branch sharing no history with "develop" - repo.Refs.UpdateTarget(repo.Refs.Head.CanonicalName, "refs/heads/" + branchName); - - AddOneCommitToHead(repo, "code"); - - var pull = repo.Branches[branchName]; - - var finder = new GitVersionFinder(); - - Assert.Throws(() => finder.FindVersion(new GitVersionContext(repo, pull, new Config()))); - } - } - [Test] public void AFeatureBranchDoesNotRequireASpecificPrefix() { @@ -122,30 +63,4 @@ public void AFeatureBranchPrefixIsNotIncludedInTag() ObjectApprover.VerifyWithJson(versionAndBranch, Scrubbers.GuidAndDateScrubber); } } - - [Test] - public void AReleaseBranchIsRequiredToBranchOffOfDevelopBranch() - { - var repoPath = Clone(ASBMTestRepoWorkingDirPath); - using (var repo = new Repository(repoPath)) - { - const string branchName = "release/1.2.0"; - - // Create a new unborn release branch sharing no history with "develop" - repo.Refs.UpdateTarget(repo.Refs.Head.CanonicalName, "refs/heads/" + branchName); - - var path = Path.Combine(repo.Info.WorkingDirectory, "README"); - File.AppendAllText(path, "Release\n"); - - repo.Stage(path); - var sign = SignatureBuilder.SignatureNow(); - repo.Commit("release unborn", sign, sign); - - var feature = repo.Branches[branchName]; - - var finder = new GitVersionFinder(); - - Assert.Throws(() => finder.FindVersion(new GitVersionContext(repo, feature, new Config()))); - } - } } \ No newline at end of file diff --git a/GitVersionTask.Tests/GitFlow/GitVersionFinderTests.AFeatureBranchDoesNotRequireASpecificPrefix.approved.txt b/GitVersionTask.Tests/GitFlow/GitVersionFinderTests.AFeatureBranchDoesNotRequireASpecificPrefix.approved.txt index 838ceacca0..31e0f9e5d3 100644 --- a/GitVersionTask.Tests/GitFlow/GitVersionFinderTests.AFeatureBranchDoesNotRequireASpecificPrefix.approved.txt +++ b/GitVersionTask.Tests/GitFlow/GitVersionFinderTests.AFeatureBranchDoesNotRequireASpecificPrefix.approved.txt @@ -1,10 +1,10 @@ { "Major": 1, - "Minor": 1, - "Patch": 0, + "Minor": 0, + "Patch": 2, "PreReleaseTag": { "Name": "every-feature-is-welcome", - "Number": null + "Number": 1 }, "BuildMetaData": { "CommitsSinceTag": 1, diff --git a/GitVersionTask.Tests/GitFlow/GitVersionFinderTests.AFeatureBranchPrefixIsNotIncludedInTag.approved.txt b/GitVersionTask.Tests/GitFlow/GitVersionFinderTests.AFeatureBranchPrefixIsNotIncludedInTag.approved.txt index a7a459f70c..11a2f20b3a 100644 --- a/GitVersionTask.Tests/GitFlow/GitVersionFinderTests.AFeatureBranchPrefixIsNotIncludedInTag.approved.txt +++ b/GitVersionTask.Tests/GitFlow/GitVersionFinderTests.AFeatureBranchPrefixIsNotIncludedInTag.approved.txt @@ -4,7 +4,7 @@ "Patch": 0, "PreReleaseTag": { "Name": "ABC-1234_SomeDescription", - "Number": null + "Number": 1 }, "BuildMetaData": { "CommitsSinceTag": 1, diff --git a/GitVersionTask.Tests/UpdateAssemblyInfoTests.cs b/GitVersionTask.Tests/UpdateAssemblyInfoTests.cs index dd578b103f..e80fb7634f 100644 --- a/GitVersionTask.Tests/UpdateAssemblyInfoTests.cs +++ b/GitVersionTask.Tests/UpdateAssemblyInfoTests.cs @@ -70,7 +70,6 @@ public void StandardExecutionMode_CanDetermineTheVersionFromALocalDevelop() public void StandardExecutionMode_CanDetermineTheVersionFromALocalFeature() { var repoPath = CheckoutLocal(ASBMTestRepoWorkingDirPath, "refs/heads/feature/one"); - var task = new UpdateAssemblyInfo { BuildEngine = new MockBuildEngine(),