Skip to content

Commit 015fb6e

Browse files
authored
Merge pull request #1179 from JakeGinnivan/feature/ImproveMergeBaseDiscovery
Improved merge base detection
2 parents c2b0cbd + a75c8d0 commit 015fb6e

File tree

4 files changed

+289
-80
lines changed

4 files changed

+289
-80
lines changed
Lines changed: 200 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,200 @@
1+
namespace GitVersionCore.Tests
2+
{
3+
using System;
4+
using GitTools;
5+
using GitTools.Testing;
6+
using GitVersion;
7+
using NUnit.Framework;
8+
using Shouldly;
9+
10+
[TestFixture]
11+
public class GitRepoMetadataProviderTests
12+
{
13+
[Test]
14+
public void FindsCorrectMergeBaseForForwardMerge()
15+
{
16+
//*9dfb8b4 49 minutes ago(develop)
17+
//*54f21b2 53 minutes ago
18+
// |\
19+
// | | *a219831 51 minutes ago(HEAD -> release-2.0.0)
20+
// | |/
21+
// | *4441531 54 minutes ago
22+
// | *89840df 56 minutes ago
23+
// |/
24+
//*91bf945 58 minutes ago(master)
25+
using (var fixture = new EmptyRepositoryFixture())
26+
{
27+
fixture.MakeACommit("initial");
28+
fixture.BranchTo("develop");
29+
var expectedReleaseMergeBase = fixture.Repository.Head.Tip;
30+
31+
// Create release from develop
32+
fixture.BranchTo("release-2.0.0");
33+
34+
// Make some commits on release
35+
fixture.MakeACommit("release 1");
36+
fixture.MakeACommit("release 2");
37+
var expectedDevelopMergeBase = fixture.Repository.Head.Tip;
38+
39+
// First forward merge release to develop
40+
fixture.Checkout("develop");
41+
fixture.MergeNoFF("release-2.0.0");
42+
43+
// Make some new commit on release
44+
fixture.Checkout("release-2.0.0");
45+
fixture.MakeACommit("release 3 - after first merge");
46+
47+
// Make new commit on develop
48+
fixture.Checkout("develop");
49+
50+
// Checkout to release (no new commits)
51+
fixture.Checkout("release-2.0.0");
52+
53+
var develop = fixture.Repository.FindBranch("develop");
54+
var release = fixture.Repository.FindBranch("release-2.0.0");
55+
var releaseBranchMergeBase = new GitRepoMetadataProvider(fixture.Repository)
56+
.FindMergeBase(release, develop);
57+
58+
var developMergeBase = new GitRepoMetadataProvider(fixture.Repository)
59+
.FindMergeBase(develop, release);
60+
61+
fixture.Repository.DumpGraph(Console.WriteLine);
62+
63+
releaseBranchMergeBase.ShouldBe(expectedReleaseMergeBase);
64+
developMergeBase.ShouldBe(expectedDevelopMergeBase);
65+
}
66+
}
67+
68+
[Test]
69+
public void FindsCorrectMergeBaseForForwardMergeMovesOn()
70+
{
71+
//*9dfb8b4 49 minutes ago(develop)
72+
//*54f21b2 53 minutes ago
73+
// |\
74+
// | | *a219831 51 minutes ago(HEAD -> release-2.0.0)
75+
// | |/
76+
// | *4441531 54 minutes ago
77+
// | *89840df 56 minutes ago
78+
// |/
79+
//*91bf945 58 minutes ago(master)
80+
using (var fixture = new EmptyRepositoryFixture())
81+
{
82+
fixture.MakeACommit("initial");
83+
fixture.BranchTo("develop");
84+
var expectedReleaseMergeBase = fixture.Repository.Head.Tip;
85+
86+
// Create release from develop
87+
fixture.BranchTo("release-2.0.0");
88+
89+
// Make some commits on release
90+
fixture.MakeACommit("release 1");
91+
fixture.MakeACommit("release 2");
92+
var expectedDevelopMergeBase = fixture.Repository.Head.Tip;
93+
94+
// First forward merge release to develop
95+
fixture.Checkout("develop");
96+
fixture.MergeNoFF("release-2.0.0");
97+
98+
// Make some new commit on release
99+
fixture.Checkout("release-2.0.0");
100+
fixture.MakeACommit("release 3 - after first merge");
101+
102+
// Make new commit on develop
103+
fixture.Checkout("develop");
104+
// Checkout to release (no new commits)
105+
fixture.MakeACommit("develop after merge");
106+
107+
// Checkout to release (no new commits)
108+
fixture.Checkout("release-2.0.0");
109+
110+
var develop = fixture.Repository.FindBranch("develop");
111+
var release = fixture.Repository.FindBranch("release-2.0.0");
112+
var releaseBranchMergeBase = new GitRepoMetadataProvider(fixture.Repository)
113+
.FindMergeBase(release, develop);
114+
115+
var developMergeBase = new GitRepoMetadataProvider(fixture.Repository)
116+
.FindMergeBase(develop, release);
117+
118+
fixture.Repository.DumpGraph(Console.WriteLine);
119+
120+
releaseBranchMergeBase.ShouldBe(expectedReleaseMergeBase);
121+
developMergeBase.ShouldBe(expectedDevelopMergeBase);
122+
}
123+
}
124+
125+
[Test]
126+
public void FindsCorrectMergeBaseForMultipleForwardMerges()
127+
{
128+
//*403b294 44 minutes ago(develop)
129+
//|\
130+
//| *306b243 45 minutes ago(HEAD -> release-2.0.0)
131+
//| *4cf5969 47 minutes ago
132+
//| *4814083 51 minutes ago
133+
//* | cddd3cc 49 minutes ago
134+
//* | 2b2b52a 53 minutes ago
135+
//|\ \
136+
//| |/
137+
//| *8113776 54 minutes ago
138+
//| *3c0235e 56 minutes ago
139+
//|/
140+
//*f6f1283 58 minutes ago(master)
141+
142+
using (var fixture = new EmptyRepositoryFixture())
143+
{
144+
fixture.MakeACommit("initial");
145+
fixture.BranchTo("develop");
146+
var expectedReleaseMergeBase = fixture.Repository.Head.Tip;
147+
148+
// Create release from develop
149+
fixture.BranchTo("release-2.0.0");
150+
151+
// Make some commits on release
152+
fixture.MakeACommit("release 1");
153+
fixture.MakeACommit("release 2");
154+
155+
// First forward merge release to develop
156+
fixture.Checkout("develop");
157+
fixture.MergeNoFF("release-2.0.0");
158+
159+
// Make some new commit on release
160+
fixture.Checkout("release-2.0.0");
161+
fixture.Repository.MakeACommit("release 3 - after first merge");
162+
163+
// Make new commit on develop
164+
fixture.Checkout("develop");
165+
// Checkout to release (no new commits)
166+
fixture.Checkout("release-2.0.0");
167+
fixture.Checkout("develop");
168+
fixture.Repository.MakeACommit("develop after merge");
169+
170+
// Checkout to release (no new commits)
171+
fixture.Checkout("release-2.0.0");
172+
173+
// Make some new commit on release
174+
fixture.Repository.MakeACommit("release 4");
175+
fixture.Repository.MakeACommit("release 5");
176+
var expectedDevelopMergeBase = fixture.Repository.Head.Tip;
177+
178+
// Second merge release to develop
179+
fixture.Checkout("develop");
180+
fixture.MergeNoFF("release-2.0.0");
181+
182+
// Checkout to release (no new commits)
183+
fixture.Checkout("release-2.0.0");
184+
185+
var develop = fixture.Repository.FindBranch("develop");
186+
var release = fixture.Repository.FindBranch("release-2.0.0");
187+
var releaseBranchMergeBase = new GitRepoMetadataProvider(fixture.Repository)
188+
.FindMergeBase(release, develop);
189+
190+
var developMergeBase = new GitRepoMetadataProvider(fixture.Repository)
191+
.FindMergeBase(develop, release);
192+
193+
fixture.Repository.DumpGraph(Console.WriteLine);
194+
195+
releaseBranchMergeBase.ShouldBe(expectedReleaseMergeBase);
196+
developMergeBase.ShouldBe(expectedDevelopMergeBase);
197+
}
198+
}
199+
}
200+
}

src/GitVersionCore.Tests/GitVersionCore.Tests.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@
9393
<Compile Include="BuildServers\TeamCityTests.cs" />
9494
<Compile Include="Configuration\IgnoreConfigTests.cs" />
9595
<Compile Include="DynamicRepositoryTests.cs" />
96+
<Compile Include="GitRepoMetadataProviderTests.cs" />
9697
<Compile Include="GitToolsTestingExtensions.cs" />
9798
<Compile Include="DocumentationTests.cs" />
9899
<Compile Include="ConfigProviderTests.cs" />

0 commit comments

Comments
 (0)