Skip to content
Closed
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
50 changes: 50 additions & 0 deletions GitVersionCore.Tests/IntegrationTests/ReleaseBranchScenarios.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,56 @@
[TestFixture]
public class ReleaseBranchScenarios
{
[Test]
public void NoMergeBacksToDevelopInCaseThereAreNoChangesInReleaseBranch()
{
using (var fixture = new EmptyRepositoryFixture(new Config()))
{
fixture.Repository.MakeACommit();
fixture.Repository.CreateBranch("develop").Checkout();
fixture.Repository.MakeCommits(3);
var releaseBranch = fixture.Repository.CreateBranch("release/1.0.0");
releaseBranch.Checkout();
fixture.Repository.Checkout("master");
fixture.Repository.MergeNoFF("release/1.0.0");
fixture.Repository.ApplyTag("1.0.0");
fixture.Repository.Checkout("develop");
fixture.Repository.MakeACommit();

fixture.Repository.Branches.Remove(releaseBranch);

fixture.AssertFullSemver("1.1.0-unstable.1");
}
}

[Test]
public void NoMergeBacksToDevelopInCaseThereAreChangesInReleaseBranch()
{
using (var fixture = new EmptyRepositoryFixture(new Config()))
{
fixture.Repository.MakeACommit();
fixture.Repository.CreateBranch("develop").Checkout();
fixture.Repository.MakeCommits(3);
var releaseBranch = fixture.Repository.CreateBranch("release/1.0.0");
releaseBranch.Checkout();
fixture.Repository.MakeACommit();

// Merge to master
fixture.Repository.Checkout("master");
fixture.Repository.MergeNoFF("release/1.0.0");
fixture.Repository.ApplyTag("1.0.0");

// Merge to develop
fixture.Repository.Checkout("develop");
fixture.Repository.MergeNoFF("release/1.0.0");

fixture.Repository.MakeACommit();
fixture.Repository.Branches.Remove(releaseBranch);

fixture.AssertFullSemver("1.1.0-unstable.1");
}
}

[Test]
public void CanTakeVersionFromReleaseBranch()
{
Expand Down
1 change: 1 addition & 0 deletions GitVersionCore/GitVersionCore.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,7 @@
<Compile Include="VersionCalculation\BaseVersionCalculator.cs" />
<Compile Include="VersionCalculation\BaseVersionCalculators\BaseVersion.cs" />
<Compile Include="VersionCalculation\BaseVersionCalculators\ConfigNextVersionBaseVersionStrategy.cs" />
<Compile Include="VersionCalculation\BaseVersionCalculators\GitFlowDevelopBranchBaseVersionStrategy.cs" />
<Compile Include="VersionCalculation\BaseVersionCalculators\HighestTagBaseVersionStrategy.cs" />
<Compile Include="VersionCalculation\BaseVersionCalculators\MergeMessageBaseVersionStrategy.cs" />
<Compile Include="VersionCalculation\BaseVersionCalculators\VersionInBranchBaseVersionStrategy.cs" />
Expand Down
24 changes: 24 additions & 0 deletions GitVersionCore/LibGitExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,30 @@ public static IEnumerable<Branch> GetBranchesContainingCommit(this Commit commit
}
}

public static bool IsDirectMergeFromCommit(this Tag tag, Commit commit)
{
var targetCommit = tag.Target as Commit;
if (targetCommit != null)
{
var parents = targetCommit.Parents;
if (parents != null)
{
foreach (var parent in parents)
{
if (parent != null)
{
if (string.Equals(parent.Id.Sha, commit.Id.Sha, StringComparison.OrdinalIgnoreCase))
{
return true;
}
}
}
}
}

return false;
}

public static GitObject PeeledTarget(this Tag tag)
{
var target = tag.Target;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
namespace GitVersion.VersionCalculation.BaseVersionCalculators
{
using LibGit2Sharp;

public class GitFlowDevelopBranchBaseVersionStrategy : HighestTagBaseVersionStrategy
{
protected override bool IsValidTag(string branchName, Tag tag, Commit commit)
{
if (!string.IsNullOrWhiteSpace(branchName))
{
if (branchName.ToLower().EndsWith("/develop"))
{
return tag.IsDirectMergeFromCommit(commit);
}
}

return base.IsValidTag(branchName, tag, commit);
}
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
namespace GitVersion.VersionCalculation.BaseVersionCalculators
{
using System;
using System.Linq;
using LibGit2Sharp;

Expand All @@ -17,17 +18,29 @@ public override BaseVersion GetVersion(GitVersionContext context)
return null;
}

protected virtual bool IsValidTag(string branchName, Tag tag, Commit commit)
{
return tag.PeeledTarget() == commit;
}

bool GetVersion(GitVersionContext context, out VersionTaggedCommit versionTaggedCommit)
{
string currentBranchName = null;
var head = context.Repository.Head;
if (head != null)
{
currentBranchName = head.CanonicalName;
}

var olderThan = context.CurrentCommit.When();
var allTags = context.Repository.Tags
.Where(tag => ((Commit) tag.PeeledTarget()).When() <= olderThan)
.Where(tag => ((Commit)tag.PeeledTarget()).When() <= olderThan)
.ToList();
var tagsOnBranch = context.CurrentBranch
.Commits
.SelectMany(commit =>
{
return allTags.Where(t => t.PeeledTarget() == commit);
return allTags.Where(t => IsValidTag(currentBranchName, t, commit));
})
.Select(t =>
{
Expand Down
9 changes: 5 additions & 4 deletions GitVersionCore/VersionCalculation/NextVersionCalculator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,11 @@ public NextVersionCalculator(IBaseVersionCalculator baseVersionCalculator = null
baseVersionFinder = baseVersionCalculator ??
new BaseVersionCalculator(
new FallbackBaseVersionStrategy(),
new ConfigNextVersionBaseVersionStrategy(),
highestTagBaseVersionStrategy,
new MergeMessageBaseVersionStrategy(),
new VersionInBranchBaseVersionStrategy());
new ConfigNextVersionBaseVersionStrategy(),
highestTagBaseVersionStrategy,
new GitFlowDevelopBranchBaseVersionStrategy(),
new MergeMessageBaseVersionStrategy(),
new VersionInBranchBaseVersionStrategy());
}

public SemanticVersion FindVersion(GitVersionContext context)
Expand Down