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)