Skip to content

Commit 5f173b9

Browse files
committed
No longer resets commit count when branch is forward merged
- Fixes #681 and #700
1 parent 1f7ec4b commit 5f173b9

File tree

3 files changed

+54
-11
lines changed

3 files changed

+54
-11
lines changed

src/GitVersionCore.Tests/Fixtures/RepositoryFixtureBase.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,7 @@ public void AssertFullSemver(string fullSemver, IRepository repository = null, s
130130
{
131131
var variables = GetVersion(repository, commitId);
132132
variables.FullSemVer.ShouldBe(fullSemver);
133+
(repository ?? Repository).DumpGraph();
133134
}
134135
catch (Exception)
135136
{

src/GitVersionCore.Tests/IntegrationTests/ReleaseBranchScenarios.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -262,6 +262,7 @@ public void WhenMergingReleaseBackToDevShouldNotResetBetaVersion()
262262
fixture.Repository.Checkout("develop");
263263

264264
fixture.Repository.MakeCommits(1);
265+
fixture.AssertFullSemver("1.1.0-unstable.1");
265266

266267
fixture.Repository.CreateBranch("release-2.0.0");
267268
fixture.Repository.Checkout("release-2.0.0");
@@ -283,6 +284,8 @@ public void WhenMergingReleaseBackToDevShouldNotResetBetaVersion()
283284
//but keep working on the release
284285
fixture.Repository.Checkout("release-2.0.0");
285286
fixture.AssertFullSemver("2.0.0-beta.2+2");
287+
fixture.MakeACommit();
288+
fixture.AssertFullSemver("2.0.0-beta.2+3");
286289
}
287290
}
288291

src/GitVersionCore/LibGitExtensions.cs

Lines changed: 50 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -65,24 +65,63 @@ public static Commit FindCommitBranchWasBranchedFrom([NotNull] this Branch branc
6565
return null;
6666
}
6767

68-
var otherBranches = repository.Branches.Except(excludedBranches).Where(b => IsSameBranch(branch, b)).ToList();
69-
var mergeBases = otherBranches.Select(b =>
68+
var otherBranches = repository.Branches
69+
.Except(excludedBranches)
70+
.Where(b => IsSameBranch(branch, b))
71+
.ToList();
72+
var mergeBases = otherBranches.Select(otherBranch =>
7073
{
71-
if (b.Tip == null)
74+
if (otherBranch.Tip == null)
7275
{
73-
Logger.WriteWarning(string.Format(missingTipFormat, b.Name));
76+
Logger.WriteWarning(string.Format(missingTipFormat, otherBranch.Name));
7477
return null;
7578
}
7679

77-
var otherCommit = b.Tip;
78-
if (b.Tip.Parents.Contains(branch.Tip))
80+
// Otherbranch tip is a forward merge
81+
var commitToFindCommonBase = otherBranch.Tip;
82+
if (otherBranch.Tip.Parents.Contains(branch.Tip))
7983
{
80-
otherCommit = b.Tip.Parents.First();
84+
commitToFindCommonBase = otherBranch.Tip.Parents.First();
8185
}
82-
var mergeBase = repository.Commits.FindMergeBase(otherCommit, branch.Tip);
83-
return mergeBase;
84-
}).Where(b => b != null).ToList();
85-
return mergeBases.OrderByDescending(b => b.Committer.When).FirstOrDefault();
86+
87+
var findMergeBase = repository.Commits.FindMergeBase(branch.Tip, commitToFindCommonBase);
88+
if (findMergeBase != null)
89+
{
90+
using (Logger.IndentLog(string.Format("Found merge base of {0} against {1}", findMergeBase.Sha, otherBranch.Name)))
91+
{
92+
// We do not want to include merge base commits which got forward merged into the other branch
93+
bool mergeBaseWasFowardMerge;
94+
do
95+
{
96+
// Now make sure that the merge base is not a forward merge
97+
mergeBaseWasFowardMerge = otherBranch.Commits
98+
.SkipWhile(c => c != commitToFindCommonBase)
99+
.TakeWhile(c => c != findMergeBase)
100+
.Any(c => c.Parents.Contains(findMergeBase));
101+
if (mergeBaseWasFowardMerge)
102+
{
103+
Logger.WriteInfo("Merge base was due to a forward merge, moving to next merge base");
104+
var second = commitToFindCommonBase.Parents.First();
105+
var mergeBase = repository.Commits.FindMergeBase(branch.Tip, second);
106+
if (mergeBase == findMergeBase) break;
107+
findMergeBase = mergeBase;
108+
}
109+
} while (mergeBaseWasFowardMerge);
110+
}
111+
}
112+
return new
113+
{
114+
mergeBaseCommit = findMergeBase,
115+
branch = otherBranch
116+
};
117+
}).Where(b => b != null).OrderByDescending(b => b.mergeBaseCommit.Committer.When).ToList();
118+
119+
var firstOrDefault = mergeBases.FirstOrDefault();
120+
if (firstOrDefault != null)
121+
{
122+
return firstOrDefault.mergeBaseCommit;
123+
}
124+
return null;
86125
}
87126
}
88127

0 commit comments

Comments
 (0)