Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
77 changes: 77 additions & 0 deletions src/GitVersionCore.Tests/IntegrationTests/DevelopScenarios.cs
Original file line number Diff line number Diff line change
Expand Up @@ -222,4 +222,81 @@ public void TagOnHotfixShouldNotAffectDevelop()
fixture.AssertFullSemver("1.3.0-alpha.2");
}
}

[Test]
public void CommitsSinceVersionSourceShouldNotGoDownUponGitFlowReleaseFinish()
{
var config = new Config
{
VersioningMode = VersioningMode.ContinuousDeployment
};

using (var fixture = new EmptyRepositoryFixture())
{
fixture.MakeACommit();
fixture.ApplyTag("1.1.0");
fixture.BranchTo("develop");
fixture.MakeACommit("commit in develop - 1");
fixture.AssertFullSemver("1.2.0-alpha.1");
fixture.BranchTo("release/1.2.0");
fixture.AssertFullSemver("1.2.0-beta.1+0");
fixture.Checkout("develop");
fixture.MakeACommit("commit in develop - 2");
fixture.MakeACommit("commit in develop - 3");
fixture.MakeACommit("commit in develop - 4");
fixture.MakeACommit("commit in develop - 5");
fixture.AssertFullSemver("1.3.0-alpha.4");
fixture.Checkout("release/1.2.0");
fixture.MakeACommit("commit in release/1.2.0 - 1");
fixture.MakeACommit("commit in release/1.2.0 - 2");
fixture.MakeACommit("commit in release/1.2.0 - 3");
fixture.AssertFullSemver("1.2.0-beta.1+3");
fixture.Checkout("master");
fixture.MergeNoFF("release/1.2.0");
fixture.ApplyTag("1.2.0");
fixture.Checkout("develop");
fixture.MergeNoFF("release/1.2.0");
fixture.MakeACommit("commit in develop - 6");
fixture.AssertFullSemver("1.3.0-alpha.9");
fixture.SequenceDiagram.Destroy("release/1.2.0");
fixture.Repository.Branches.Remove("release/1.2.0");

var expectedFullSemVer = "1.3.0-alpha.9";
fixture.AssertFullSemver(config, expectedFullSemVer);
}
}

[Test]
public void CommitsSinceVersionSourceShouldNotGoDownUponMergingFeatureOnlyToDevelop()
{
var config = new Config
{
VersioningMode = VersioningMode.ContinuousDeployment
};

using (var fixture = new EmptyRepositoryFixture())
{
fixture.MakeACommit("commit in master - 1");
fixture.ApplyTag("1.1.0");
fixture.BranchTo("develop");
fixture.MakeACommit("commit in develop - 1");
fixture.AssertFullSemver("1.2.0-alpha.1");
fixture.BranchTo("release/1.2.0");
fixture.MakeACommit("commit in release - 1");
fixture.MakeACommit("commit in release - 2");
fixture.MakeACommit("commit in release - 3");
fixture.AssertFullSemver("1.2.0-beta.1+3");
fixture.ApplyTag("1.2.0");
fixture.Checkout("develop");
fixture.MakeACommit("commit in develop - 2");
fixture.AssertFullSemver("1.3.0-alpha.1");
fixture.MergeNoFF("release/1.2.0");
fixture.AssertFullSemver("1.3.0-alpha.5");
fixture.SequenceDiagram.Destroy("release/1.2.0");
fixture.Repository.Branches.Remove("release/1.2.0");

var expectedFullSemVer = "1.3.0-alpha.5";
fixture.AssertFullSemver(config, expectedFullSemVer);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ public void NoMergeBacksToDevelopInCaseThereAreChangesInReleaseBranch()
fixture.Repository.MakeACommit();
fixture.Repository.Branches.Remove("release/1.0.0");

fixture.AssertFullSemver("1.1.0-alpha.2");
fixture.AssertFullSemver("1.1.0-alpha.3");
}
}

Expand Down
51 changes: 48 additions & 3 deletions src/GitVersionCore/VersionCalculation/BaseVersionCalculator.cs
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
namespace GitVersion.VersionCalculation
namespace GitVersion.VersionCalculation
{
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
using GitVersion.VersionCalculation.BaseVersionCalculators;

public class BaseVersionCalculator : IBaseVersionCalculator
Expand Down Expand Up @@ -37,13 +39,15 @@ public BaseVersion GetBaseVersion(GitVersionContext context)

return true;
})
.Select(v => new
.Select(v => new Versions
{
IncrementedVersion = MaybeIncrement(context, v),
Version = v
})
.ToList();

FixTheBaseVersionSourceOfMergeMessageStrategyIfReleaseBranchWasMergedAndDeleted
(context, baseVersions);
var maxVersion = baseVersions.Aggregate((v1, v2) => v1.IncrementedVersion > v2.IncrementedVersion ? v1 : v2);
var matchingVersionsOnceIncremented = baseVersions
.Where(b => b.Version.BaseVersionSource != null && b.IncrementedVersion == maxVersion.IncrementedVersion)
Expand Down Expand Up @@ -92,5 +96,46 @@ public static SemanticVersion MaybeIncrement(GitVersionContext context, BaseVers

return version.SemanticVersion;
}

private void FixTheBaseVersionSourceOfMergeMessageStrategyIfReleaseBranchWasMergedAndDeleted(
GitVersionContext context, List<Versions> baseVersions)
{
if (!ReleaseBranchExistsInRepo(context))
{
foreach (var baseVersion in baseVersions)
{
if (baseVersion.Version.Source.Contains(
MergeMessageBaseVersionStrategy.MergeMessageStrategyPrefix)
&& baseVersion.Version.Source.Contains("Merge branch")
&& baseVersion.Version.Source.Contains("release"))
{
var parents = baseVersion.Version.BaseVersionSource.Parents.ToList();
baseVersion.Version = new BaseVersion(
context,
baseVersion.Version.Source,
baseVersion.Version.ShouldIncrement,
baseVersion.Version.SemanticVersion,
context.Repository.ObjectDatabase.FindMergeBase(parents[0], parents[1]),
baseVersion.Version.BranchNameOverride);
}
}
}
}

private bool ReleaseBranchExistsInRepo(GitVersionContext context)
{
var releaseBranchConfig = context.FullConfiguration.Branches
.Where(b => b.Value.IsReleaseBranch == true)
.ToList();
var releaseBranches = context.Repository.Branches
.Where(b => releaseBranchConfig.Any(c => Regex.IsMatch(b.FriendlyName, c.Value.Regex)));
return releaseBranches.Any();
}

private class Versions
{
public SemanticVersion IncrementedVersion { get; set; }
public BaseVersion Version { get; set; }
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -26,14 +26,16 @@ public override IEnumerable<BaseVersion> GetVersions(GitVersionContext context)
var shouldIncrement = !context.Configuration.PreventIncrementForMergedBranchVersion;
return new[]
{
new BaseVersion(context, $"Merge message '{c.Message.Trim()}'", shouldIncrement, mergeMessage.Version, c, null)
new BaseVersion(context, $"{MergeMessageStrategyPrefix} '{c.Message.Trim()}'", shouldIncrement, mergeMessage.Version, c, null)
};
}
return Enumerable.Empty<BaseVersion>();
}).ToList();
return baseVersions;
}

public static readonly string MergeMessageStrategyPrefix = "Merge message";

static bool TryParse(Commit mergeCommit, GitVersionContext context, out MergeMessage mergeMessage)
{
mergeMessage = Inner(mergeCommit, context);
Expand Down