diff --git a/GitVersionCore.Tests/GitVersionCore.Tests.csproj b/GitVersionCore.Tests/GitVersionCore.Tests.csproj index 3b40ffde11..ca3f3b5244 100644 --- a/GitVersionCore.Tests/GitVersionCore.Tests.csproj +++ b/GitVersionCore.Tests/GitVersionCore.Tests.csproj @@ -127,7 +127,6 @@ - diff --git a/GitVersionCore.Tests/IntegrationTests/HotfixBranchScenarios.cs b/GitVersionCore.Tests/IntegrationTests/HotfixBranchScenarios.cs index e7e9632667..983bda480d 100644 --- a/GitVersionCore.Tests/IntegrationTests/HotfixBranchScenarios.cs +++ b/GitVersionCore.Tests/IntegrationTests/HotfixBranchScenarios.cs @@ -13,20 +13,20 @@ public void PatchLatestReleaseExample() // create hotfix fixture.Repository.CreateBranch("hotfix-1.2.1").Checkout(); - fixture.AssertFullSemver("1.2.1-beta.1+0"); - fixture.Repository.MakeACommit(); fixture.AssertFullSemver("1.2.1-beta.1+1"); + fixture.Repository.MakeACommit(); + fixture.AssertFullSemver("1.2.1-beta.1+2"); fixture.Repository.ApplyTag("1.2.1-beta.1"); fixture.AssertFullSemver("1.2.1-beta.1"); fixture.Repository.MakeACommit(); - fixture.AssertFullSemver("1.2.1-beta.2+2"); + fixture.AssertFullSemver("1.2.1-beta.2+3"); // Merge hotfix branch to master fixture.Repository.Checkout("master"); fixture.Repository.MergeNoFF("hotfix-1.2.1", Constants.SignatureNow()); - fixture.AssertFullSemver("1.2.1+0"); + fixture.AssertFullSemver("1.2.1+4"); fixture.Repository.ApplyTag("1.2.1"); fixture.AssertFullSemver("1.2.1"); @@ -36,7 +36,7 @@ public void PatchLatestReleaseExample() fixture.AssertFullSemver("1.3.0-unstable.1"); fixture.Repository.MergeNoFF("hotfix-1.2.1", Constants.SignatureNow()); - fixture.AssertFullSemver("1.3.0-unstable.0"); + fixture.AssertFullSemver("1.3.0-unstable.4"); } } @@ -73,12 +73,12 @@ public void PatchOlderReleaseExample() fixture.AssertFullSemver("1.1.1-PullRequest.2+4"); fixture.Repository.Checkout("hotfix-1.1.1"); fixture.Repository.MergeNoFF("feature/fix", Constants.SignatureNow()); - fixture.AssertFullSemver("1.1.1-beta.1+1"); + fixture.AssertFullSemver("1.1.1-beta.1+4"); // Merge hotfix into support branch to complete hotfix fixture.Repository.Checkout("support-1.1"); fixture.Repository.MergeNoFF("hotfix-1.1.1", Constants.SignatureNow()); - fixture.AssertFullSemver("1.1.1+0"); + fixture.AssertFullSemver("1.1.1+5"); fixture.Repository.ApplyTag("1.1.1"); fixture.AssertFullSemver("1.1.1"); diff --git a/GitVersionCore.Tests/IntegrationTests/ReleaseBranchScenarios.cs b/GitVersionCore.Tests/IntegrationTests/ReleaseBranchScenarios.cs index f2192e47ae..a90cde8c68 100644 --- a/GitVersionCore.Tests/IntegrationTests/ReleaseBranchScenarios.cs +++ b/GitVersionCore.Tests/IntegrationTests/ReleaseBranchScenarios.cs @@ -47,11 +47,12 @@ public void NoMergeBacksToDevelopInCaseThereAreChangesInReleaseBranch() // Merge to develop fixture.Repository.Checkout("develop"); fixture.Repository.MergeNoFF("release/1.0.0"); + fixture.AssertFullSemver("1.1.0-unstable.1"); fixture.Repository.MakeACommit(); fixture.Repository.Branches.Remove(releaseBranch); - fixture.AssertFullSemver("1.1.0-unstable.1"); + fixture.AssertFullSemver("1.1.0-unstable.2"); } } diff --git a/GitVersionCore.Tests/IntegrationTests/SupportBranchScenarios.cs b/GitVersionCore.Tests/IntegrationTests/SupportBranchScenarios.cs index e2cfffddb7..7efcd1f7c2 100644 --- a/GitVersionCore.Tests/IntegrationTests/SupportBranchScenarios.cs +++ b/GitVersionCore.Tests/IntegrationTests/SupportBranchScenarios.cs @@ -46,7 +46,7 @@ public void SupportIsCalculatedCorrectly() fixture.AssertFullSemver("1.2.1-beta.1+1"); fixture.Repository.Checkout("support/1.0.0"); fixture.Repository.MergeNoFF("hotfix/1.2.1"); - fixture.AssertFullSemver("1.2.1+0"); + fixture.AssertFullSemver("1.2.1+2"); } } diff --git a/GitVersionCore.Tests/IntegrationTests/WikiScenarios.cs b/GitVersionCore.Tests/IntegrationTests/WikiScenarios.cs index 30b9ac81a2..ba3d5cba9a 100644 --- a/GitVersionCore.Tests/IntegrationTests/WikiScenarios.cs +++ b/GitVersionCore.Tests/IntegrationTests/WikiScenarios.cs @@ -88,8 +88,10 @@ public void MinorReleaseExample() // Verify develop version fixture.Repository.Checkout("develop"); + fixture.AssertFullSemver("1.3.0-unstable.4"); fixture.Repository.MergeNoFF("release-1.3.0", Constants.SignatureNow()); - fixture.AssertFullSemver("1.4.0-unstable.0"); + // Not 0 for commit count as we can't know the increment rules of the merged branch + fixture.AssertFullSemver("1.4.0-unstable.2"); } } } \ No newline at end of file diff --git a/GitVersionCore.Tests/Mocks/MockQueryableCommitLog.cs b/GitVersionCore.Tests/Mocks/MockQueryableCommitLog.cs index e1120b8f5d..baca1b0820 100644 --- a/GitVersionCore.Tests/Mocks/MockQueryableCommitLog.cs +++ b/GitVersionCore.Tests/Mocks/MockQueryableCommitLog.cs @@ -29,12 +29,12 @@ public CommitSortStrategies SortedBy public ICommitLog QueryBy(CommitFilter filter) { - throw new NotImplementedException(); + return this; } public Commit FindMergeBase(Commit first, Commit second) { - throw new NotImplementedException(); + return null; } public Commit FindMergeBase(IEnumerable commits, MergeBaseFindingStrategy strategy) diff --git a/GitVersionCore.Tests/VersionCalculation/BaseVersionCalculatorTests.cs b/GitVersionCore.Tests/VersionCalculation/BaseVersionCalculatorTests.cs index bca3e98e91..2da731f1c9 100644 --- a/GitVersionCore.Tests/VersionCalculation/BaseVersionCalculatorTests.cs +++ b/GitVersionCore.Tests/VersionCalculation/BaseVersionCalculatorTests.cs @@ -1,6 +1,7 @@ namespace GitVersionCore.Tests.VersionCalculation { using System; + using System.Collections.Generic; using GitVersion; using GitVersion.VersionCalculation; using GitVersion.VersionCalculation.BaseVersionCalculators; @@ -62,9 +63,9 @@ public V1Strategy(DateTimeOffset? when) this.when = when == null ? null : new MockCommit { CommitterEx = when.Value.ToSignature() }; } - public override BaseVersion GetVersion(GitVersionContext context) + public override IEnumerable GetVersions(GitVersionContext context) { - return new BaseVersion("Source 1", false, new SemanticVersion(1), when, null); + yield return new BaseVersion("Source 1", false, new SemanticVersion(1), when, null); } } @@ -77,9 +78,9 @@ public V2Strategy(DateTimeOffset? when) this.when = when == null ? null : new MockCommit { CommitterEx = when.Value.ToSignature() }; } - public override BaseVersion GetVersion(GitVersionContext context) + public override IEnumerable GetVersions(GitVersionContext context) { - return new BaseVersion("Source 2", true, new SemanticVersion(2), when, null); + yield return new BaseVersion("Source 2", true, new SemanticVersion(2), when, null); } } } diff --git a/GitVersionCore.Tests/VersionCalculation/Strategies/ConfigNextVersionBaseVersionStrategyTests.cs b/GitVersionCore.Tests/VersionCalculation/Strategies/ConfigNextVersionBaseVersionStrategyTests.cs index d68469ccfd..2ef245e25f 100644 --- a/GitVersionCore.Tests/VersionCalculation/Strategies/ConfigNextVersionBaseVersionStrategyTests.cs +++ b/GitVersionCore.Tests/VersionCalculation/Strategies/ConfigNextVersionBaseVersionStrategyTests.cs @@ -1,5 +1,6 @@ namespace GitVersionCore.Tests.VersionCalculation.Strategies { + using System.Linq; using GitVersion; using GitVersion.VersionCalculation.BaseVersionCalculators; using NUnit.Framework; @@ -18,7 +19,7 @@ public void ShouldNotBeIncremented() }); var sut = new ConfigNextVersionBaseVersionStrategy(); - var baseVersion = sut.GetVersion(contextBuilder.Build()); + var baseVersion = sut.GetVersions(contextBuilder.Build()).Single(); baseVersion.ShouldIncrement.ShouldBe(false); baseVersion.SemanticVersion.ToString().ShouldBe("1.0.0"); @@ -30,7 +31,7 @@ public void ReturnsNullWhenNoNextVersionIsInConfig() var contextBuilder = new GitVersionContextBuilder(); var sut = new ConfigNextVersionBaseVersionStrategy(); - var baseVersion = sut.GetVersion(contextBuilder.Build()); + var baseVersion = sut.GetVersions(contextBuilder.Build()).SingleOrDefault(); baseVersion.ShouldBe(null); } diff --git a/GitVersionCore.Tests/VersionCalculation/Strategies/LastTagBaseVersionStrategyTests.cs b/GitVersionCore.Tests/VersionCalculation/Strategies/LastTagBaseVersionStrategyTests.cs deleted file mode 100644 index 536b740e88..0000000000 --- a/GitVersionCore.Tests/VersionCalculation/Strategies/LastTagBaseVersionStrategyTests.cs +++ /dev/null @@ -1,37 +0,0 @@ -namespace GitVersionCore.Tests.VersionCalculation.Strategies -{ - using GitVersion.VersionCalculation.BaseVersionCalculators; - using NUnit.Framework; - using Shouldly; - - [TestFixture] - public class LastTagBaseVersionStrategyTests - { - [Test] - public void ShouldAllowVersionIncrement() - { - var context = new GitVersionContextBuilder() - .WithTaggedMaster() - .AddCommit() - .Build(); - var sut = new HighestTagBaseVersionStrategy(); - - var baseVersion = sut.GetVersion(context); - - baseVersion.ShouldIncrement.ShouldBe(true); - } - - [Test] - public void ShouldNotAllowVersionIncrementWhenTagComesFromCurrentCommit() - { - var context = new GitVersionContextBuilder() - .WithTaggedMaster() - .Build(); - var sut = new HighestTagBaseVersionStrategy(); - - var baseVersion = sut.GetVersion(context); - - baseVersion.ShouldIncrement.ShouldBe(false); - } - } -} \ No newline at end of file diff --git a/GitVersionCore.Tests/VersionCalculation/Strategies/MergeMessageBaseVersionStrategyTests.cs b/GitVersionCore.Tests/VersionCalculation/Strategies/MergeMessageBaseVersionStrategyTests.cs index 0396d1f347..c4e0ea5f79 100644 --- a/GitVersionCore.Tests/VersionCalculation/Strategies/MergeMessageBaseVersionStrategyTests.cs +++ b/GitVersionCore.Tests/VersionCalculation/Strategies/MergeMessageBaseVersionStrategyTests.cs @@ -1,6 +1,7 @@ namespace GitVersionCore.Tests.VersionCalculation.Strategies { using System.Collections.Generic; + using System.Linq; using GitVersion.VersionCalculation.BaseVersionCalculators; using LibGit2Sharp; using NUnit.Framework; @@ -24,7 +25,7 @@ public void ShouldNotAllowIncrementOfVersion() }).Build(); var sut = new MergeMessageBaseVersionStrategy(); - var baseVersion = sut.GetVersion(context); + var baseVersion = sut.GetVersions(context).Single(); baseVersion.ShouldIncrement.ShouldBe(false); } @@ -109,7 +110,7 @@ static void AssertMergeMessage(string message, string expectedVersion, List x.Name == "origin/" + branchName); } + public static SemanticVersion LastVersionTagOnBranch(this Branch branch, IRepository repository, string tagPrefixRegex) + { + var tags = repository.Tags.Select(t => t).ToList(); + var until = FindCommitBranchWasBranchedFrom(branch, repository); + + return repository.Commits.QueryBy(new CommitFilter + { + Since = branch.Tip, + Until = until + }) + .SelectMany(c => tags.Where(t => c.Sha == t.Target.Sha).SelectMany(t => + { + SemanticVersion semver; + if (SemanticVersion.TryParse(t.Name, tagPrefixRegex, out semver)) + return new [] { semver }; + return new SemanticVersion[0]; + })) + .FirstOrDefault(); + } + public static Commit FindCommitBranchWasBranchedFrom(this Branch branch, IRepository repository, params Branch[] excludedBranches) { - var otherBranches = repository.Branches.Except(excludedBranches).Where(b => IsSameBranch(branch, b)).ToList(); - var mergeBases = otherBranches.Select(b => + using (Logger.IndentLog("Finding branch source")) { - var otherCommit = b.Tip; - if (b.Tip.Parents.Contains(branch.Tip)) + var otherBranches = repository.Branches.Except(excludedBranches).Where(b => IsSameBranch(branch, b)).ToList(); + var mergeBases = otherBranches.Select(b => { - otherCommit = b.Tip.Parents.First(); - } - var mergeBase = repository.Commits.FindMergeBase(otherCommit, branch.Tip); - return mergeBase; - }).Where(b => b != null).ToList(); - return mergeBases.OrderByDescending(b => b.Committer.When).FirstOrDefault(); + var otherCommit = b.Tip; + if (b.Tip.Parents.Contains(branch.Tip)) + { + otherCommit = b.Tip.Parents.First(); + } + var mergeBase = repository.Commits.FindMergeBase(otherCommit, branch.Tip); + return mergeBase; + }).Where(b => b != null).ToList(); + return mergeBases.OrderByDescending(b => b.Committer.When).FirstOrDefault(); + } } static bool IsSameBranch(Branch branch, Branch b) diff --git a/GitVersionCore/Logger.cs b/GitVersionCore/Logger.cs index 7f4ee42afc..6dbd7fbdb8 100644 --- a/GitVersionCore/Logger.cs +++ b/GitVersionCore/Logger.cs @@ -19,8 +19,8 @@ static Logger() public static IDisposable IndentLog(string operationDescription) { var start = DateTime.Now; - indent = indent + " "; WriteInfo("Begin: " + operationDescription); + indent = indent + " "; return new ActionDisposable(() => { indent = indent.Substring(0, indent.Length - 2); diff --git a/GitVersionCore/SemanticVersion.cs b/GitVersionCore/SemanticVersion.cs index badb877a28..806fc5bb1b 100644 --- a/GitVersionCore/SemanticVersion.cs +++ b/GitVersionCore/SemanticVersion.cs @@ -280,10 +280,8 @@ public SemanticVersion IncrementVersion(IncrementStrategy incrementStrategy) switch (incrementStrategy) { case IncrementStrategy.None: - Logger.WriteInfo("Skipping version increment"); break; case IncrementStrategy.Major: - Logger.WriteInfo("Incrementing Major Version"); incremented.Major++; incremented.Minor = 0; incremented.Patch = 0; @@ -291,11 +289,9 @@ public SemanticVersion IncrementVersion(IncrementStrategy incrementStrategy) case IncrementStrategy.Minor: incremented.Minor++; incremented.Patch = 0; - Logger.WriteInfo("Incrementing Minor Version"); break; case IncrementStrategy.Patch: incremented.Patch++; - Logger.WriteInfo("Incrementing Patch Version"); break; default: throw new ArgumentOutOfRangeException(); @@ -305,7 +301,6 @@ public SemanticVersion IncrementVersion(IncrementStrategy incrementStrategy) { if (incremented.PreReleaseTag.Number != null) { - Logger.WriteInfo("Incrementing prerelease"); incremented.PreReleaseTag.Number = incremented.PreReleaseTag.Number; incremented.PreReleaseTag.Number++; } diff --git a/GitVersionCore/VersionCalculation/BaseVersionCalculator.cs b/GitVersionCore/VersionCalculation/BaseVersionCalculator.cs index ecf7967047..e3c4b43058 100644 --- a/GitVersionCore/VersionCalculation/BaseVersionCalculator.cs +++ b/GitVersionCore/VersionCalculation/BaseVersionCalculator.cs @@ -1,7 +1,8 @@ namespace GitVersion.VersionCalculation { + using System; using System.Linq; - using BaseVersionCalculators; + using GitVersion.VersionCalculation.BaseVersionCalculators; public class BaseVersionCalculator : IBaseVersionCalculator { @@ -16,8 +17,8 @@ public BaseVersion GetBaseVersion(GitVersionContext context) { using (Logger.IndentLog("Calculating base versions")) { - var baseVersion = strategies - .Select(s => s.GetVersion(context)) + var baseVersions = strategies + .SelectMany(s => s.GetVersions(context)) .Where(v => { if (v != null) @@ -28,20 +29,48 @@ public BaseVersion GetBaseVersion(GitVersionContext context) return false; }) - .Aggregate((v1, v2) => + .ToList(); + + var maxVersion = baseVersions.Aggregate((v1, v2) => + { + if (v1.SemanticVersion > v2.SemanticVersion) { - if (v1.SemanticVersion > v2.SemanticVersion) - { - return new BaseVersion(v1.Source, v1.ShouldIncrement, v1.SemanticVersion, v1.BaseVersionSource ?? v2.BaseVersionSource, v1.BranchNameOverride); - } + return new BaseVersion(v1.Source, v1.ShouldIncrement, v1.SemanticVersion, v1.BaseVersionSource ?? v2.BaseVersionSource, v1.BranchNameOverride); + } + return new BaseVersion(v2.Source, v2.ShouldIncrement, v2.SemanticVersion, v2.BaseVersionSource ?? v1.BaseVersionSource, v2.BranchNameOverride); + }); + var incrementedMax = MaybeIncrement(context, maxVersion); + var matchingVersionsOnceIncremented = baseVersions.Where(b => b.BaseVersionSource != null && MaybeIncrement(context, b) == incrementedMax).ToList(); + BaseVersion baseVersionWithOldestSource; + if (matchingVersionsOnceIncremented.Any()) + { + baseVersionWithOldestSource = matchingVersionsOnceIncremented.Aggregate((v1, v2) => v1.BaseVersionSource.Committer.When < v2.BaseVersionSource.Committer.When ? v1 : v2); + Logger.WriteInfo(string.Format( + "Found multiple base versions which will produce the same SemVer ({0}), taking oldest source for commit counting ({1})", + incrementedMax, + baseVersionWithOldestSource.Source)); + } + else + { + baseVersionWithOldestSource = maxVersion; + } + + if (baseVersionWithOldestSource.BaseVersionSource == null) + throw new Exception("Base version should not be null"); - return new BaseVersion(v2.Source, v2.ShouldIncrement, v2.SemanticVersion, v2.BaseVersionSource ?? v1.BaseVersionSource, v2.BranchNameOverride); - }); + var calculatedBase = new BaseVersion( + maxVersion.Source, maxVersion.ShouldIncrement, maxVersion.SemanticVersion, + baseVersionWithOldestSource.BaseVersionSource, maxVersion.BranchNameOverride); - Logger.WriteInfo(string.Format("Base version used: {0}", baseVersion)); + Logger.WriteInfo(string.Format("Base version used: {0}", calculatedBase)); - return baseVersion; + return calculatedBase; } } + + static SemanticVersion MaybeIncrement(GitVersionContext context, BaseVersion version) + { + return version.ShouldIncrement ? version.SemanticVersion.IncrementVersion(context.Configuration.Increment) : version.SemanticVersion; + } } } \ No newline at end of file diff --git a/GitVersionCore/VersionCalculation/BaseVersionCalculators/ConfigNextVersionBaseVersionStrategy.cs b/GitVersionCore/VersionCalculation/BaseVersionCalculators/ConfigNextVersionBaseVersionStrategy.cs index 784193c0c5..f21f4f4346 100644 --- a/GitVersionCore/VersionCalculation/BaseVersionCalculators/ConfigNextVersionBaseVersionStrategy.cs +++ b/GitVersionCore/VersionCalculation/BaseVersionCalculators/ConfigNextVersionBaseVersionStrategy.cs @@ -1,13 +1,15 @@ namespace GitVersion.VersionCalculation.BaseVersionCalculators { + using System.Collections.Generic; + public class ConfigNextVersionBaseVersionStrategy : BaseVersionStrategy { - public override BaseVersion GetVersion(GitVersionContext context) + public override IEnumerable GetVersions(GitVersionContext context) { if (string.IsNullOrEmpty(context.Configuration.NextVersion) || context.IsCurrentCommitTagged) - return null; + yield break; var semanticVersion = SemanticVersion.Parse(context.Configuration.NextVersion, context.Configuration.GitTagPrefix); - return new BaseVersion("NextVersion in GitVersionConfig.yaml", false, semanticVersion, null, null); + yield return new BaseVersion("NextVersion in GitVersionConfig.yaml", false, semanticVersion, null, null); } } } \ No newline at end of file diff --git a/GitVersionCore/VersionCalculation/BaseVersionCalculators/HighestTagBaseVersionStrategy.cs b/GitVersionCore/VersionCalculation/BaseVersionCalculators/HighestTagBaseVersionStrategy.cs index 84d82ed2ae..0abfe31562 100644 --- a/GitVersionCore/VersionCalculation/BaseVersionCalculators/HighestTagBaseVersionStrategy.cs +++ b/GitVersionCore/VersionCalculation/BaseVersionCalculators/HighestTagBaseVersionStrategy.cs @@ -1,28 +1,12 @@ namespace GitVersion.VersionCalculation.BaseVersionCalculators { + using System.Collections.Generic; using System.Linq; using LibGit2Sharp; - public class HighestTagBaseVersionStrategy : BaseVersionStrategy + public class TaggedCommitVersionStrategy : BaseVersionStrategy { - public override BaseVersion GetVersion(GitVersionContext context) - { - VersionTaggedCommit version; - if (GetVersion(context, out version)) - { - var shouldUpdateVersion = version.Commit.Sha != context.CurrentCommit.Sha; - return new BaseVersion(string.Format("Git tag '{0}'", version.Tag), shouldUpdateVersion, version.SemVer, version.Commit, null); - } - - return null; - } - - protected virtual bool IsValidTag(GitVersionContext context, string branchName, Tag tag, Commit commit) - { - return tag.PeeledTarget() == commit; - } - - bool GetVersion(GitVersionContext context, out VersionTaggedCommit versionTaggedCommit) + public override IEnumerable GetVersions(GitVersionContext context) { string currentBranchName = null; var head = context.Repository.Head; @@ -55,20 +39,37 @@ bool GetVersion(GitVersionContext context, out VersionTaggedCommit versionTagged if (tagsOnBranch.Count == 0) { - versionTaggedCommit = null; - return false; + yield break; } if (tagsOnBranch.Count == 1) { - versionTaggedCommit = tagsOnBranch[0]; - return true; + yield return CreateBaseVersion(context, tagsOnBranch[0]); + } + + foreach (var result in tagsOnBranch.Select(t => CreateBaseVersion(context, t))) + { + yield return result; } + } + + BaseVersion CreateBaseVersion(GitVersionContext context, VersionTaggedCommit version) + { + var shouldUpdateVersion = version.Commit.Sha != context.CurrentCommit.Sha; + var baseVersion = new BaseVersion(FormatSource(version), shouldUpdateVersion, version.SemVer, version.Commit, null); + return baseVersion; + } - versionTaggedCommit = tagsOnBranch.Skip(1).Aggregate(tagsOnBranch[0], (t, t1) => t.SemVer > t1.SemVer ? t : t1); - return true; + protected virtual string FormatSource(VersionTaggedCommit version) + { + return string.Format("Git tag '{0}'", version.Tag); + } + + protected virtual bool IsValidTag(GitVersionContext context, string branchName, Tag tag, Commit commit) + { + return tag.PeeledTarget() == commit; } - class VersionTaggedCommit + protected class VersionTaggedCommit { public string Tag; public Commit Commit; diff --git a/GitVersionCore/VersionCalculation/BaseVersionCalculators/MergeMessageBaseVersionStrategy.cs b/GitVersionCore/VersionCalculation/BaseVersionCalculators/MergeMessageBaseVersionStrategy.cs index 4d5d9d6e07..07fd3e0d67 100644 --- a/GitVersionCore/VersionCalculation/BaseVersionCalculators/MergeMessageBaseVersionStrategy.cs +++ b/GitVersionCore/VersionCalculation/BaseVersionCalculators/MergeMessageBaseVersionStrategy.cs @@ -1,12 +1,13 @@ namespace GitVersion.VersionCalculation.BaseVersionCalculators { + using System.Collections.Generic; using System.Linq; using System.Text.RegularExpressions; using LibGit2Sharp; public class MergeMessageBaseVersionStrategy : BaseVersionStrategy { - public override BaseVersion GetVersion(GitVersionContext context) + public override IEnumerable GetVersions(GitVersionContext context) { var commitsPriorToThan = context.CurrentBranch .CommitsPriorToThan(context.CurrentCommit.When()); @@ -23,10 +24,8 @@ public override BaseVersion GetVersion(GitVersionContext context) }; } return Enumerable.Empty(); - }) - .ToArray(); - - return baseVersions.Length > 1 ? baseVersions.Aggregate((x, y) => x.SemanticVersion > y.SemanticVersion ? x : y) : baseVersions.SingleOrDefault(); + }).ToList(); + return baseVersions; } static bool TryParse(Commit mergeCommit, EffectiveConfiguration configuration, out SemanticVersion semanticVersion) diff --git a/GitVersionCore/VersionCalculation/BaseVersionCalculators/TrackMergeTargetBaseVersionStrategy.cs b/GitVersionCore/VersionCalculation/BaseVersionCalculators/TrackMergeTargetBaseVersionStrategy.cs index 79da45ee8b..1f12d0af78 100644 --- a/GitVersionCore/VersionCalculation/BaseVersionCalculators/TrackMergeTargetBaseVersionStrategy.cs +++ b/GitVersionCore/VersionCalculation/BaseVersionCalculators/TrackMergeTargetBaseVersionStrategy.cs @@ -4,7 +4,7 @@ using System.Linq; using LibGit2Sharp; - public class TrackMergeTargetBaseVersionStrategy : HighestTagBaseVersionStrategy + public class TrackMergeTargetBaseVersionStrategy : TaggedCommitVersionStrategy { protected override bool IsValidTag(GitVersionContext context, string branchName, Tag tag, Commit commit) { @@ -16,9 +16,15 @@ protected override bool IsValidTag(GitVersionContext context, string branchName, } } - return base.IsValidTag(context, branchName, tag, commit); + return false; } + protected override string FormatSource(VersionTaggedCommit version) + { + return string.Format("Merge target tagged '{0}'", version.Tag); + } + + static bool IsDirectMergeFromCommit(Tag tag, Commit commit) { var targetCommit = tag.Target as Commit; diff --git a/GitVersionCore/VersionCalculation/BaseVersionCalculators/VersionInBranchBaseVersionStrategy.cs b/GitVersionCore/VersionCalculation/BaseVersionCalculators/VersionInBranchBaseVersionStrategy.cs index 195ee45306..03f113d86c 100644 --- a/GitVersionCore/VersionCalculation/BaseVersionCalculators/VersionInBranchBaseVersionStrategy.cs +++ b/GitVersionCore/VersionCalculation/BaseVersionCalculators/VersionInBranchBaseVersionStrategy.cs @@ -1,20 +1,19 @@ namespace GitVersion.VersionCalculation.BaseVersionCalculators { using System; + using System.Collections.Generic; public class VersionInBranchBaseVersionStrategy : BaseVersionStrategy { - public override BaseVersion GetVersion(GitVersionContext context) + public override IEnumerable GetVersions(GitVersionContext context) { var versionInBranch = GetVersionInBranch(context); if (versionInBranch != null) { var commitBranchWasBranchedFrom = context.CurrentBranch.FindCommitBranchWasBranchedFrom(context.Repository); var branchNameOverride = context.CurrentBranch.Name.RegexReplace("[-/]" + versionInBranch.Item1, string.Empty); - return new BaseVersion("Version in branch name", false, versionInBranch.Item2, commitBranchWasBranchedFrom, branchNameOverride); + yield return new BaseVersion("Version in branch name", false, versionInBranch.Item2, commitBranchWasBranchedFrom, branchNameOverride); } - - return null; } Tuple GetVersionInBranch(GitVersionContext context) diff --git a/GitVersionCore/VersionCalculation/BaseVersionStrategy.cs b/GitVersionCore/VersionCalculation/BaseVersionStrategy.cs index 855d4cbc3a..a30ccd8c32 100644 --- a/GitVersionCore/VersionCalculation/BaseVersionStrategy.cs +++ b/GitVersionCore/VersionCalculation/BaseVersionStrategy.cs @@ -1,9 +1,10 @@ namespace GitVersion.VersionCalculation { - using GitVersion.VersionCalculation.BaseVersionCalculators; + using System.Collections.Generic; + using BaseVersionCalculators; public abstract class BaseVersionStrategy { - public abstract BaseVersion GetVersion(GitVersionContext context); + public abstract IEnumerable GetVersions(GitVersionContext context); } } \ No newline at end of file diff --git a/GitVersionCore/VersionCalculation/FallbackBaseVersionStrategy.cs b/GitVersionCore/VersionCalculation/FallbackBaseVersionStrategy.cs index 2eb6063922..5a44fc5d82 100644 --- a/GitVersionCore/VersionCalculation/FallbackBaseVersionStrategy.cs +++ b/GitVersionCore/VersionCalculation/FallbackBaseVersionStrategy.cs @@ -1,18 +1,19 @@ namespace GitVersion.VersionCalculation { + using System.Collections.Generic; using System.Linq; using BaseVersionCalculators; using LibGit2Sharp; public class FallbackBaseVersionStrategy : BaseVersionStrategy { - public override BaseVersion GetVersion(GitVersionContext context) + public override IEnumerable GetVersions(GitVersionContext context) { var baseVersionSource = context.Repository.Commits.QueryBy(new CommitFilter { Since = context.CurrentBranch.Tip }).First(c => !c.Parents.Any()); - return new BaseVersion("Fallback base version", false, new SemanticVersion(minor: 1), baseVersionSource, null); + yield return new BaseVersion("Fallback base version", false, new SemanticVersion(minor: 1), baseVersionSource, null); } } } \ No newline at end of file diff --git a/GitVersionCore/VersionCalculation/NextVersionCalculator.cs b/GitVersionCore/VersionCalculation/NextVersionCalculator.cs index 7698ffce07..114c990dde 100644 --- a/GitVersionCore/VersionCalculation/NextVersionCalculator.cs +++ b/GitVersionCore/VersionCalculation/NextVersionCalculator.cs @@ -1,23 +1,21 @@ namespace GitVersion.VersionCalculation { using System.Text.RegularExpressions; - using GitVersion.VersionCalculation.BaseVersionCalculators; + using BaseVersionCalculators; public class NextVersionCalculator { IBaseVersionCalculator baseVersionFinder; IMetaDataCalculator metaDataCalculator; - HighestTagBaseVersionStrategy highestTagBaseVersionStrategy; public NextVersionCalculator(IBaseVersionCalculator baseVersionCalculator = null, IMetaDataCalculator metaDataCalculator = null) { this.metaDataCalculator = metaDataCalculator ?? new MetaDataCalculator(); - highestTagBaseVersionStrategy = new HighestTagBaseVersionStrategy(); baseVersionFinder = baseVersionCalculator ?? new BaseVersionCalculator( new FallbackBaseVersionStrategy(), new ConfigNextVersionBaseVersionStrategy(), - highestTagBaseVersionStrategy, + new TaggedCommitVersionStrategy(), new TrackMergeTargetBaseVersionStrategy(), new MergeMessageBaseVersionStrategy(), new VersionInBranchBaseVersionStrategy()); @@ -75,14 +73,14 @@ void UpdatePreReleaseTag(GitVersionContext context, SemanticVersion semanticVers number = int.Parse(numberGroup.Value); } } - - var lastTag = highestTagBaseVersionStrategy.GetVersion(context); + + var lastTag = context.CurrentBranch.LastVersionTagOnBranch(context.Repository, context.Configuration.GitTagPrefix); if (number == null && lastTag != null && - MajorMinorPatchEqual(lastTag.SemanticVersion, semanticVersion) && - lastTag.SemanticVersion.PreReleaseTag.HasTag()) + MajorMinorPatchEqual(lastTag, semanticVersion) && + lastTag.PreReleaseTag.HasTag()) { - number = lastTag.SemanticVersion.PreReleaseTag.Number + 1; + number = lastTag.PreReleaseTag.Number + 1; } if (number == null)