From 87f2519281ae70e6b17f590592464fe1e159862c Mon Sep 17 00:00:00 2001 From: Jake Ginnivan Date: Sat, 10 Jan 2015 21:10:34 +0000 Subject: [PATCH 1/8] Starting on base version calculators --- .../GitVersionCore.Tests.csproj | 3 ++ .../BaseVersionCalculatorTests.cs | 41 ++++++++++++++++++ ...nfigNextVersionBaseVersionStrategyTests.cs | 38 ++++++++++++++++ .../Strategies/GitVersionContextBuilder.cs | 43 +++++++++++++++++++ GitVersionCore/GitVersionCore.csproj | 5 +++ GitVersionCore/SemanticVersion.cs | 5 ++- .../BaseVersionCalculator.cs | 23 ++++++++++ .../BaseVersionCalculators/BaseVersion.cs | 15 +++++++ .../ConfigNextVersionBaseVersionStrategy.cs | 12 ++++++ .../VersionCalculation/BaseVersionStrategy.cs | 9 ++++ 10 files changed, 193 insertions(+), 1 deletion(-) create mode 100644 GitVersionCore.Tests/VersionCalculation/BaseVersionCalculatorTests.cs create mode 100644 GitVersionCore.Tests/VersionCalculation/Strategies/ConfigNextVersionBaseVersionStrategyTests.cs create mode 100644 GitVersionCore.Tests/VersionCalculation/Strategies/GitVersionContextBuilder.cs create mode 100644 GitVersionCore/VersionCalculation/BaseVersionCalculator.cs create mode 100644 GitVersionCore/VersionCalculation/BaseVersionCalculators/BaseVersion.cs create mode 100644 GitVersionCore/VersionCalculation/BaseVersionCalculators/ConfigNextVersionBaseVersionStrategy.cs create mode 100644 GitVersionCore/VersionCalculation/BaseVersionStrategy.cs diff --git a/GitVersionCore.Tests/GitVersionCore.Tests.csproj b/GitVersionCore.Tests/GitVersionCore.Tests.csproj index 1ee1fb42dc..0507766986 100644 --- a/GitVersionCore.Tests/GitVersionCore.Tests.csproj +++ b/GitVersionCore.Tests/GitVersionCore.Tests.csproj @@ -115,6 +115,9 @@ + + + diff --git a/GitVersionCore.Tests/VersionCalculation/BaseVersionCalculatorTests.cs b/GitVersionCore.Tests/VersionCalculation/BaseVersionCalculatorTests.cs new file mode 100644 index 0000000000..19bc4d6a4c --- /dev/null +++ b/GitVersionCore.Tests/VersionCalculation/BaseVersionCalculatorTests.cs @@ -0,0 +1,41 @@ +namespace GitVersionCore.Tests.VersionCalculation +{ + using GitVersion; + using GitVersion.VersionCalculation; + using GitVersion.VersionCalculation.BaseVersionCalculators; + using GitVersionCore.Tests.VersionCalculation.Strategies; + using NUnit.Framework; + using Shouldly; + + [TestFixture] + public class BaseVersionCalculatorTests + { + [Test] + public void ChoosesHighestVersionReturnedFromStrategies() + { + var context = new GitVersionContextBuilder().Build(); + var sut = new BaseVersionCalculator(new V1Strategy(), new V2Strategy()); + + var baseVersion = sut.GetBaseVersion(context); + + baseVersion.SemanticVersion.ToString().ShouldBe("2.0.0"); + baseVersion.ShouldIncrement.ShouldBe(true); + } + + class V1Strategy : BaseVersionStrategy + { + public override BaseVersion GetVersion(GitVersionContext context) + { + return new BaseVersion(false, new SemanticVersion(1)); + } + } + + class V2Strategy : BaseVersionStrategy + { + public override BaseVersion GetVersion(GitVersionContext context) + { + return new BaseVersion(true, new SemanticVersion(2)); + } + } + } +} \ No newline at end of file diff --git a/GitVersionCore.Tests/VersionCalculation/Strategies/ConfigNextVersionBaseVersionStrategyTests.cs b/GitVersionCore.Tests/VersionCalculation/Strategies/ConfigNextVersionBaseVersionStrategyTests.cs new file mode 100644 index 0000000000..d68469ccfd --- /dev/null +++ b/GitVersionCore.Tests/VersionCalculation/Strategies/ConfigNextVersionBaseVersionStrategyTests.cs @@ -0,0 +1,38 @@ +namespace GitVersionCore.Tests.VersionCalculation.Strategies +{ + using GitVersion; + using GitVersion.VersionCalculation.BaseVersionCalculators; + using NUnit.Framework; + using Shouldly; + + [TestFixture] + public class ConfigNextVersionBaseVersionStrategyTests + { + [Test] + public void ShouldNotBeIncremented() + { + var contextBuilder = new GitVersionContextBuilder() + .WithConfig(new Config + { + NextVersion = "1.0.0" + }); + var sut = new ConfigNextVersionBaseVersionStrategy(); + + var baseVersion = sut.GetVersion(contextBuilder.Build()); + + baseVersion.ShouldIncrement.ShouldBe(false); + baseVersion.SemanticVersion.ToString().ShouldBe("1.0.0"); + } + + [Test] + public void ReturnsNullWhenNoNextVersionIsInConfig() + { + var contextBuilder = new GitVersionContextBuilder(); + var sut = new ConfigNextVersionBaseVersionStrategy(); + + var baseVersion = sut.GetVersion(contextBuilder.Build()); + + baseVersion.ShouldBe(null); + } + } +} \ No newline at end of file diff --git a/GitVersionCore.Tests/VersionCalculation/Strategies/GitVersionContextBuilder.cs b/GitVersionCore.Tests/VersionCalculation/Strategies/GitVersionContextBuilder.cs new file mode 100644 index 0000000000..a1799dde04 --- /dev/null +++ b/GitVersionCore.Tests/VersionCalculation/Strategies/GitVersionContextBuilder.cs @@ -0,0 +1,43 @@ +namespace GitVersionCore.Tests.VersionCalculation.Strategies +{ + using GitVersion; + using LibGit2Sharp; + + public class GitVersionContextBuilder + { + IRepository repository; + Config config; + + public GitVersionContextBuilder WithRepository(IRepository repository) + { + this.repository = repository; + return this; + } + + public GitVersionContextBuilder WithConfig(Config config) + { + this.config = config; + return this; + } + + public GitVersionContext Build() + { + return new GitVersionContext(repository ?? CreateRepository(), config ?? new Config()); + } + + IRepository CreateRepository() + { + var mockBranch = new MockBranch("master") { new MockCommit { CommitterEx = SignatureBuilder.SignatureNow() } }; + var mockRepository = new MockRepository + { + Branches = new MockBranchCollection + { + mockBranch + }, + Head = mockBranch + }; + + return mockRepository; + } + } +} \ No newline at end of file diff --git a/GitVersionCore/GitVersionCore.csproj b/GitVersionCore/GitVersionCore.csproj index a906b5bb25..500759318e 100644 --- a/GitVersionCore/GitVersionCore.csproj +++ b/GitVersionCore/GitVersionCore.csproj @@ -87,6 +87,10 @@ + + + + @@ -144,6 +148,7 @@ + diff --git a/GitVersionCore/SemanticVersion.cs b/GitVersionCore/SemanticVersion.cs index 77e628ce14..e5a4778854 100644 --- a/GitVersionCore/SemanticVersion.cs +++ b/GitVersionCore/SemanticVersion.cs @@ -15,8 +15,11 @@ public class SemanticVersion : IFormattable, IComparable public SemanticVersionPreReleaseTag PreReleaseTag; public SemanticVersionBuildMetaData BuildMetaData; - public SemanticVersion() + public SemanticVersion(int major = 0, int minor = 0, int patch = 0) { + Major = major; + Minor = minor; + Patch = patch; PreReleaseTag = new SemanticVersionPreReleaseTag(); BuildMetaData = new SemanticVersionBuildMetaData(); } diff --git a/GitVersionCore/VersionCalculation/BaseVersionCalculator.cs b/GitVersionCore/VersionCalculation/BaseVersionCalculator.cs new file mode 100644 index 0000000000..e3a79ad8a8 --- /dev/null +++ b/GitVersionCore/VersionCalculation/BaseVersionCalculator.cs @@ -0,0 +1,23 @@ +namespace GitVersion.VersionCalculation +{ + using System.Linq; + using GitVersion.VersionCalculation.BaseVersionCalculators; + + public class BaseVersionCalculator + { + readonly BaseVersionStrategy[] strategies; + + public BaseVersionCalculator(params BaseVersionStrategy[] strategies) + { + this.strategies = strategies; + } + + public BaseVersion GetBaseVersion(GitVersionContext context) + { + return strategies + .Select(s => s.GetVersion(context)) + .Where(v => v != null) + .Aggregate((v1, v2) => v1.SemanticVersion > v2.SemanticVersion ? v1 : v2); + } + } +} \ No newline at end of file diff --git a/GitVersionCore/VersionCalculation/BaseVersionCalculators/BaseVersion.cs b/GitVersionCore/VersionCalculation/BaseVersionCalculators/BaseVersion.cs new file mode 100644 index 0000000000..da4b3f0249 --- /dev/null +++ b/GitVersionCore/VersionCalculation/BaseVersionCalculators/BaseVersion.cs @@ -0,0 +1,15 @@ +namespace GitVersion.VersionCalculation.BaseVersionCalculators +{ + public class BaseVersion + { + public BaseVersion(bool shouldIncrement, SemanticVersion semanticVersion) + { + ShouldIncrement = shouldIncrement; + SemanticVersion = semanticVersion; + } + + public bool ShouldIncrement { get; private set; } + + public SemanticVersion SemanticVersion { get; private set; } + } +} \ No newline at end of file diff --git a/GitVersionCore/VersionCalculation/BaseVersionCalculators/ConfigNextVersionBaseVersionStrategy.cs b/GitVersionCore/VersionCalculation/BaseVersionCalculators/ConfigNextVersionBaseVersionStrategy.cs new file mode 100644 index 0000000000..1b61e6ffce --- /dev/null +++ b/GitVersionCore/VersionCalculation/BaseVersionCalculators/ConfigNextVersionBaseVersionStrategy.cs @@ -0,0 +1,12 @@ +namespace GitVersion.VersionCalculation.BaseVersionCalculators +{ + public class ConfigNextVersionBaseVersionStrategy : BaseVersionStrategy + { + public override BaseVersion GetVersion(GitVersionContext context) + { + if (string.IsNullOrEmpty(context.Configuration.NextVersion)) + return null; + return new BaseVersion(false, SemanticVersion.Parse(context.Configuration.NextVersion, context.Configuration.GitTagPrefix)); + } + } +} \ No newline at end of file diff --git a/GitVersionCore/VersionCalculation/BaseVersionStrategy.cs b/GitVersionCore/VersionCalculation/BaseVersionStrategy.cs new file mode 100644 index 0000000000..855d4cbc3a --- /dev/null +++ b/GitVersionCore/VersionCalculation/BaseVersionStrategy.cs @@ -0,0 +1,9 @@ +namespace GitVersion.VersionCalculation +{ + using GitVersion.VersionCalculation.BaseVersionCalculators; + + public abstract class BaseVersionStrategy + { + public abstract BaseVersion GetVersion(GitVersionContext context); + } +} \ No newline at end of file From 8945cfe3d438c18fa33d68e979af337183d28c8d Mon Sep 17 00:00:00 2001 From: Jake Ginnivan Date: Sat, 10 Jan 2015 21:28:19 +0000 Subject: [PATCH 2/8] Added merge message base version strategy --- .../GitVersionCore.Tests.csproj | 1 + .../MergeMessageBaseVersionStrategyTests.cs | 106 ++++++++++++++++++ GitVersionCore/GitVersionCore.csproj | 1 + GitVersionCore/MergeMessageParser.cs | 6 +- .../MergeMessageBaseVersionStrategy.cs | 15 +++ 5 files changed, 126 insertions(+), 3 deletions(-) create mode 100644 GitVersionCore.Tests/VersionCalculation/Strategies/MergeMessageBaseVersionStrategyTests.cs create mode 100644 GitVersionCore/VersionCalculation/BaseVersionCalculators/MergeMessageBaseVersionStrategy.cs diff --git a/GitVersionCore.Tests/GitVersionCore.Tests.csproj b/GitVersionCore.Tests/GitVersionCore.Tests.csproj index 0507766986..6930b8d189 100644 --- a/GitVersionCore.Tests/GitVersionCore.Tests.csproj +++ b/GitVersionCore.Tests/GitVersionCore.Tests.csproj @@ -118,6 +118,7 @@ + diff --git a/GitVersionCore.Tests/VersionCalculation/Strategies/MergeMessageBaseVersionStrategyTests.cs b/GitVersionCore.Tests/VersionCalculation/Strategies/MergeMessageBaseVersionStrategyTests.cs new file mode 100644 index 0000000000..881c2ce29c --- /dev/null +++ b/GitVersionCore.Tests/VersionCalculation/Strategies/MergeMessageBaseVersionStrategyTests.cs @@ -0,0 +1,106 @@ +namespace GitVersionCore.Tests.VersionCalculation.Strategies +{ + using System.Collections.Generic; + using GitVersion.VersionCalculation.BaseVersionCalculators; + using LibGit2Sharp; + using NUnit.Framework; + using Shouldly; + + [TestFixture] + public class MergeMessageBaseVersionStrategyTests + { + [Test] + public void ShouldAllowIncrementOfVersion() + { + var context = new GitVersionContextBuilder().WithRepository(new MockRepository + { + Head = new MockBranch("master") { new MockCommit + { + MessageEx = "Merge branch 'hotfix-0.1.5'", + ParentsEx = GetParents(true) + } } + }).Build(); + var sut = new MergeMessageBaseVersionStrategy(); + + var baseVersion = sut.GetVersion(context); + + baseVersion.ShouldIncrement.ShouldBe(true); + } + + [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 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-0.1.5'", true, "0.1.5")] + [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("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 + public void AssertMergeMessage(string message, bool isMergeCommit, string expectedVersion) + { + var parents = GetParents(isMergeCommit); + AssertMergeMessage(message, expectedVersion, parents); + AssertMergeMessage(message + " ", expectedVersion, parents); + AssertMergeMessage(message + "\r ", expectedVersion, parents); + AssertMergeMessage(message + "\r", expectedVersion, parents); + AssertMergeMessage(message + "\r\n", expectedVersion, parents); + AssertMergeMessage(message + "\r\n ", expectedVersion, parents); + AssertMergeMessage(message + "\n", expectedVersion, parents); + AssertMergeMessage(message + "\n ", expectedVersion, parents); + } + + static void AssertMergeMessage(string message, string expectedVersion, List parents) + { + var commit = new MockCommit + { + MessageEx = message, + ParentsEx = parents + }; + + var context = new GitVersionContextBuilder() + .WithRepository(new MockRepository + { + Head = new MockBranch("master") { commit } + }) + .Build(); + var sut = new MergeMessageBaseVersionStrategy(); + + var baseVersion = sut.GetVersion(context); + + if (expectedVersion == null) + { + baseVersion.ShouldBe(null); + } + else + { + baseVersion.SemanticVersion.ToString().ShouldBe(expectedVersion); + } + } + + static List GetParents(bool isMergeCommit) + { + if (isMergeCommit) + { + return new List + { + null, + null + }; + } + return new List + { + null + }; + } + } +} \ No newline at end of file diff --git a/GitVersionCore/GitVersionCore.csproj b/GitVersionCore/GitVersionCore.csproj index 500759318e..49636ff95f 100644 --- a/GitVersionCore/GitVersionCore.csproj +++ b/GitVersionCore/GitVersionCore.csproj @@ -90,6 +90,7 @@ + diff --git a/GitVersionCore/MergeMessageParser.cs b/GitVersionCore/MergeMessageParser.cs index e97b741335..a477a4da27 100644 --- a/GitVersionCore/MergeMessageParser.cs +++ b/GitVersionCore/MergeMessageParser.cs @@ -6,14 +6,14 @@ namespace GitVersion static class MergeMessageParser { - public static bool TryParse(Commit mergeCommit, EffectiveConfiguration configuration, out SemanticVersion shortVersion) + public static bool TryParse(Commit mergeCommit, EffectiveConfiguration configuration, out SemanticVersion semanticVersion) { string versionPart; if (Inner(mergeCommit, out versionPart)) { - return SemanticVersion.TryParse(versionPart, configuration.GitTagPrefix, out shortVersion); + return SemanticVersion.TryParse(versionPart, configuration.GitTagPrefix, out semanticVersion); } - shortVersion = null; + semanticVersion = null; return false; } diff --git a/GitVersionCore/VersionCalculation/BaseVersionCalculators/MergeMessageBaseVersionStrategy.cs b/GitVersionCore/VersionCalculation/BaseVersionCalculators/MergeMessageBaseVersionStrategy.cs new file mode 100644 index 0000000000..c907ea965f --- /dev/null +++ b/GitVersionCore/VersionCalculation/BaseVersionCalculators/MergeMessageBaseVersionStrategy.cs @@ -0,0 +1,15 @@ +namespace GitVersion.VersionCalculation.BaseVersionCalculators +{ + public class MergeMessageBaseVersionStrategy : BaseVersionStrategy + { + public override BaseVersion GetVersion(GitVersionContext context) + { + // TODO when this approach works, inline the other class into here + SemanticVersion semanticVersion; + if (MergeMessageParser.TryParse(context.CurrentCommit, context.Configuration, out semanticVersion)) + return new BaseVersion(true, semanticVersion); + + return null; + } + } +} \ No newline at end of file From 69620c9743496ce8c34e009c1a9b7ebb911d794e Mon Sep 17 00:00:00 2001 From: Jake Ginnivan Date: Sat, 10 Jan 2015 21:50:19 +0000 Subject: [PATCH 3/8] Adding LastTagBaseVersionStrategy --- .../GitVersionContextBuilder.cs | 12 +++++++++- .../GitVersionCore.Tests.csproj | 3 ++- GitVersionCore.Tests/Mocks/MockTag.cs | 9 ++++++++ .../BaseVersionCalculatorTests.cs | 1 - .../LastTagBaseVersionStrategyTests.cs | 23 +++++++++++++++++++ GitVersionCore/GitVersionCore.csproj | 1 + .../LastTagBaseVersionStrategy.cs | 14 +++++++++++ 7 files changed, 60 insertions(+), 3 deletions(-) rename GitVersionCore.Tests/{VersionCalculation/Strategies => }/GitVersionContextBuilder.cs (69%) create mode 100644 GitVersionCore.Tests/VersionCalculation/Strategies/LastTagBaseVersionStrategyTests.cs create mode 100644 GitVersionCore/VersionCalculation/BaseVersionCalculators/LastTagBaseVersionStrategy.cs diff --git a/GitVersionCore.Tests/VersionCalculation/Strategies/GitVersionContextBuilder.cs b/GitVersionCore.Tests/GitVersionContextBuilder.cs similarity index 69% rename from GitVersionCore.Tests/VersionCalculation/Strategies/GitVersionContextBuilder.cs rename to GitVersionCore.Tests/GitVersionContextBuilder.cs index a1799dde04..32c2be1b44 100644 --- a/GitVersionCore.Tests/VersionCalculation/Strategies/GitVersionContextBuilder.cs +++ b/GitVersionCore.Tests/GitVersionContextBuilder.cs @@ -1,4 +1,4 @@ -namespace GitVersionCore.Tests.VersionCalculation.Strategies +namespace GitVersionCore.Tests { using GitVersion; using LibGit2Sharp; @@ -20,6 +20,15 @@ public GitVersionContextBuilder WithConfig(Config config) return this; } + public GitVersionContextBuilder WithTaggedMaster() + { + repository = CreateRepository(); + var target = repository.Head.Tip; + ((MockTagCollection)repository.Tags).Add(new MockTag ("1.0.0", target)); + ((MockBranch)repository.Head).Add(new MockCommit { CommitterEx = SignatureBuilder.SignatureNow() }); + return this; + } + public GitVersionContext Build() { return new GitVersionContext(repository ?? CreateRepository(), config ?? new Config()); @@ -34,6 +43,7 @@ IRepository CreateRepository() { mockBranch }, + Tags = new MockTagCollection(), Head = mockBranch }; diff --git a/GitVersionCore.Tests/GitVersionCore.Tests.csproj b/GitVersionCore.Tests/GitVersionCore.Tests.csproj index 6930b8d189..1c58fa6cf4 100644 --- a/GitVersionCore.Tests/GitVersionCore.Tests.csproj +++ b/GitVersionCore.Tests/GitVersionCore.Tests.csproj @@ -117,7 +117,8 @@ - + + diff --git a/GitVersionCore.Tests/Mocks/MockTag.cs b/GitVersionCore.Tests/Mocks/MockTag.cs index 4ea1364815..5400fb5ee0 100644 --- a/GitVersionCore.Tests/Mocks/MockTag.cs +++ b/GitVersionCore.Tests/Mocks/MockTag.cs @@ -15,6 +15,15 @@ public override GitObject Target get { return TargetEx; } } public TagAnnotation AnnotationEx; + + public MockTag() { } + + public MockTag(string name, Commit target) + { + NameEx = name; + TargetEx = target; + } + public override TagAnnotation Annotation { get { return AnnotationEx; } diff --git a/GitVersionCore.Tests/VersionCalculation/BaseVersionCalculatorTests.cs b/GitVersionCore.Tests/VersionCalculation/BaseVersionCalculatorTests.cs index 19bc4d6a4c..ae7c0f08fb 100644 --- a/GitVersionCore.Tests/VersionCalculation/BaseVersionCalculatorTests.cs +++ b/GitVersionCore.Tests/VersionCalculation/BaseVersionCalculatorTests.cs @@ -3,7 +3,6 @@ using GitVersion; using GitVersion.VersionCalculation; using GitVersion.VersionCalculation.BaseVersionCalculators; - using GitVersionCore.Tests.VersionCalculation.Strategies; using NUnit.Framework; using Shouldly; diff --git a/GitVersionCore.Tests/VersionCalculation/Strategies/LastTagBaseVersionStrategyTests.cs b/GitVersionCore.Tests/VersionCalculation/Strategies/LastTagBaseVersionStrategyTests.cs new file mode 100644 index 0000000000..25896a47e7 --- /dev/null +++ b/GitVersionCore.Tests/VersionCalculation/Strategies/LastTagBaseVersionStrategyTests.cs @@ -0,0 +1,23 @@ +namespace GitVersionCore.Tests.VersionCalculation.Strategies +{ + using GitVersion.VersionCalculation.BaseVersionCalculators; + using NUnit.Framework; + using Shouldly; + + [TestFixture] + public class LastTagBaseVersionStrategyTests + { + [Test] + public void ShouldAllowVersionIncremenet() + { + var context = new GitVersionContextBuilder() + .WithTaggedMaster() + .Build(); + var sut = new LastTagBaseVersionStrategy(); + + var baseVersion = sut.GetVersion(context); + + baseVersion.ShouldIncrement.ShouldBe(true); + } + } +} \ No newline at end of file diff --git a/GitVersionCore/GitVersionCore.csproj b/GitVersionCore/GitVersionCore.csproj index 49636ff95f..2ba5b239f7 100644 --- a/GitVersionCore/GitVersionCore.csproj +++ b/GitVersionCore/GitVersionCore.csproj @@ -90,6 +90,7 @@ + diff --git a/GitVersionCore/VersionCalculation/BaseVersionCalculators/LastTagBaseVersionStrategy.cs b/GitVersionCore/VersionCalculation/BaseVersionCalculators/LastTagBaseVersionStrategy.cs new file mode 100644 index 0000000000..44a9c0b984 --- /dev/null +++ b/GitVersionCore/VersionCalculation/BaseVersionCalculators/LastTagBaseVersionStrategy.cs @@ -0,0 +1,14 @@ +namespace GitVersion.VersionCalculation.BaseVersionCalculators +{ + public class LastTagBaseVersionStrategy : BaseVersionStrategy + { + public override BaseVersion GetVersion(GitVersionContext context) + { + VersionTaggedCommit version; + if (new LastTaggedReleaseFinder(context).GetVersion(out version)) + return new BaseVersion(true, version.SemVer); + + return null; + } + } +} \ No newline at end of file From 18fae1a56a71bc2f993c396673bac1fd1053dddd Mon Sep 17 00:00:00 2001 From: Jake Ginnivan Date: Sat, 10 Jan 2015 22:27:39 +0000 Subject: [PATCH 4/8] Created NewNextVersionCalculator which is the new version calculation --- .../GitVersionCore.Tests.csproj | 1 + .../TestEffectiveConfiguration.cs | 2 +- .../NewNextVersionCalculatorTests.cs | 44 +++++++++++++++ .../TestBaseVersionCalculator.cs | 23 ++++++++ GitVersionCore/Configuration/BranchConfig.cs | 3 + .../Configuration/IncrementStrategy.cs | 10 ++++ GitVersionCore/EffectiveConfiguration.cs | 4 +- GitVersionCore/GitVersionContext.cs | 3 +- GitVersionCore/GitVersionCore.csproj | 3 + .../BaseVersionCalculator.cs | 4 +- .../IBaseVersionCalculator.cs | 9 +++ .../NewNextVersionCalculator.cs | 56 +++++++++++++++++++ 12 files changed, 157 insertions(+), 5 deletions(-) create mode 100644 GitVersionCore.Tests/VersionCalculation/NewNextVersionCalculatorTests.cs create mode 100644 GitVersionCore.Tests/VersionCalculation/TestBaseVersionCalculator.cs create mode 100644 GitVersionCore/Configuration/IncrementStrategy.cs create mode 100644 GitVersionCore/VersionCalculation/IBaseVersionCalculator.cs create mode 100644 GitVersionCore/VersionCalculation/NewNextVersionCalculator.cs diff --git a/GitVersionCore.Tests/GitVersionCore.Tests.csproj b/GitVersionCore.Tests/GitVersionCore.Tests.csproj index 1c58fa6cf4..b9b124ddc6 100644 --- a/GitVersionCore.Tests/GitVersionCore.Tests.csproj +++ b/GitVersionCore.Tests/GitVersionCore.Tests.csproj @@ -116,6 +116,7 @@ + diff --git a/GitVersionCore.Tests/TestEffectiveConfiguration.cs b/GitVersionCore.Tests/TestEffectiveConfiguration.cs index 055be59556..e6ef0a893e 100644 --- a/GitVersionCore.Tests/TestEffectiveConfiguration.cs +++ b/GitVersionCore.Tests/TestEffectiveConfiguration.cs @@ -10,7 +10,7 @@ public TestEffectiveConfiguration( string gitTagPrefix = "v", string tag = "", string nextVersion = null) : - base(assemblyVersioningScheme, versioningMode, gitTagPrefix, tag, nextVersion) + base(assemblyVersioningScheme, versioningMode, gitTagPrefix, tag, nextVersion, IncrementStrategy.Patch) { } } diff --git a/GitVersionCore.Tests/VersionCalculation/NewNextVersionCalculatorTests.cs b/GitVersionCore.Tests/VersionCalculation/NewNextVersionCalculatorTests.cs new file mode 100644 index 0000000000..6be163c332 --- /dev/null +++ b/GitVersionCore.Tests/VersionCalculation/NewNextVersionCalculatorTests.cs @@ -0,0 +1,44 @@ +namespace GitVersionCore.Tests.VersionCalculation +{ + using GitVersion; + using GitVersion.VersionCalculation; + using NUnit.Framework; + using Shouldly; + + public class NewNextVersionCalculatorTests + { + [Test] + public void ShouldIncrementVersionBasedOnConfig() + { + var baseCalculator = new TestBaseVersionCalculator(true, new SemanticVersion(1)); + var sut = new NewNextVersionCalculator(baseCalculator); + 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"); + } + + [Test] + public void DoesNotIncrementWhenBaseVersionSaysNotTo() + { + var baseCalculator = new TestBaseVersionCalculator(false, new SemanticVersion(1)); + var sut = new NewNextVersionCalculator(baseCalculator); + 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("1.0.0"); + } + } +} \ No newline at end of file diff --git a/GitVersionCore.Tests/VersionCalculation/TestBaseVersionCalculator.cs b/GitVersionCore.Tests/VersionCalculation/TestBaseVersionCalculator.cs new file mode 100644 index 0000000000..d6d43b8f8c --- /dev/null +++ b/GitVersionCore.Tests/VersionCalculation/TestBaseVersionCalculator.cs @@ -0,0 +1,23 @@ +namespace GitVersionCore.Tests.VersionCalculation +{ + using GitVersion; + using GitVersion.VersionCalculation; + using GitVersion.VersionCalculation.BaseVersionCalculators; + + public class TestBaseVersionCalculator : IBaseVersionCalculator + { + readonly SemanticVersion semanticVersion; + bool shouldIncrement; + + public TestBaseVersionCalculator(bool shouldIncrement, SemanticVersion semanticVersion) + { + this.semanticVersion = semanticVersion; + this.shouldIncrement = shouldIncrement; + } + + public BaseVersion GetBaseVersion(GitVersionContext context) + { + return new BaseVersion(shouldIncrement, semanticVersion); + } + } +} \ No newline at end of file diff --git a/GitVersionCore/Configuration/BranchConfig.cs b/GitVersionCore/Configuration/BranchConfig.cs index 1b7494e0f0..e0f10d561e 100644 --- a/GitVersionCore/Configuration/BranchConfig.cs +++ b/GitVersionCore/Configuration/BranchConfig.cs @@ -9,5 +9,8 @@ public class BranchConfig [YamlAlias("tag")] public string Tag { get; set; } + + [YamlAlias("increment")] + public IncrementStrategy? Increment { get; set; } } } diff --git a/GitVersionCore/Configuration/IncrementStrategy.cs b/GitVersionCore/Configuration/IncrementStrategy.cs new file mode 100644 index 0000000000..49c251a9b2 --- /dev/null +++ b/GitVersionCore/Configuration/IncrementStrategy.cs @@ -0,0 +1,10 @@ +namespace GitVersion +{ + public enum IncrementStrategy + { + None, + Major, + Minor, + Patch + } +} \ No newline at end of file diff --git a/GitVersionCore/EffectiveConfiguration.cs b/GitVersionCore/EffectiveConfiguration.cs index 9daed63748..5a8211349f 100644 --- a/GitVersionCore/EffectiveConfiguration.cs +++ b/GitVersionCore/EffectiveConfiguration.cs @@ -5,13 +5,14 @@ /// public class EffectiveConfiguration { - public EffectiveConfiguration(AssemblyVersioningScheme assemblyVersioningScheme, VersioningMode versioningMode, string gitTagPrefix, string tag, string nextVersion) + public EffectiveConfiguration(AssemblyVersioningScheme assemblyVersioningScheme, VersioningMode versioningMode, string gitTagPrefix, string tag, string nextVersion, IncrementStrategy increment) { AssemblyVersioningScheme = assemblyVersioningScheme; VersioningMode = versioningMode; GitTagPrefix = gitTagPrefix; Tag = tag; NextVersion = nextVersion; + Increment = increment; } public VersioningMode VersioningMode { get; private set; } @@ -29,5 +30,6 @@ public EffectiveConfiguration(AssemblyVersioningScheme assemblyVersioningScheme, public string Tag { get; private set; } public string NextVersion { get; private set; } + public IncrementStrategy Increment { get; private set; } } } \ No newline at end of file diff --git a/GitVersionCore/GitVersionContext.cs b/GitVersionCore/GitVersionContext.cs index 3bd8a0ef7e..c858437386 100644 --- a/GitVersionCore/GitVersionContext.cs +++ b/GitVersionCore/GitVersionContext.cs @@ -88,8 +88,9 @@ void CalculateEffectiveConfiguration() var versioningMode = currentBranchConfig.VersioningMode ?? configuration.VersioningMode ?? VersioningMode.ContinuousDelivery; var tag = currentBranchConfig.Tag; var nextVersion = configuration.NextVersion; + var incrementStrategy = currentBranchConfig.Increment ?? IncrementStrategy.Patch; - Configuration = new EffectiveConfiguration(configuration.AssemblyVersioningScheme, versioningMode, configuration.TagPrefix, tag, nextVersion); + Configuration = new EffectiveConfiguration(configuration.AssemblyVersioningScheme, versioningMode, configuration.TagPrefix, tag, nextVersion, incrementStrategy); } BranchConfig GetBranchConfiguration(KeyValuePair[] matchingBranches) diff --git a/GitVersionCore/GitVersionCore.csproj b/GitVersionCore/GitVersionCore.csproj index 2ba5b239f7..d4a4d0e15e 100644 --- a/GitVersionCore/GitVersionCore.csproj +++ b/GitVersionCore/GitVersionCore.csproj @@ -74,6 +74,7 @@ + @@ -93,6 +94,8 @@ + + diff --git a/GitVersionCore/VersionCalculation/BaseVersionCalculator.cs b/GitVersionCore/VersionCalculation/BaseVersionCalculator.cs index e3a79ad8a8..3a3e18015c 100644 --- a/GitVersionCore/VersionCalculation/BaseVersionCalculator.cs +++ b/GitVersionCore/VersionCalculation/BaseVersionCalculator.cs @@ -1,9 +1,9 @@ namespace GitVersion.VersionCalculation { using System.Linq; - using GitVersion.VersionCalculation.BaseVersionCalculators; + using BaseVersionCalculators; - public class BaseVersionCalculator + public class BaseVersionCalculator : IBaseVersionCalculator { readonly BaseVersionStrategy[] strategies; diff --git a/GitVersionCore/VersionCalculation/IBaseVersionCalculator.cs b/GitVersionCore/VersionCalculation/IBaseVersionCalculator.cs new file mode 100644 index 0000000000..b6e8f3d67a --- /dev/null +++ b/GitVersionCore/VersionCalculation/IBaseVersionCalculator.cs @@ -0,0 +1,9 @@ +namespace GitVersion.VersionCalculation +{ + using GitVersion.VersionCalculation.BaseVersionCalculators; + + public interface IBaseVersionCalculator + { + BaseVersion GetBaseVersion(GitVersionContext context); + } +} \ No newline at end of file diff --git a/GitVersionCore/VersionCalculation/NewNextVersionCalculator.cs b/GitVersionCore/VersionCalculation/NewNextVersionCalculator.cs new file mode 100644 index 0000000000..d44f93d9a6 --- /dev/null +++ b/GitVersionCore/VersionCalculation/NewNextVersionCalculator.cs @@ -0,0 +1,56 @@ +namespace GitVersion.VersionCalculation +{ + using System; + using BaseVersionCalculators; + + public class NewNextVersionCalculator + { + IBaseVersionCalculator baseVersionFinder; + + public NewNextVersionCalculator(IBaseVersionCalculator baseVersionCalculator = null) + { + baseVersionFinder = baseVersionCalculator ?? + new BaseVersionCalculator( + new ConfigNextVersionBaseVersionStrategy(), + new LastTagBaseVersionStrategy(), + new MergeMessageBaseVersionStrategy()); + } + + public SemanticVersion FindVersion(GitVersionContext context) + { + var baseVersion = baseVersionFinder.GetBaseVersion(context); + + if (baseVersion.ShouldIncrement) IncrementVersion(context, baseVersion); + + return baseVersion.SemanticVersion; + } + + static void IncrementVersion(GitVersionContext context, BaseVersion baseVersion) + { + if (!baseVersion.SemanticVersion.PreReleaseTag.HasTag()) + { + switch (context.Configuration.Increment) + { + case IncrementStrategy.None: + break; + case IncrementStrategy.Major: + baseVersion.SemanticVersion.Major++; + break; + case IncrementStrategy.Minor: + baseVersion.SemanticVersion.Minor++; + break; + case IncrementStrategy.Patch: + baseVersion.SemanticVersion.Patch++; + break; + default: + throw new ArgumentOutOfRangeException(); + } + } + else + { + baseVersion.SemanticVersion.PreReleaseTag.Number = baseVersion.SemanticVersion.PreReleaseTag.Number ?? 0; + baseVersion.SemanticVersion.PreReleaseTag.Number++; + } + } + } +} \ No newline at end of file From ee1a3da1356f3300e2aa88695c1c5b454047cc4d Mon Sep 17 00:00:00 2001 From: Jake Ginnivan Date: Sat, 10 Jan 2015 22:52:03 +0000 Subject: [PATCH 5/8] Added MetaDataCalculator in and fixed up some other shortcomings in the design --- .../GitVersionCore.Tests.csproj | 2 + .../BaseVersionCalculatorTests.cs | 51 +++++++++++++++++-- .../NewNextVersionCalculatorTests.cs | 11 ++-- .../MergeMessageBaseVersionStrategyTests.cs | 6 ++- .../TestBaseVersionCalculator.cs | 7 ++- .../TestMetaDataCalculator.cs | 21 ++++++++ GitVersionCore/GitVersionCore.csproj | 2 + .../BaseVersionCalculator.cs | 10 +++- .../BaseVersionCalculators/BaseVersion.cs | 12 ++++- .../ConfigNextVersionBaseVersionStrategy.cs | 2 +- .../LastTagBaseVersionStrategy.cs | 2 +- .../MergeMessageBaseVersionStrategy.cs | 12 +++-- .../VersionCalculation/IMetaDataCalculator.cs | 9 ++++ .../VersionCalculation/MetaDataCalculator.cs | 25 +++++++++ .../NewNextVersionCalculator.cs | 6 ++- 15 files changed, 158 insertions(+), 20 deletions(-) create mode 100644 GitVersionCore.Tests/VersionCalculation/TestMetaDataCalculator.cs create mode 100644 GitVersionCore/VersionCalculation/IMetaDataCalculator.cs create mode 100644 GitVersionCore/VersionCalculation/MetaDataCalculator.cs diff --git a/GitVersionCore.Tests/GitVersionCore.Tests.csproj b/GitVersionCore.Tests/GitVersionCore.Tests.csproj index b9b124ddc6..57ff1fe96a 100644 --- a/GitVersionCore.Tests/GitVersionCore.Tests.csproj +++ b/GitVersionCore.Tests/GitVersionCore.Tests.csproj @@ -121,6 +121,8 @@ + + diff --git a/GitVersionCore.Tests/VersionCalculation/BaseVersionCalculatorTests.cs b/GitVersionCore.Tests/VersionCalculation/BaseVersionCalculatorTests.cs index ae7c0f08fb..eadb411213 100644 --- a/GitVersionCore.Tests/VersionCalculation/BaseVersionCalculatorTests.cs +++ b/GitVersionCore.Tests/VersionCalculation/BaseVersionCalculatorTests.cs @@ -1,5 +1,6 @@ namespace GitVersionCore.Tests.VersionCalculation { + using System; using GitVersion; using GitVersion.VersionCalculation; using GitVersion.VersionCalculation.BaseVersionCalculators; @@ -13,27 +14,71 @@ public class BaseVersionCalculatorTests public void ChoosesHighestVersionReturnedFromStrategies() { var context = new GitVersionContextBuilder().Build(); - var sut = new BaseVersionCalculator(new V1Strategy(), new V2Strategy()); + var dateTimeOffset = DateTimeOffset.Now; + var sut = new BaseVersionCalculator(new V1Strategy(DateTimeOffset.Now), new V2Strategy(dateTimeOffset)); var baseVersion = sut.GetBaseVersion(context); baseVersion.SemanticVersion.ToString().ShouldBe("2.0.0"); baseVersion.ShouldIncrement.ShouldBe(true); + baseVersion.BaseVersionWhenFrom.ShouldBe(dateTimeOffset); + } + + [Test] + public void UsesWhenFromNextBestMatchIfHighestDoesntHaveWhen() + { + var context = new GitVersionContextBuilder().Build(); + var when = DateTimeOffset.Now; + var sut = new BaseVersionCalculator(new V1Strategy(when), new V2Strategy(null)); + + var baseVersion = sut.GetBaseVersion(context); + + baseVersion.SemanticVersion.ToString().ShouldBe("2.0.0"); + baseVersion.ShouldIncrement.ShouldBe(true); + baseVersion.BaseVersionWhenFrom.ShouldBe(when); + } + + [Test] + public void UsesWhenFromNextBestMatchIfHighestDoesntHaveWhenReversedOrder() + { + var context = new GitVersionContextBuilder().Build(); + var when = DateTimeOffset.Now; + var sut = new BaseVersionCalculator(new V1Strategy(null), new V2Strategy(when)); + + var baseVersion = sut.GetBaseVersion(context); + + baseVersion.SemanticVersion.ToString().ShouldBe("2.0.0"); + baseVersion.ShouldIncrement.ShouldBe(true); + baseVersion.BaseVersionWhenFrom.ShouldBe(when); } class V1Strategy : BaseVersionStrategy { + readonly DateTimeOffset? when; + + public V1Strategy(DateTimeOffset? when) + { + this.when = when; + } + public override BaseVersion GetVersion(GitVersionContext context) { - return new BaseVersion(false, new SemanticVersion(1)); + return new BaseVersion(false, new SemanticVersion(1), when); } } class V2Strategy : BaseVersionStrategy { + DateTimeOffset? when; + + public V2Strategy(DateTimeOffset? when) + { + this.when = when; + } + public override BaseVersion GetVersion(GitVersionContext context) { - return new BaseVersion(true, new SemanticVersion(2)); + return new BaseVersion(true, new SemanticVersion(2), when); } } } diff --git a/GitVersionCore.Tests/VersionCalculation/NewNextVersionCalculatorTests.cs b/GitVersionCore.Tests/VersionCalculation/NewNextVersionCalculatorTests.cs index 6be163c332..0ae23073bd 100644 --- a/GitVersionCore.Tests/VersionCalculation/NewNextVersionCalculatorTests.cs +++ b/GitVersionCore.Tests/VersionCalculation/NewNextVersionCalculatorTests.cs @@ -1,5 +1,6 @@ namespace GitVersionCore.Tests.VersionCalculation { + using System; using GitVersion; using GitVersion.VersionCalculation; using NUnit.Framework; @@ -10,8 +11,9 @@ public class NewNextVersionCalculatorTests [Test] public void ShouldIncrementVersionBasedOnConfig() { - var baseCalculator = new TestBaseVersionCalculator(true, new SemanticVersion(1)); - var sut = new NewNextVersionCalculator(baseCalculator); + var baseCalculator = new TestBaseVersionCalculator(true, new SemanticVersion(1), DateTimeOffset.Now); + 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 { @@ -27,8 +29,9 @@ public void ShouldIncrementVersionBasedOnConfig() [Test] public void DoesNotIncrementWhenBaseVersionSaysNotTo() { - var baseCalculator = new TestBaseVersionCalculator(false, new SemanticVersion(1)); - var sut = new NewNextVersionCalculator(baseCalculator); + var baseCalculator = new TestBaseVersionCalculator(false, new SemanticVersion(1), DateTimeOffset.Now); + 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 { diff --git a/GitVersionCore.Tests/VersionCalculation/Strategies/MergeMessageBaseVersionStrategyTests.cs b/GitVersionCore.Tests/VersionCalculation/Strategies/MergeMessageBaseVersionStrategyTests.cs index 881c2ce29c..ac22497e58 100644 --- a/GitVersionCore.Tests/VersionCalculation/Strategies/MergeMessageBaseVersionStrategyTests.cs +++ b/GitVersionCore.Tests/VersionCalculation/Strategies/MergeMessageBaseVersionStrategyTests.cs @@ -70,7 +70,11 @@ static void AssertMergeMessage(string message, string expectedVersion, List + + diff --git a/GitVersionCore/VersionCalculation/BaseVersionCalculator.cs b/GitVersionCore/VersionCalculation/BaseVersionCalculator.cs index 3a3e18015c..01e2d95789 100644 --- a/GitVersionCore/VersionCalculation/BaseVersionCalculator.cs +++ b/GitVersionCore/VersionCalculation/BaseVersionCalculator.cs @@ -17,7 +17,15 @@ public BaseVersion GetBaseVersion(GitVersionContext context) return strategies .Select(s => s.GetVersion(context)) .Where(v => v != null) - .Aggregate((v1, v2) => v1.SemanticVersion > v2.SemanticVersion ? v1 : v2); + .Aggregate((v1, v2) => + { + if (v1.SemanticVersion > v2.SemanticVersion) + { + return new BaseVersion(v1.ShouldIncrement, v1.SemanticVersion, v1.BaseVersionWhenFrom ?? v2.BaseVersionWhenFrom); + } + + return new BaseVersion(v2.ShouldIncrement, v2.SemanticVersion, v2.BaseVersionWhenFrom ?? v1.BaseVersionWhenFrom); + }); } } } \ No newline at end of file diff --git a/GitVersionCore/VersionCalculation/BaseVersionCalculators/BaseVersion.cs b/GitVersionCore/VersionCalculation/BaseVersionCalculators/BaseVersion.cs index da4b3f0249..30718b6b9e 100644 --- a/GitVersionCore/VersionCalculation/BaseVersionCalculators/BaseVersion.cs +++ b/GitVersionCore/VersionCalculation/BaseVersionCalculators/BaseVersion.cs @@ -1,15 +1,25 @@ namespace GitVersion.VersionCalculation.BaseVersionCalculators { + using System; + public class BaseVersion { - public BaseVersion(bool shouldIncrement, SemanticVersion semanticVersion) + public BaseVersion(bool shouldIncrement, SemanticVersion semanticVersion, DateTimeOffset? baseVersionWhenFrom) { ShouldIncrement = shouldIncrement; SemanticVersion = semanticVersion; + BaseVersionWhenFrom = baseVersionWhenFrom; } public bool ShouldIncrement { get; private set; } public SemanticVersion SemanticVersion { get; private set; } + + /// + /// Can be null even if the base version has a version + /// + /// This happens when the base version doesn't have a time it came from + /// + public DateTimeOffset? BaseVersionWhenFrom { get; private set; } } } \ No newline at end of file diff --git a/GitVersionCore/VersionCalculation/BaseVersionCalculators/ConfigNextVersionBaseVersionStrategy.cs b/GitVersionCore/VersionCalculation/BaseVersionCalculators/ConfigNextVersionBaseVersionStrategy.cs index 1b61e6ffce..cd1f907ec1 100644 --- a/GitVersionCore/VersionCalculation/BaseVersionCalculators/ConfigNextVersionBaseVersionStrategy.cs +++ b/GitVersionCore/VersionCalculation/BaseVersionCalculators/ConfigNextVersionBaseVersionStrategy.cs @@ -6,7 +6,7 @@ public override BaseVersion GetVersion(GitVersionContext context) { if (string.IsNullOrEmpty(context.Configuration.NextVersion)) return null; - return new BaseVersion(false, SemanticVersion.Parse(context.Configuration.NextVersion, context.Configuration.GitTagPrefix)); + return new BaseVersion(false, SemanticVersion.Parse(context.Configuration.NextVersion, context.Configuration.GitTagPrefix), null); } } } \ No newline at end of file diff --git a/GitVersionCore/VersionCalculation/BaseVersionCalculators/LastTagBaseVersionStrategy.cs b/GitVersionCore/VersionCalculation/BaseVersionCalculators/LastTagBaseVersionStrategy.cs index 44a9c0b984..f8ca82a0b9 100644 --- a/GitVersionCore/VersionCalculation/BaseVersionCalculators/LastTagBaseVersionStrategy.cs +++ b/GitVersionCore/VersionCalculation/BaseVersionCalculators/LastTagBaseVersionStrategy.cs @@ -6,7 +6,7 @@ public override BaseVersion GetVersion(GitVersionContext context) { VersionTaggedCommit version; if (new LastTaggedReleaseFinder(context).GetVersion(out version)) - return new BaseVersion(true, version.SemVer); + return new BaseVersion(true, version.SemVer, version.Commit.When()); return null; } diff --git a/GitVersionCore/VersionCalculation/BaseVersionCalculators/MergeMessageBaseVersionStrategy.cs b/GitVersionCore/VersionCalculation/BaseVersionCalculators/MergeMessageBaseVersionStrategy.cs index c907ea965f..6756b5b8a2 100644 --- a/GitVersionCore/VersionCalculation/BaseVersionCalculators/MergeMessageBaseVersionStrategy.cs +++ b/GitVersionCore/VersionCalculation/BaseVersionCalculators/MergeMessageBaseVersionStrategy.cs @@ -4,11 +4,13 @@ public class MergeMessageBaseVersionStrategy : BaseVersionStrategy { public override BaseVersion GetVersion(GitVersionContext context) { - // TODO when this approach works, inline the other class into here - SemanticVersion semanticVersion; - if (MergeMessageParser.TryParse(context.CurrentCommit, context.Configuration, out semanticVersion)) - return new BaseVersion(true, semanticVersion); - + foreach (var commit in context.CurrentBranch.CommitsPriorToThan(context.CurrentCommit.When())) + { + SemanticVersion semanticVersion; + // TODO when this approach works, inline the other class into here + if (MergeMessageParser.TryParse(context.CurrentCommit, context.Configuration, out semanticVersion)) + return new BaseVersion(true, semanticVersion, commit.When()); + } return null; } } diff --git a/GitVersionCore/VersionCalculation/IMetaDataCalculator.cs b/GitVersionCore/VersionCalculation/IMetaDataCalculator.cs new file mode 100644 index 0000000000..e0c3b5335f --- /dev/null +++ b/GitVersionCore/VersionCalculation/IMetaDataCalculator.cs @@ -0,0 +1,9 @@ +namespace GitVersion.VersionCalculation +{ + using System; + + public interface IMetaDataCalculator + { + SemanticVersionBuildMetaData Create(DateTimeOffset? baseVersionWhenFrom, GitVersionContext context); + } +} \ No newline at end of file diff --git a/GitVersionCore/VersionCalculation/MetaDataCalculator.cs b/GitVersionCore/VersionCalculation/MetaDataCalculator.cs new file mode 100644 index 0000000000..5b185ab8f4 --- /dev/null +++ b/GitVersionCore/VersionCalculation/MetaDataCalculator.cs @@ -0,0 +1,25 @@ +namespace GitVersion.VersionCalculation +{ + using System; + using System.Linq; + using LibGit2Sharp; + + public class MetaDataCalculator : IMetaDataCalculator + { + public SemanticVersionBuildMetaData Create(DateTimeOffset? baseVersionWhenFrom, GitVersionContext context) + { + var qf = new CommitFilter + { + Since = baseVersionWhenFrom, + Until = context.CurrentCommit, + SortBy = CommitSortStrategies.Topological | CommitSortStrategies.Time + }; + + return new SemanticVersionBuildMetaData( + context.Repository.Commits.QueryBy(qf).Count(), + context.CurrentBranch.Name, + context.CurrentCommit.Sha, + context.CurrentCommit.When()); + } + } +} \ No newline at end of file diff --git a/GitVersionCore/VersionCalculation/NewNextVersionCalculator.cs b/GitVersionCore/VersionCalculation/NewNextVersionCalculator.cs index d44f93d9a6..6a07788c49 100644 --- a/GitVersionCore/VersionCalculation/NewNextVersionCalculator.cs +++ b/GitVersionCore/VersionCalculation/NewNextVersionCalculator.cs @@ -6,9 +6,11 @@ public class NewNextVersionCalculator { IBaseVersionCalculator baseVersionFinder; + IMetaDataCalculator metaDataCalculator; - public NewNextVersionCalculator(IBaseVersionCalculator baseVersionCalculator = null) + public NewNextVersionCalculator(IBaseVersionCalculator baseVersionCalculator = null, IMetaDataCalculator metaDataCalculator = null) { + this.metaDataCalculator = metaDataCalculator ?? new MetaDataCalculator(); baseVersionFinder = baseVersionCalculator ?? new BaseVersionCalculator( new ConfigNextVersionBaseVersionStrategy(), @@ -22,6 +24,8 @@ public SemanticVersion FindVersion(GitVersionContext context) if (baseVersion.ShouldIncrement) IncrementVersion(context, baseVersion); + baseVersion.SemanticVersion.BuildMetaData = metaDataCalculator.Create(baseVersion.BaseVersionWhenFrom, context); + return baseVersion.SemanticVersion; } From 70dbeb033610d316fe8b2ae5395e2f7182882585 Mon Sep 17 00:00:00 2001 From: Jake Ginnivan Date: Sat, 10 Jan 2015 23:09:49 +0000 Subject: [PATCH 6/8] Uncomment line in GitVersionFinder to test new way of doing things. It kinda works but lots of small differences causing test breaks --- .../GitVersionContextBuilder.cs | 12 ++++++++++++ .../BaseVersionCalculatorTests.cs | 15 ++++++++------- .../NewNextVersionCalculatorTests.cs | 19 +++++++++++++++++-- .../TestBaseVersionCalculator.cs | 10 +++++----- .../TestMetaDataCalculator.cs | 4 ++-- GitVersionCore/Configuration/Config.cs | 1 + GitVersionCore/GitVersionFinder.cs | 2 ++ .../BaseVersionCalculator.cs | 4 ++-- .../BaseVersionCalculators/BaseVersion.cs | 13 ++++--------- .../LastTagBaseVersionStrategy.cs | 2 +- .../MergeMessageBaseVersionStrategy.cs | 2 +- .../VersionCalculation/IMetaDataCalculator.cs | 4 ++-- .../VersionCalculation/MetaDataCalculator.cs | 5 ++--- .../NewNextVersionCalculator.cs | 7 ++++++- 14 files changed, 65 insertions(+), 35 deletions(-) diff --git a/GitVersionCore.Tests/GitVersionContextBuilder.cs b/GitVersionCore.Tests/GitVersionContextBuilder.cs index 32c2be1b44..8250dbb12c 100644 --- a/GitVersionCore.Tests/GitVersionContextBuilder.cs +++ b/GitVersionCore.Tests/GitVersionContextBuilder.cs @@ -29,6 +29,18 @@ public GitVersionContextBuilder WithTaggedMaster() return this; } + public GitVersionContextBuilder WithDevelopBranch() + { + repository = CreateRepository(); + var mockBranch = new MockBranch("develop") + { + new MockCommit() + }; + ((MockBranchCollection) repository.Branches).Add(mockBranch); + ((MockRepository)repository).Head = mockBranch; + return this; + } + public GitVersionContext Build() { return new GitVersionContext(repository ?? CreateRepository(), config ?? new Config()); diff --git a/GitVersionCore.Tests/VersionCalculation/BaseVersionCalculatorTests.cs b/GitVersionCore.Tests/VersionCalculation/BaseVersionCalculatorTests.cs index eadb411213..f2fe0e1afe 100644 --- a/GitVersionCore.Tests/VersionCalculation/BaseVersionCalculatorTests.cs +++ b/GitVersionCore.Tests/VersionCalculation/BaseVersionCalculatorTests.cs @@ -4,6 +4,7 @@ using GitVersion; using GitVersion.VersionCalculation; using GitVersion.VersionCalculation.BaseVersionCalculators; + using LibGit2Sharp; using NUnit.Framework; using Shouldly; @@ -21,7 +22,7 @@ public void ChoosesHighestVersionReturnedFromStrategies() baseVersion.SemanticVersion.ToString().ShouldBe("2.0.0"); baseVersion.ShouldIncrement.ShouldBe(true); - baseVersion.BaseVersionWhenFrom.ShouldBe(dateTimeOffset); + baseVersion.BaseVersionSource.When().ShouldBe(dateTimeOffset); } [Test] @@ -35,7 +36,7 @@ public void UsesWhenFromNextBestMatchIfHighestDoesntHaveWhen() baseVersion.SemanticVersion.ToString().ShouldBe("2.0.0"); baseVersion.ShouldIncrement.ShouldBe(true); - baseVersion.BaseVersionWhenFrom.ShouldBe(when); + baseVersion.BaseVersionSource.When().ShouldBe(when); } [Test] @@ -49,16 +50,16 @@ public void UsesWhenFromNextBestMatchIfHighestDoesntHaveWhenReversedOrder() baseVersion.SemanticVersion.ToString().ShouldBe("2.0.0"); baseVersion.ShouldIncrement.ShouldBe(true); - baseVersion.BaseVersionWhenFrom.ShouldBe(when); + baseVersion.BaseVersionSource.When().ShouldBe(when); } class V1Strategy : BaseVersionStrategy { - readonly DateTimeOffset? when; + readonly Commit when; public V1Strategy(DateTimeOffset? when) { - this.when = when; + this.when = when == null ? null : new MockCommit { CommitterEx = when.Value.ToSignature() }; } public override BaseVersion GetVersion(GitVersionContext context) @@ -69,11 +70,11 @@ public override BaseVersion GetVersion(GitVersionContext context) class V2Strategy : BaseVersionStrategy { - DateTimeOffset? when; + Commit when; public V2Strategy(DateTimeOffset? when) { - this.when = when; + this.when = when == null ? null : new MockCommit { CommitterEx = when.Value.ToSignature() }; } public override BaseVersion GetVersion(GitVersionContext context) diff --git a/GitVersionCore.Tests/VersionCalculation/NewNextVersionCalculatorTests.cs b/GitVersionCore.Tests/VersionCalculation/NewNextVersionCalculatorTests.cs index 0ae23073bd..4b934a362c 100644 --- a/GitVersionCore.Tests/VersionCalculation/NewNextVersionCalculatorTests.cs +++ b/GitVersionCore.Tests/VersionCalculation/NewNextVersionCalculatorTests.cs @@ -11,7 +11,7 @@ public class NewNextVersionCalculatorTests [Test] public void ShouldIncrementVersionBasedOnConfig() { - var baseCalculator = new TestBaseVersionCalculator(true, new SemanticVersion(1), DateTimeOffset.Now); + var baseCalculator = new TestBaseVersionCalculator(true, new SemanticVersion(1), new MockCommit()); var semanticVersionBuildMetaData = new SemanticVersionBuildMetaData(1, "master", "b1a34e", DateTimeOffset.Now); var sut = new NewNextVersionCalculator(baseCalculator, new TestMetaDataCalculator(semanticVersionBuildMetaData)); var config = new Config(); @@ -29,7 +29,7 @@ public void ShouldIncrementVersionBasedOnConfig() [Test] public void DoesNotIncrementWhenBaseVersionSaysNotTo() { - var baseCalculator = new TestBaseVersionCalculator(false, new SemanticVersion(1), DateTimeOffset.Now); + var baseCalculator = new TestBaseVersionCalculator(false, new SemanticVersion(1), new MockCommit()); var semanticVersionBuildMetaData = new SemanticVersionBuildMetaData(1, "master", "b1a34e", DateTimeOffset.Now); var sut = new NewNextVersionCalculator(baseCalculator, new TestMetaDataCalculator(semanticVersionBuildMetaData)); var config = new Config(); @@ -43,5 +43,20 @@ public void DoesNotIncrementWhenBaseVersionSaysNotTo() version.ToString().ShouldBe("1.0.0"); } + + [Test] + public void AppliesBranchPreReleaseTag() + { + var baseCalculator = new TestBaseVersionCalculator(false, new SemanticVersion(1), new MockCommit()); + var semanticVersionBuildMetaData = new SemanticVersionBuildMetaData(1, "develop", "b1a34e", DateTimeOffset.Now); + var sut = new NewNextVersionCalculator(baseCalculator, new TestMetaDataCalculator(semanticVersionBuildMetaData)); + var context = new GitVersionContextBuilder() + .WithDevelopBranch() + .Build(); + + var version = sut.FindVersion(context); + + version.ToString().ShouldBe("1.0.0-unstable.1"); + } } } \ No newline at end of file diff --git a/GitVersionCore.Tests/VersionCalculation/TestBaseVersionCalculator.cs b/GitVersionCore.Tests/VersionCalculation/TestBaseVersionCalculator.cs index e8b063534d..c094ad625e 100644 --- a/GitVersionCore.Tests/VersionCalculation/TestBaseVersionCalculator.cs +++ b/GitVersionCore.Tests/VersionCalculation/TestBaseVersionCalculator.cs @@ -1,26 +1,26 @@ namespace GitVersionCore.Tests.VersionCalculation { - using System; using GitVersion; using GitVersion.VersionCalculation; using GitVersion.VersionCalculation.BaseVersionCalculators; + using LibGit2Sharp; public class TestBaseVersionCalculator : IBaseVersionCalculator { readonly SemanticVersion semanticVersion; bool shouldIncrement; - DateTimeOffset? when; + Commit source; - public TestBaseVersionCalculator(bool shouldIncrement, SemanticVersion semanticVersion, DateTimeOffset? when) + public TestBaseVersionCalculator(bool shouldIncrement, SemanticVersion semanticVersion, Commit source) { this.semanticVersion = semanticVersion; - this.when = when; + this.source = source; this.shouldIncrement = shouldIncrement; } public BaseVersion GetBaseVersion(GitVersionContext context) { - return new BaseVersion(shouldIncrement, semanticVersion, when); + return new BaseVersion(shouldIncrement, semanticVersion, source); } } } \ No newline at end of file diff --git a/GitVersionCore.Tests/VersionCalculation/TestMetaDataCalculator.cs b/GitVersionCore.Tests/VersionCalculation/TestMetaDataCalculator.cs index 0ec15d5685..51f7a95b22 100644 --- a/GitVersionCore.Tests/VersionCalculation/TestMetaDataCalculator.cs +++ b/GitVersionCore.Tests/VersionCalculation/TestMetaDataCalculator.cs @@ -1,8 +1,8 @@ namespace GitVersionCore.Tests.VersionCalculation { - using System; using GitVersion; using GitVersion.VersionCalculation; + using LibGit2Sharp; public class TestMetaDataCalculator : IMetaDataCalculator { @@ -13,7 +13,7 @@ public TestMetaDataCalculator(SemanticVersionBuildMetaData metaData) this.metaData = metaData; } - public SemanticVersionBuildMetaData Create(DateTimeOffset? baseVersionWhenFrom, GitVersionContext context) + public SemanticVersionBuildMetaData Create(Commit baseVersionSource, GitVersionContext context) { return metaData; } diff --git a/GitVersionCore/Configuration/Config.cs b/GitVersionCore/Configuration/Config.cs index ed487c57db..9157e84293 100644 --- a/GitVersionCore/Configuration/Config.cs +++ b/GitVersionCore/Configuration/Config.cs @@ -18,6 +18,7 @@ public Config() Branches["develop"] = new BranchConfig { Tag = "unstable", + Increment = IncrementStrategy.Minor, VersioningMode = GitVersion.VersioningMode.ContinuousDeployment }; } diff --git a/GitVersionCore/GitVersionFinder.cs b/GitVersionCore/GitVersionFinder.cs index 418c934ec7..41a71066f9 100644 --- a/GitVersionCore/GitVersionFinder.cs +++ b/GitVersionCore/GitVersionFinder.cs @@ -10,6 +10,8 @@ public SemanticVersion FindVersion(GitVersionContext context) Logger.WriteInfo("Running against branch: " + context.CurrentBranch.Name); EnsureMainTopologyConstraints(context); + //return new NewNextVersionCalculator().FindVersion(context); + if (ShouldGitHubFlowVersioningSchemeApply(context.Repository)) { Logger.WriteInfo("GitHubFlow version strategy will be used"); diff --git a/GitVersionCore/VersionCalculation/BaseVersionCalculator.cs b/GitVersionCore/VersionCalculation/BaseVersionCalculator.cs index 01e2d95789..ebe6c56153 100644 --- a/GitVersionCore/VersionCalculation/BaseVersionCalculator.cs +++ b/GitVersionCore/VersionCalculation/BaseVersionCalculator.cs @@ -21,10 +21,10 @@ public BaseVersion GetBaseVersion(GitVersionContext context) { if (v1.SemanticVersion > v2.SemanticVersion) { - return new BaseVersion(v1.ShouldIncrement, v1.SemanticVersion, v1.BaseVersionWhenFrom ?? v2.BaseVersionWhenFrom); + return new BaseVersion(v1.ShouldIncrement, v1.SemanticVersion, v1.BaseVersionSource ?? v2.BaseVersionSource); } - return new BaseVersion(v2.ShouldIncrement, v2.SemanticVersion, v2.BaseVersionWhenFrom ?? v1.BaseVersionWhenFrom); + return new BaseVersion(v2.ShouldIncrement, v2.SemanticVersion, v2.BaseVersionSource ?? v1.BaseVersionSource); }); } } diff --git a/GitVersionCore/VersionCalculation/BaseVersionCalculators/BaseVersion.cs b/GitVersionCore/VersionCalculation/BaseVersionCalculators/BaseVersion.cs index 30718b6b9e..9f4b417db9 100644 --- a/GitVersionCore/VersionCalculation/BaseVersionCalculators/BaseVersion.cs +++ b/GitVersionCore/VersionCalculation/BaseVersionCalculators/BaseVersion.cs @@ -1,25 +1,20 @@ namespace GitVersion.VersionCalculation.BaseVersionCalculators { - using System; + using LibGit2Sharp; public class BaseVersion { - public BaseVersion(bool shouldIncrement, SemanticVersion semanticVersion, DateTimeOffset? baseVersionWhenFrom) + public BaseVersion(bool shouldIncrement, SemanticVersion semanticVersion, Commit baseVersionSource) { ShouldIncrement = shouldIncrement; SemanticVersion = semanticVersion; - BaseVersionWhenFrom = baseVersionWhenFrom; + BaseVersionSource = baseVersionSource; } public bool ShouldIncrement { get; private set; } public SemanticVersion SemanticVersion { get; private set; } - /// - /// Can be null even if the base version has a version - /// - /// This happens when the base version doesn't have a time it came from - /// - public DateTimeOffset? BaseVersionWhenFrom { get; private set; } + public Commit BaseVersionSource { get; private set; } } } \ No newline at end of file diff --git a/GitVersionCore/VersionCalculation/BaseVersionCalculators/LastTagBaseVersionStrategy.cs b/GitVersionCore/VersionCalculation/BaseVersionCalculators/LastTagBaseVersionStrategy.cs index f8ca82a0b9..5f87da4626 100644 --- a/GitVersionCore/VersionCalculation/BaseVersionCalculators/LastTagBaseVersionStrategy.cs +++ b/GitVersionCore/VersionCalculation/BaseVersionCalculators/LastTagBaseVersionStrategy.cs @@ -6,7 +6,7 @@ public override BaseVersion GetVersion(GitVersionContext context) { VersionTaggedCommit version; if (new LastTaggedReleaseFinder(context).GetVersion(out version)) - return new BaseVersion(true, version.SemVer, version.Commit.When()); + return new BaseVersion(true, version.SemVer, version.Commit); return null; } diff --git a/GitVersionCore/VersionCalculation/BaseVersionCalculators/MergeMessageBaseVersionStrategy.cs b/GitVersionCore/VersionCalculation/BaseVersionCalculators/MergeMessageBaseVersionStrategy.cs index 6756b5b8a2..44af2a1865 100644 --- a/GitVersionCore/VersionCalculation/BaseVersionCalculators/MergeMessageBaseVersionStrategy.cs +++ b/GitVersionCore/VersionCalculation/BaseVersionCalculators/MergeMessageBaseVersionStrategy.cs @@ -9,7 +9,7 @@ public override BaseVersion GetVersion(GitVersionContext context) SemanticVersion semanticVersion; // TODO when this approach works, inline the other class into here if (MergeMessageParser.TryParse(context.CurrentCommit, context.Configuration, out semanticVersion)) - return new BaseVersion(true, semanticVersion, commit.When()); + return new BaseVersion(true, semanticVersion, commit); } return null; } diff --git a/GitVersionCore/VersionCalculation/IMetaDataCalculator.cs b/GitVersionCore/VersionCalculation/IMetaDataCalculator.cs index e0c3b5335f..967baf8528 100644 --- a/GitVersionCore/VersionCalculation/IMetaDataCalculator.cs +++ b/GitVersionCore/VersionCalculation/IMetaDataCalculator.cs @@ -1,9 +1,9 @@ namespace GitVersion.VersionCalculation { - using System; + using LibGit2Sharp; public interface IMetaDataCalculator { - SemanticVersionBuildMetaData Create(DateTimeOffset? baseVersionWhenFrom, GitVersionContext context); + SemanticVersionBuildMetaData Create(Commit baseVersionSource, GitVersionContext context); } } \ No newline at end of file diff --git a/GitVersionCore/VersionCalculation/MetaDataCalculator.cs b/GitVersionCore/VersionCalculation/MetaDataCalculator.cs index 5b185ab8f4..39db8a4ae8 100644 --- a/GitVersionCore/VersionCalculation/MetaDataCalculator.cs +++ b/GitVersionCore/VersionCalculation/MetaDataCalculator.cs @@ -1,16 +1,15 @@ namespace GitVersion.VersionCalculation { - using System; using System.Linq; using LibGit2Sharp; public class MetaDataCalculator : IMetaDataCalculator { - public SemanticVersionBuildMetaData Create(DateTimeOffset? baseVersionWhenFrom, GitVersionContext context) + public SemanticVersionBuildMetaData Create(Commit baseVersionSource, GitVersionContext context) { var qf = new CommitFilter { - Since = baseVersionWhenFrom, + Since = baseVersionSource, Until = context.CurrentCommit, SortBy = CommitSortStrategies.Topological | CommitSortStrategies.Time }; diff --git a/GitVersionCore/VersionCalculation/NewNextVersionCalculator.cs b/GitVersionCore/VersionCalculation/NewNextVersionCalculator.cs index 6a07788c49..db89f22264 100644 --- a/GitVersionCore/VersionCalculation/NewNextVersionCalculator.cs +++ b/GitVersionCore/VersionCalculation/NewNextVersionCalculator.cs @@ -24,7 +24,12 @@ public SemanticVersion FindVersion(GitVersionContext context) if (baseVersion.ShouldIncrement) IncrementVersion(context, baseVersion); - baseVersion.SemanticVersion.BuildMetaData = metaDataCalculator.Create(baseVersion.BaseVersionWhenFrom, context); + if (!baseVersion.SemanticVersion.PreReleaseTag.HasTag() && !string.IsNullOrEmpty(context.Configuration.Tag)) + { + baseVersion.SemanticVersion.PreReleaseTag = new SemanticVersionPreReleaseTag(context.Configuration.Tag, 1); + } + + baseVersion.SemanticVersion.BuildMetaData = metaDataCalculator.Create(baseVersion.BaseVersionSource, context); return baseVersion.SemanticVersion; } From f008d19517fb50f689707a04fb85f81046d54767 Mon Sep 17 00:00:00 2001 From: Jake Ginnivan Date: Sun, 11 Jan 2015 11:54:48 +0000 Subject: [PATCH 7/8] Should not increment version when current commit is tagged --- .../LastTagBaseVersionStrategyTests.cs | 16 +++++++++++++++- .../LastTagBaseVersionStrategy.cs | 5 ++++- .../VersionCalculation/MetaDataCalculator.cs | 4 +++- .../NewNextVersionCalculator.cs | 7 +++++-- 4 files changed, 27 insertions(+), 5 deletions(-) diff --git a/GitVersionCore.Tests/VersionCalculation/Strategies/LastTagBaseVersionStrategyTests.cs b/GitVersionCore.Tests/VersionCalculation/Strategies/LastTagBaseVersionStrategyTests.cs index 25896a47e7..0f99fcd46f 100644 --- a/GitVersionCore.Tests/VersionCalculation/Strategies/LastTagBaseVersionStrategyTests.cs +++ b/GitVersionCore.Tests/VersionCalculation/Strategies/LastTagBaseVersionStrategyTests.cs @@ -8,10 +8,11 @@ public class LastTagBaseVersionStrategyTests { [Test] - public void ShouldAllowVersionIncremenet() + public void ShouldAllowVersionIncrement() { var context = new GitVersionContextBuilder() .WithTaggedMaster() + .AddCommit() .Build(); var sut = new LastTagBaseVersionStrategy(); @@ -19,5 +20,18 @@ public void ShouldAllowVersionIncremenet() baseVersion.ShouldIncrement.ShouldBe(true); } + + [Test] + public void ShouldNotAllowVersionIncrementWhenTagComesFromCurrentCommit() + { + var context = new GitVersionContextBuilder() + .WithTaggedMaster() + .Build(); + var sut = new LastTagBaseVersionStrategy(); + + var baseVersion = sut.GetVersion(context); + + baseVersion.ShouldIncrement.ShouldBe(false); + } } } \ No newline at end of file diff --git a/GitVersionCore/VersionCalculation/BaseVersionCalculators/LastTagBaseVersionStrategy.cs b/GitVersionCore/VersionCalculation/BaseVersionCalculators/LastTagBaseVersionStrategy.cs index 5f87da4626..a3a6749196 100644 --- a/GitVersionCore/VersionCalculation/BaseVersionCalculators/LastTagBaseVersionStrategy.cs +++ b/GitVersionCore/VersionCalculation/BaseVersionCalculators/LastTagBaseVersionStrategy.cs @@ -6,7 +6,10 @@ public override BaseVersion GetVersion(GitVersionContext context) { VersionTaggedCommit version; if (new LastTaggedReleaseFinder(context).GetVersion(out version)) - return new BaseVersion(true, version.SemVer, version.Commit); + { + var shouldIncrement = version.Commit != context.CurrentCommit; + return new BaseVersion(shouldIncrement, version.SemVer, version.Commit); + } return null; } diff --git a/GitVersionCore/VersionCalculation/MetaDataCalculator.cs b/GitVersionCore/VersionCalculation/MetaDataCalculator.cs index 39db8a4ae8..ac0f76bb32 100644 --- a/GitVersionCore/VersionCalculation/MetaDataCalculator.cs +++ b/GitVersionCore/VersionCalculation/MetaDataCalculator.cs @@ -14,8 +14,10 @@ public SemanticVersionBuildMetaData Create(Commit baseVersionSource, GitVersionC SortBy = CommitSortStrategies.Topological | CommitSortStrategies.Time }; + var commitsSinceTag = context.Repository.Commits.QueryBy(qf).Count(); + return new SemanticVersionBuildMetaData( - context.Repository.Commits.QueryBy(qf).Count(), + commitsSinceTag, context.CurrentBranch.Name, context.CurrentCommit.Sha, context.CurrentCommit.When()); diff --git a/GitVersionCore/VersionCalculation/NewNextVersionCalculator.cs b/GitVersionCore/VersionCalculation/NewNextVersionCalculator.cs index db89f22264..f15daeabae 100644 --- a/GitVersionCore/VersionCalculation/NewNextVersionCalculator.cs +++ b/GitVersionCore/VersionCalculation/NewNextVersionCalculator.cs @@ -57,8 +57,11 @@ static void IncrementVersion(GitVersionContext context, BaseVersion baseVersion) } else { - baseVersion.SemanticVersion.PreReleaseTag.Number = baseVersion.SemanticVersion.PreReleaseTag.Number ?? 0; - baseVersion.SemanticVersion.PreReleaseTag.Number++; + if (baseVersion.SemanticVersion.PreReleaseTag.Number != null) + { + baseVersion.SemanticVersion.PreReleaseTag.Number = baseVersion.SemanticVersion.PreReleaseTag.Number; + baseVersion.SemanticVersion.PreReleaseTag.Number++; + } } } } From 513004a997456b29e2063738364a6730a9979011 Mon Sep 17 00:00:00 2001 From: Jake Ginnivan Date: Sun, 11 Jan 2015 12:20:43 +0000 Subject: [PATCH 8/8] Added missing base version finder --- .../GitVersionContextBuilder.cs | 15 ++++++-- .../GitVersionCore.Tests.csproj | 1 + ...VersionInBranchBaseVersionStrategyTests.cs | 34 ++++++++++++++++++ GitVersionCore/GitVersionCore.csproj | 1 + .../VersionInBranchBaseVersionStrategy.cs | 35 +++++++++++++++++++ .../NewNextVersionCalculator.cs | 3 +- 6 files changed, 86 insertions(+), 3 deletions(-) create mode 100644 GitVersionCore.Tests/VersionCalculation/Strategies/VersionInBranchBaseVersionStrategyTests.cs create mode 100644 GitVersionCore/VersionCalculation/BaseVersionCalculators/VersionInBranchBaseVersionStrategy.cs diff --git a/GitVersionCore.Tests/GitVersionContextBuilder.cs b/GitVersionCore.Tests/GitVersionContextBuilder.cs index 8250dbb12c..9894e3fcba 100644 --- a/GitVersionCore.Tests/GitVersionContextBuilder.cs +++ b/GitVersionCore.Tests/GitVersionContextBuilder.cs @@ -29,14 +29,25 @@ public GitVersionContextBuilder WithTaggedMaster() return this; } + public GitVersionContextBuilder AddCommit() + { + ((MockBranch)repository.Head).Add(new MockCommit()); + return this; + } + public GitVersionContextBuilder WithDevelopBranch() + { + return WithBranch("develop"); + } + + public GitVersionContextBuilder WithBranch(string branchName) { repository = CreateRepository(); - var mockBranch = new MockBranch("develop") + var mockBranch = new MockBranch(branchName) { new MockCommit() }; - ((MockBranchCollection) repository.Branches).Add(mockBranch); + ((MockBranchCollection)repository.Branches).Add(mockBranch); ((MockRepository)repository).Head = mockBranch; return this; } diff --git a/GitVersionCore.Tests/GitVersionCore.Tests.csproj b/GitVersionCore.Tests/GitVersionCore.Tests.csproj index 57ff1fe96a..1874bf8dfd 100644 --- a/GitVersionCore.Tests/GitVersionCore.Tests.csproj +++ b/GitVersionCore.Tests/GitVersionCore.Tests.csproj @@ -121,6 +121,7 @@ + diff --git a/GitVersionCore.Tests/VersionCalculation/Strategies/VersionInBranchBaseVersionStrategyTests.cs b/GitVersionCore.Tests/VersionCalculation/Strategies/VersionInBranchBaseVersionStrategyTests.cs new file mode 100644 index 0000000000..bffb3f0a0e --- /dev/null +++ b/GitVersionCore.Tests/VersionCalculation/Strategies/VersionInBranchBaseVersionStrategyTests.cs @@ -0,0 +1,34 @@ +namespace GitVersionCore.Tests.VersionCalculation.Strategies +{ + using GitVersion.VersionCalculation.BaseVersionCalculators; + using NUnit.Framework; + using Shouldly; + + [TestFixture] + public class VersionInBranchBaseVersionStrategyTests + { + [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("hotfix/2.0.0", "2.0.0")] + [TestCase("feature/JIRA-123", null)] + public void CanTakeVersionFromBranchName(string branchName, string expectedBaseVersion) + { + var context = new GitVersionContextBuilder() + .WithBranch(branchName) + .AddCommit() + .Build(); + + var sut = new VersionInBranchBaseVersionStrategy(); + + var baseVersion = sut.GetVersion(context); + + if (expectedBaseVersion == null) + baseVersion.ShouldBe(null); + else + baseVersion.SemanticVersion.ToString().ShouldBe(expectedBaseVersion); + } + } +} diff --git a/GitVersionCore/GitVersionCore.csproj b/GitVersionCore/GitVersionCore.csproj index 4614b2d75b..cd29124ef3 100644 --- a/GitVersionCore/GitVersionCore.csproj +++ b/GitVersionCore/GitVersionCore.csproj @@ -93,6 +93,7 @@ + diff --git a/GitVersionCore/VersionCalculation/BaseVersionCalculators/VersionInBranchBaseVersionStrategy.cs b/GitVersionCore/VersionCalculation/BaseVersionCalculators/VersionInBranchBaseVersionStrategy.cs new file mode 100644 index 0000000000..1f384f7131 --- /dev/null +++ b/GitVersionCore/VersionCalculation/BaseVersionCalculators/VersionInBranchBaseVersionStrategy.cs @@ -0,0 +1,35 @@ +namespace GitVersion.VersionCalculation.BaseVersionCalculators +{ + using System; + using System.Linq; + + public class VersionInBranchBaseVersionStrategy : BaseVersionStrategy + { + public override BaseVersion GetVersion(GitVersionContext context) + { + var versionInBranch = GetVersionInBranch(context); + if (versionInBranch != null) + { + var firstCommitOfBranch = context.CurrentBranch.Commits.Last(); + return new BaseVersion(false, versionInBranch.Item2, firstCommitOfBranch); + } + + return null; + } + + Tuple GetVersionInBranch(GitVersionContext context) + { + var branchParts = context.CurrentBranch.Name.Split('/', '-'); + foreach (var part in branchParts) + { + SemanticVersion semanticVersion; + if (SemanticVersion.TryParse(part, context.Configuration.GitTagPrefix, out semanticVersion)) + { + return Tuple.Create(part, semanticVersion); + } + } + + return null; + } + } +} \ No newline at end of file diff --git a/GitVersionCore/VersionCalculation/NewNextVersionCalculator.cs b/GitVersionCore/VersionCalculation/NewNextVersionCalculator.cs index f15daeabae..d5f2ec7c37 100644 --- a/GitVersionCore/VersionCalculation/NewNextVersionCalculator.cs +++ b/GitVersionCore/VersionCalculation/NewNextVersionCalculator.cs @@ -15,7 +15,8 @@ public NewNextVersionCalculator(IBaseVersionCalculator baseVersionCalculator = n new BaseVersionCalculator( new ConfigNextVersionBaseVersionStrategy(), new LastTagBaseVersionStrategy(), - new MergeMessageBaseVersionStrategy()); + new MergeMessageBaseVersionStrategy(), + new VersionInBranchBaseVersionStrategy()); } public SemanticVersion FindVersion(GitVersionContext context)