Skip to content

Commit 1ee64bf

Browse files
Fixes #389
1 parent 049624a commit 1ee64bf

File tree

6 files changed

+115
-6
lines changed

6 files changed

+115
-6
lines changed

GitVersionCore.Tests/IntegrationTests/ReleaseBranchScenarios.cs

+50
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,56 @@
55
[TestFixture]
66
public class ReleaseBranchScenarios
77
{
8+
[Test]
9+
public void NoMergeBacksToDevelopInCaseThereAreNoChangesInReleaseBranch()
10+
{
11+
using (var fixture = new EmptyRepositoryFixture(new Config()))
12+
{
13+
fixture.Repository.MakeACommit();
14+
fixture.Repository.CreateBranch("develop").Checkout();
15+
fixture.Repository.MakeCommits(3);
16+
var releaseBranch = fixture.Repository.CreateBranch("release/1.0.0");
17+
releaseBranch.Checkout();
18+
fixture.Repository.Checkout("master");
19+
fixture.Repository.MergeNoFF("release/1.0.0");
20+
fixture.Repository.ApplyTag("1.0.0");
21+
fixture.Repository.Checkout("develop");
22+
fixture.Repository.MakeACommit();
23+
24+
fixture.Repository.Branches.Remove(releaseBranch);
25+
26+
fixture.AssertFullSemver("1.1.0-unstable.1");
27+
}
28+
}
29+
30+
[Test]
31+
public void NoMergeBacksToDevelopInCaseThereAreChangesInReleaseBranch()
32+
{
33+
using (var fixture = new EmptyRepositoryFixture(new Config()))
34+
{
35+
fixture.Repository.MakeACommit();
36+
fixture.Repository.CreateBranch("develop").Checkout();
37+
fixture.Repository.MakeCommits(3);
38+
var releaseBranch = fixture.Repository.CreateBranch("release/1.0.0");
39+
releaseBranch.Checkout();
40+
fixture.Repository.MakeACommit();
41+
42+
// Merge to master
43+
fixture.Repository.Checkout("master");
44+
fixture.Repository.MergeNoFF("release/1.0.0");
45+
fixture.Repository.ApplyTag("1.0.0");
46+
47+
// Merge to develop
48+
fixture.Repository.Checkout("develop");
49+
fixture.Repository.MergeNoFF("release/1.0.0");
50+
51+
fixture.Repository.MakeACommit();
52+
fixture.Repository.Branches.Remove(releaseBranch);
53+
54+
fixture.AssertFullSemver("1.1.0-unstable.1");
55+
}
56+
}
57+
858
[Test]
959
public void CanTakeVersionFromReleaseBranch()
1060
{

GitVersionCore/GitVersionCore.csproj

+1
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@
9090
<Compile Include="VersionCalculation\BaseVersionCalculator.cs" />
9191
<Compile Include="VersionCalculation\BaseVersionCalculators\BaseVersion.cs" />
9292
<Compile Include="VersionCalculation\BaseVersionCalculators\ConfigNextVersionBaseVersionStrategy.cs" />
93+
<Compile Include="VersionCalculation\BaseVersionCalculators\GitFlowDevelopBranchBaseVersionStrategy.cs" />
9394
<Compile Include="VersionCalculation\BaseVersionCalculators\HighestTagBaseVersionStrategy.cs" />
9495
<Compile Include="VersionCalculation\BaseVersionCalculators\MergeMessageBaseVersionStrategy.cs" />
9596
<Compile Include="VersionCalculation\BaseVersionCalculators\VersionInBranchBaseVersionStrategy.cs" />

GitVersionCore/LibGitExtensions.cs

+24
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,30 @@ public static IEnumerable<Branch> GetBranchesContainingCommit(this Commit commit
6969
}
7070
}
7171

72+
public static bool IsDirectMergeFromCommit(this Tag tag, Commit commit)
73+
{
74+
var targetCommit = tag.Target as Commit;
75+
if (targetCommit != null)
76+
{
77+
var parents = targetCommit.Parents;
78+
if (parents != null)
79+
{
80+
foreach (var parent in parents)
81+
{
82+
if (parent != null)
83+
{
84+
if (string.Equals(parent.Id.Sha, commit.Id.Sha, StringComparison.OrdinalIgnoreCase))
85+
{
86+
return true;
87+
}
88+
}
89+
}
90+
}
91+
}
92+
93+
return false;
94+
}
95+
7296
public static GitObject PeeledTarget(this Tag tag)
7397
{
7498
var target = tag.Target;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
namespace GitVersion.VersionCalculation.BaseVersionCalculators
2+
{
3+
using LibGit2Sharp;
4+
5+
public class GitFlowDevelopBranchBaseVersionStrategy : HighestTagBaseVersionStrategy
6+
{
7+
protected override bool IsValidTag(string branchName, Tag tag, Commit commit)
8+
{
9+
if (!string.IsNullOrWhiteSpace(branchName))
10+
{
11+
if (branchName.ToLower().EndsWith("/develop"))
12+
{
13+
return tag.IsDirectMergeFromCommit(commit);
14+
}
15+
}
16+
17+
return base.IsValidTag(branchName, tag, commit);
18+
}
19+
}
20+
}

GitVersionCore/VersionCalculation/BaseVersionCalculators/HighestTagBaseVersionStrategy.cs

+15-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
namespace GitVersion.VersionCalculation.BaseVersionCalculators
22
{
3+
using System;
34
using System.Linq;
45
using LibGit2Sharp;
56

@@ -17,17 +18,29 @@ public override BaseVersion GetVersion(GitVersionContext context)
1718
return null;
1819
}
1920

21+
protected virtual bool IsValidTag(string branchName, Tag tag, Commit commit)
22+
{
23+
return tag.PeeledTarget() == commit;
24+
}
25+
2026
bool GetVersion(GitVersionContext context, out VersionTaggedCommit versionTaggedCommit)
2127
{
28+
string currentBranchName = null;
29+
var head = context.Repository.Head;
30+
if (head != null)
31+
{
32+
currentBranchName = head.CanonicalName;
33+
}
34+
2235
var olderThan = context.CurrentCommit.When();
2336
var allTags = context.Repository.Tags
24-
.Where(tag => ((Commit) tag.PeeledTarget()).When() <= olderThan)
37+
.Where(tag => ((Commit)tag.PeeledTarget()).When() <= olderThan)
2538
.ToList();
2639
var tagsOnBranch = context.CurrentBranch
2740
.Commits
2841
.SelectMany(commit =>
2942
{
30-
return allTags.Where(t => t.PeeledTarget() == commit);
43+
return allTags.Where(t => IsValidTag(currentBranchName, t, commit));
3144
})
3245
.Select(t =>
3346
{

GitVersionCore/VersionCalculation/NextVersionCalculator.cs

+5-4
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,11 @@ public NextVersionCalculator(IBaseVersionCalculator baseVersionCalculator = null
1717
baseVersionFinder = baseVersionCalculator ??
1818
new BaseVersionCalculator(
1919
new FallbackBaseVersionStrategy(),
20-
new ConfigNextVersionBaseVersionStrategy(),
21-
highestTagBaseVersionStrategy,
22-
new MergeMessageBaseVersionStrategy(),
23-
new VersionInBranchBaseVersionStrategy());
20+
new ConfigNextVersionBaseVersionStrategy(),
21+
highestTagBaseVersionStrategy,
22+
new GitFlowDevelopBranchBaseVersionStrategy(),
23+
new MergeMessageBaseVersionStrategy(),
24+
new VersionInBranchBaseVersionStrategy());
2425
}
2526

2627
public SemanticVersion FindVersion(GitVersionContext context)

0 commit comments

Comments
 (0)