Skip to content

Commit

Permalink
Fixes #389
Browse files Browse the repository at this point in the history
  • Loading branch information
GeertvanHorrik committed Mar 14, 2015
1 parent 049624a commit 1ee64bf
Show file tree
Hide file tree
Showing 6 changed files with 115 additions and 6 deletions.
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

0 comments on commit 1ee64bf

Please sign in to comment.