Skip to content

Commit 2f23dd0

Browse files
committed
Add CommitLabelGenerator and additional documentation to tests.
1 parent 0e5a247 commit 2f23dd0

File tree

6 files changed

+287
-27
lines changed

6 files changed

+287
-27
lines changed

src/GitVersion.Core.Tests/Core/RepositoryStoreTests.cs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,33 +86,56 @@ public void FindsCorrectMergeBaseForForwardMergeMovesOn()
8686
//*91bf945 58 minutes ago(main)
8787
using var fixture = new EmptyRepositoryFixture();
8888
fixture.MakeACommit("initial");
89+
fixture.AssertFullSemver("0.0.1-1");
90+
fixture.AssertCommitsSinceVersionSource(1);
8991
fixture.BranchTo("develop");
92+
fixture.AssertFullSemver("0.1.0-alpha.1");
9093
var fixtureRepository = fixture.Repository.ToGitRepository();
9194
var expectedReleaseMergeBase = fixtureRepository.Head.Tip;
95+
fixture.SequenceDiagram.NoteOver(string.Join(System.Environment.NewLine, ("Expected Release Merge Base" + System.Environment.NewLine + System.Environment.NewLine +
96+
"This is the first common ancestor of both develop and release, from release's perspective.").SplitIntoLines(30)), "main", "develop");
9297

9398
// Create release from develop
9499
fixture.BranchTo("release-2.0.0");
100+
fixture.AssertFullSemver("2.0.0-beta.1+1");
95101

96102
// Make some commits on release
97103
fixture.MakeACommit("release 1");
104+
fixture.AssertCommitsSinceVersionSource(2);
105+
fixture.AssertFullSemver("2.0.0-beta.1+2");
98106
fixture.MakeACommit("release 2");
107+
fixture.AssertCommitsSinceVersionSource(3);
108+
fixture.AssertFullSemver("2.0.0-beta.1+3");
109+
fixture.SequenceDiagram.NoteOver(string.Join(System.Environment.NewLine, ("Expected Develop Merge Base" + System.Environment.NewLine + System.Environment.NewLine +
110+
"This is a common ancestor from develop's perspective because it is aware of the merge from release." + System.Environment.NewLine +
111+
"It is NOT an common ancestor from release's perspective because release is NOT aware of the merge to develop.").SplitIntoLines(30)), "release-2.0.0");
99112
var expectedDevelopMergeBase = fixtureRepository.Head.Tip;
100113

101114
// First forward merge release to develop
102115
fixture.Checkout("develop");
103116
fixture.MergeNoFF("release-2.0.0");
117+
fixture.AssertFullSemver("2.1.0-alpha.3");
118+
fixture.AssertCommitsSinceVersionSource(3);
104119

105120
// Make some new commit on release
106121
fixture.Checkout("release-2.0.0");
107122
fixture.MakeACommit("release 3 - after first merge");
123+
fixture.AssertFullSemver("2.0.0-beta.1+4");
124+
fixture.AssertCommitsSinceVersionSource(4);
108125

109126
// Make new commit on develop
110127
fixture.Checkout("develop");
128+
fixture.AssertFullSemver("2.1.0-alpha.3");
111129
// Checkout to release (no new commits)
112130
fixture.MakeACommit("develop after merge");
131+
fixture.AssertFullSemver("2.1.0-alpha.4");
132+
fixture.AssertCommitsSinceVersionSource(4);
113133

114134
// Checkout to release (no new commits)
115135
fixture.Checkout("release-2.0.0");
136+
fixture.SequenceDiagram.NoteOver("Checkout release-2.0.0 again", "release-2.0.0");
137+
fixture.AssertFullSemver("2.0.0-beta.1+4");
138+
fixture.AssertCommitsSinceVersionSource(4);
116139

117140
var develop = fixtureRepository.FindBranch("develop");
118141
var release = fixtureRepository.FindBranch("release-2.0.0");

src/GitVersion.Core.Tests/Extensions/GitRepositoryTestingExtensions.cs

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -165,17 +165,31 @@ public static void AssertCommitsSinceVersionSource(this RepositoryFixtureBase fi
165165
variables.CommitsSinceVersionSource.ShouldBe(commitsSinceVersionSourceExpected.ToString(), customMessage);
166166
if (commitId == null)
167167
{
168-
var message = new StringBuilder($"CommitsSinceVersionSource:{commitsSinceVersionSourceExpected}");
169-
if (variables.CommitsSinceVersionSourceList != null)
168+
var message = new StringBuilder();
169+
var versionSourceLabel = fixture.SequenceDiagram.GetOrAddSourceLabel(variables.VersionSourceSha);
170+
message.AppendLine($" Commit: {fixture.SequenceDiagram.GetOrAddLabel(variables.Sha)}");
171+
message.Append($" Version source: {versionSourceLabel}");
172+
if (commitsSinceVersionSourceExpected != 0 && variables.CommitsSinceVersionSourceList != null)
170173
{
171-
foreach (var sha in variables.CommitsSinceVersionSourceList)
174+
bool isFirst = true;
175+
foreach (var sha in variables.CommitsSinceVersionSourceList.Split(", ").Reverse())
172176
{
173-
message.Append(System.Environment.NewLine);
174-
message.Append($"- {sha}");
177+
if (isFirst)
178+
{
179+
message.Append(System.Environment.NewLine);
180+
message.Append($"Commits since version source: {variables.CommitsSinceVersionSource} - ");
181+
isFirst = false;
182+
}
183+
else
184+
{
185+
message.Append(", ");
186+
}
187+
188+
message.Append($"{fixture.SequenceDiagram.GetOrAddLabel(sha)}");
175189
}
176190
}
177191

178-
fixture.SequenceDiagram.NoteOver(message.ToString(), repository.Head.FriendlyName, color: "#D3D3D3");
192+
fixture.SequenceDiagram.NoteOver(message.ToString(), repository.Head.FriendlyName, color: "#A9B7C6");
179193
}
180194
}
181195

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
namespace GitVersion.Testing.Helpers;
2+
3+
[TestFixture]
4+
public class CommitLabelGeneratorTests
5+
{
6+
[TestCase("")]
7+
[TestCase(" ")]
8+
public void GetOrAdd_ShouldThrow_WhenKeyIsEmptyOrWhitespace(string key)
9+
{
10+
var sut = new CommitLabelGenerator();
11+
var ex = Should.Throw<ArgumentException>(() => sut.GetOrAdd(key));
12+
ex.Message.ShouldContain("SHA cannot be empty or whitespace");
13+
ex.ParamName.ShouldBe("key");
14+
}
15+
16+
[Test]
17+
public void GetOrAdd_ShouldReturnNA_WhenKeyIsNA()
18+
{
19+
var sut = new CommitLabelGenerator();
20+
sut.GetOrAdd("N/A").ShouldBe("N/A");
21+
}
22+
23+
[Test]
24+
public void GetOrAdd_ShouldAssignLabels_Sequentially()
25+
{
26+
var sut = new CommitLabelGenerator();
27+
28+
sut.GetOrAdd("sha1").ShouldBe("A");
29+
sut.GetOrAdd("sha2").ShouldBe("B");
30+
sut.GetOrAdd("sha3").ShouldBe("C");
31+
}
32+
33+
[Test]
34+
public void GetOrAdd_ShouldReturnSameLabel_OnRepeatedCalls()
35+
{
36+
var sut = new CommitLabelGenerator();
37+
sut.GetOrAdd("sha1").ShouldBe(sut.GetOrAdd("sha1"));
38+
}
39+
40+
[TestCase("")]
41+
[TestCase(" ")]
42+
public void GetOrAddRoot_ShouldThrow_WhenKeyIsEmptyOrWhitespace(string key)
43+
{
44+
var sut = new CommitLabelGenerator();
45+
var ex = Should.Throw<ArgumentException>(() => sut.GetOrAddRoot(key));
46+
ex.Message.ShouldContain("Version source SHA cannot be empty or whitespace");
47+
ex.ParamName.ShouldBe("versionSourceSha");
48+
}
49+
50+
[Test]
51+
public void GetOrAddRoot_ShouldReturnNA_WhenKeyIsNA()
52+
{
53+
var sut = new CommitLabelGenerator();
54+
sut.GetOrAddRoot("N/A").ShouldBe("N/A");
55+
}
56+
57+
[Test]
58+
public void GetOrAddRoot_ShouldAssignRootLabels_Sequentially()
59+
{
60+
var sut = new CommitLabelGenerator();
61+
62+
sut.GetOrAddRoot("rootsha1").ShouldBe("RootA");
63+
sut.GetOrAddRoot("rootsha2").ShouldBe("RootB");
64+
sut.GetOrAddRoot("rootsha3").ShouldBe("RootC");
65+
}
66+
67+
[Test]
68+
public void GetOrAddRoot_ShouldReturnSameLabel_OnRepeatedCalls()
69+
{
70+
var sut = new CommitLabelGenerator();
71+
sut.GetOrAddRoot("rootsha1").ShouldBe(sut.GetOrAddRoot("rootsha1"));
72+
}
73+
74+
[Test]
75+
public void GetOrAddRoot_And_GetOrAdd_ShouldMaintainSequenceLabels()
76+
{
77+
var sut = new CommitLabelGenerator();
78+
79+
sut.GetOrAddRoot("sha1").ShouldBe("RootA");
80+
sut.GetOrAdd("sha2").ShouldBe("B");
81+
sut.GetOrAddRoot("sha3").ShouldBe("RootC");
82+
}
83+
84+
[Test]
85+
public void GetOrAddRoot_And_GetOrAdd_ShouldAlign()
86+
{
87+
var sut = new CommitLabelGenerator();
88+
89+
sut.GetOrAddRoot("sha1").ShouldBe("RootA");
90+
sut.GetOrAdd("sha1").ShouldBe("RootA");
91+
sut.GetOrAdd("sha2").ShouldBe("B");
92+
sut.GetOrAddRoot("sha2").ShouldBe("B");
93+
}
94+
}

src/GitVersion.Core.Tests/IntegrationTests/GitflowScenarios.cs

Lines changed: 58 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,23 @@
11
using GitVersion.Configuration;
22
using GitVersion.Core.Tests.Helpers;
33
using GitVersion.Helpers;
4+
using GitVersion.Logging;
45
using LibGit2Sharp;
6+
using Microsoft.Extensions.DependencyInjection;
57

68
namespace GitVersion.Core.Tests.IntegrationTests;
79

810
[TestFixture]
911
public class GitflowScenarios : TestBase
1012
{
13+
private readonly ILog log;
14+
15+
public GitflowScenarios()
16+
{
17+
var sp = ConfigureServices();
18+
this.log = sp.GetRequiredService<ILog>();
19+
}
20+
1121
[Test]
1222
public void GitflowComplexExample()
1323
{
@@ -21,111 +31,133 @@ public void GitflowComplexExample()
2131

2232
var configuration = GitFlowConfigurationBuilder.New.Build();
2333

24-
using var fixture = new BaseGitFlowRepositoryFixture(initialMainAction, deleteOnDispose: false);
34+
using var fixture = new BaseGitFlowRepositoryFixture(InitialMainAction, deleteOnDispose: false);
2535
var fullSemver = "1.1.0-alpha.1";
2636
fixture.AssertFullSemver(fullSemver, configuration);
37+
fixture.AssertCommitsSinceVersionSource(1, configuration);
2738

2839
// Feature 1
2940
fixture.BranchTo(feature1Branch);
3041

3142
fixture.MakeACommit($"added feature 1 >> {fullSemver}");
3243
fullSemver = "1.1.0-f1.1+2";
3344
fixture.AssertFullSemver(fullSemver, configuration);
45+
fixture.AssertCommitsSinceVersionSource(2, configuration);
3446
fixture.Checkout(developBranch);
3547
fixture.MergeNoFF(feature1Branch);
3648
if (!keepBranches) fixture.Repository.Branches.Remove(fixture.Repository.Branches[feature1Branch]);
3749
fixture.AssertFullSemver("1.1.0-alpha.3", configuration);
50+
fixture.AssertCommitsSinceVersionSource(3, configuration);
3851

3952
// Release 1.1.0
4053
fixture.BranchTo(release1Branch);
4154
fixture.MakeACommit("release stabilization");
4255
fixture.AssertFullSemver("1.1.0-beta.1+4", configuration);
56+
fixture.AssertCommitsSinceVersionSource(4, configuration);
4357
fixture.Checkout(MainBranch);
4458
fixture.MergeNoFF(release1Branch);
4559
fixture.AssertFullSemver("1.1.0-5", configuration);
60+
fixture.AssertCommitsSinceVersionSource(5, configuration);
4661
fixture.ApplyTag("1.1.0");
4762
fixture.AssertFullSemver("1.1.0", configuration);
63+
fixture.AssertCommitsSinceVersionSource(0, configuration);
4864
fixture.Checkout(developBranch);
4965
fixture.MergeNoFF(release1Branch);
5066
fixture.Repository.Branches.Remove(fixture.Repository.Branches[release1Branch]);
5167
fixture.AssertFullSemver("1.2.0-alpha.1", configuration);
68+
fixture.AssertCommitsSinceVersionSource(1, configuration);
5269

5370
// Feature 2
5471
fixture.BranchTo(feature2Branch);
5572
fullSemver = "1.2.0-f2.1+2";
5673
fixture.MakeACommit($"added feature 2 >> {fullSemver}");
5774
fixture.AssertFullSemver(fullSemver, configuration);
75+
fixture.AssertCommitsSinceVersionSource(2, configuration);
5876
fixture.Checkout(developBranch);
5977
fixture.MergeNoFF(feature2Branch);
6078
if (!keepBranches) fixture.Repository.Branches.Remove(fixture.Repository.Branches[feature2Branch]);
6179
fixture.AssertFullSemver("1.2.0-alpha.3", configuration);
80+
fixture.AssertCommitsSinceVersionSource(3, configuration);
6281

6382
// Release 1.2.0
6483
fixture.BranchTo(release2Branch);
6584
fullSemver = "1.2.0-beta.1+8";
6685
fixture.MakeACommit($"release stabilization >> {fullSemver}");
6786
fixture.AssertFullSemver(fullSemver, configuration);
87+
fixture.AssertCommitsSinceVersionSource(8, configuration);
6888
fixture.Checkout(MainBranch);
6989
fixture.MergeNoFF(release2Branch);
7090
fixture.AssertFullSemver("1.2.0-5", configuration);
91+
fixture.AssertCommitsSinceVersionSource(5, configuration);
7192
fixture.ApplyTag("1.2.0");
7293
fixture.AssertFullSemver("1.2.0", configuration);
94+
fixture.AssertCommitsSinceVersionSource(0, configuration);
7395
fixture.Checkout(developBranch);
7496
fixture.MergeNoFF(release2Branch);
7597
if (!keepBranches)
7698
{
7799
fixture.Repository.Branches.Remove(fixture.Repository.Branches[release2Branch]);
78100
}
79101
fixture.AssertFullSemver("1.3.0-alpha.1", configuration);
102+
fixture.AssertCommitsSinceVersionSource(1, configuration);
80103

81104
// Hotfix
82105
fixture.Checkout(MainBranch);
83106
fixture.BranchTo(hotfixBranch);
84107
fullSemver = "1.2.1-beta.1+1";
85108
fixture.MakeACommit($"added hotfix >> {fullSemver}");
86109
fixture.AssertFullSemver(fullSemver, configuration);
110+
fixture.AssertCommitsSinceVersionSource(1, configuration);
87111
fixture.Checkout(MainBranch);
88112
fixture.MergeNoFF(hotfixBranch);
89113
fixture.AssertFullSemver("1.2.1-2", configuration);
114+
fixture.AssertCommitsSinceVersionSource(2, configuration);
90115
fixture.ApplyTag("1.2.1");
91116
fixture.AssertFullSemver("1.2.1", configuration);
92-
fixture.AssertCommitsSinceVersionSource(2, configuration);
117+
fixture.AssertCommitsSinceVersionSource(0, configuration);
93118
fixture.Checkout(developBranch);
94119
fixture.MergeNoFF(hotfixBranch);
95120
if (!keepBranches)
96121
{
97122
fixture.Repository.Branches.Remove(fixture.Repository.Branches[hotfixBranch]);
98123
}
99124
fixture.AssertFullSemver("1.3.0-alpha.2", configuration);
125+
fixture.AssertCommitsSinceVersionSource(2, configuration);
100126

101127
fixture.Checkout(feature2Branch);
102-
fixture.AssertFullSemver(
103-
"1.3.0-f2.1+0",
104-
configuration,
105-
customMessage:
106-
"Feature branches use inherited versioning (increment: inherit), " + System.Environment.NewLine +
107-
"and your config inherits from develop." + System.Environment.NewLine + System.Environment.NewLine +
128+
fixture.SequenceDiagram.NoteOver($"Checkout {feature2Branch}", feature2Branch);
129+
fixture.AssertFullSemver("1.3.0-f2.1+0", configuration);
130+
fixture.SequenceDiagram.NoteOver(
131+
string.Join(System.Environment.NewLine, ("Feature branches are configured to inherit version (increment: inherit)." + System.Environment.NewLine + System.Environment.NewLine +
108132
"GitVersion uses the merge base between the feature and develop to determine the version." + System.Environment.NewLine + System.Environment.NewLine +
109-
"As develop progresses (e.g., by releasing 1.2.0), rebuilding old feature branches can" + System.Environment.NewLine +
110-
"produce different versions.");
133+
"As develop progresses (e.g., by releasing 1.2.0 & 1.2.1), rebuilding old feature branches can produce different versions." + System.Environment.NewLine + System.Environment.NewLine +
134+
"Here we've checked out commit H again and now it's it's own VersionSource and produces 1.3.0-f2.1+0").SplitIntoLines(60)), feature2Branch);
135+
fixture.AssertCommitsSinceVersionSource(0, configuration);
111136

112137
fullSemver = "1.3.0-f2.1+1";
113138
fixture.MakeACommit(
114139
"feature 2 additional commit after original feature has been merged to develop " + System.Environment.NewLine +
115-
$"and release/1.2.0 has already happened >> {fullSemver}" +
116-
"Problem #1: 1.3.0-f2.1+0 is what I observe when I run dotnet-gitversion 6.3.0 but in the repo the assertion is 1.3.0-f2.1+1" +
117-
"After rebase 1.3.0-f2.1+3 is both what the test asserts and what I observe when I run dotnet-gitversion 6.3.0." +
118-
"Problem #2: I expected to get the same before and after the rebase." +
119-
"" +
120-
"Whether my expectations are correct or not could we at least build upon the documentation I have started to add " +
121-
"as an explanation of observed behaviour. I'm happy to translate an explanation in to test " +
122-
"documentation if you confirm it would be accepted on PR."
140+
$"and release/1.2.0 has already happened >> {fullSemver}"
123141
);
142+
fixture.AssertFullSemver(fullSemver, configuration);
143+
fixture.AssertCommitsSinceVersionSource(1, configuration);
144+
fixture.SequenceDiagram.NoteOver(
145+
string.Join(System.Environment.NewLine, ($"We committed again to {feature2Branch}." + System.Environment.NewLine + System.Environment.NewLine +
146+
"Why is the VersionSource no longer H but has instead jumped to N?" + System.Environment.NewLine + System.Environment.NewLine +
147+
$"I expected this to produce {fullSemver} and it does.").SplitIntoLines(60)), feature2Branch);
148+
149+
var gitRepository = fixture.Repository.ToGitRepository();
150+
var gitRepoMetadataProvider = new RepositoryStore(this.log, gitRepository);
151+
// H can't be it's own ancestor, so merge base is G
152+
fixture.SequenceDiagram.GetOrAddLabel(gitRepoMetadataProvider.FindMergeBase(gitRepository.Branches[feature2Branch], gitRepository.Branches[developBranch]).Sha).ShouldBe("G");
153+
fixture.SequenceDiagram.GetOrAddLabel(gitRepoMetadataProvider.FindMergeBase(gitRepository.Branches[feature2Branch], gitRepository.Branches[MainBranch]).Sha).ShouldBe("G");
154+
// Why is H it's own VersionSource though if after committing with H as the ancestor we get N as the VersionSource?
155+
156+
fixture.SequenceDiagram.NoteOver($"Now we rebase {feature2Branch} onto {developBranch}", feature2Branch);
124157

125158
var identity = new Identity(
126159
fixture.Repository.Head.Tip.Committer.Name,
127160
fixture.Repository.Head.Tip.Committer.Email);
128-
fixture.AssertFullSemver(fullSemver, configuration);
129161
var rebaseResult = fixture.Repository.Rebase.Start(
130162
fixture.Repository.Branches[feature2Branch],
131163
fixture.Repository.Branches[developBranch],
@@ -137,9 +169,14 @@ public void GitflowComplexExample()
137169
rebaseResult = fixture.Repository.Rebase.Continue(identity, new RebaseOptions());
138170
}
139171

140-
fixture.AssertFullSemver(fullSemver, configuration, customMessage: "I expected to get the same before and after the rebase.");
172+
fullSemver = "1.3.0-f2.1+3";
173+
fixture.AssertFullSemver(fullSemver, configuration);
174+
fixture.AssertCommitsSinceVersionSource(3, configuration);
175+
fixture.SequenceDiagram.NoteOver(
176+
string.Join(System.Environment.NewLine, $"Post rebase the VersionSource is again N - the last commit on {MainBranch}." + System.Environment.NewLine + System.Environment.NewLine +
177+
$"I expected this to produce 1.3.0-f2.1+1 and have a VersionSource of O with self as one commit since VersionSource. Instead VersionSource of N produces {fullSemver}, with a count traversal that includes both L and O!".SplitIntoLines(60)), feature2Branch);
141178

142-
void initialMainAction(IRepository r)
179+
void InitialMainAction(IRepository r)
143180
{
144181
if (configuration is GitVersionConfiguration concreteConfig)
145182
{

0 commit comments

Comments
 (0)