Skip to content

Commit 3048a57

Browse files
committed
Topological commit sort causes issues when master is merged into a feature branch
1 parent 7b50d63 commit 3048a57

File tree

5 files changed

+35
-17
lines changed

5 files changed

+35
-17
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ public static void AssertFullSemver(this RepositoryFixtureBase fixture, string f
138138
/// <summary>
139139
/// Simulates running on build server
140140
/// </summary>
141-
public static void InitializeRepo(this RemoteRepositoryFixture fixture)
141+
public static void InitializeRepository(this RemoteRepositoryFixture fixture)
142142
{
143143
var gitVersionOptions = new GitVersionOptions
144144
{

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

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ public void DoNotBlowUpWhenMainAndDevelopPointAtSameCommit()
2626
Commands.Fetch(fixture.LocalRepositoryFixture.Repository, fixture.LocalRepositoryFixture.Repository.Network.Remotes.First().Name, [], new(), null);
2727
Commands.Checkout(fixture.LocalRepositoryFixture.Repository, fixture.Repository.Head.Tip);
2828
fixture.LocalRepositoryFixture.Repository.Branches.Remove(MainBranch);
29-
fixture.InitializeRepo();
29+
fixture.InitializeRepository();
3030
fixture.AssertFullSemver("1.0.1-1");
3131
}
3232

@@ -92,15 +92,15 @@ public void DoNotBlowUpWhenDevelopAndFeatureBranchPointAtSameCommit()
9292
Commands.Fetch(fixture.LocalRepositoryFixture.Repository, fixture.LocalRepositoryFixture.Repository.Network.Remotes.First().Name, [], new(), null);
9393
Commands.Checkout(fixture.LocalRepositoryFixture.Repository, fixture.Repository.Head.Tip);
9494
fixture.LocalRepositoryFixture.Repository.Branches.Remove(MainBranch);
95-
fixture.InitializeRepo();
95+
fixture.InitializeRepository();
9696
fixture.AssertFullSemver("1.1.0-alpha.1");
9797
}
9898

9999
[TestCase(true, 1)]
100100
[TestCase(false, 1)]
101101
[TestCase(true, 5)]
102102
[TestCase(false, 5)]
103-
public void HasDirtyFlagWhenUncommittedChangesAreInRepo(bool stageFile, int numberOfFiles)
103+
public void HasDirtyFlagWhenUncommittedChangesAreInRepository(bool stageFile, int numberOfFiles)
104104
{
105105
using var fixture = new EmptyRepositoryFixture();
106106
fixture.MakeACommit();
@@ -133,7 +133,7 @@ public void NoDirtyFlagInCleanRepository()
133133

134134
[TestCase(false, "1.1.0-alpha.2")]
135135
[TestCase(true, "1.2.0-alpha.1")]
136-
public void EnsureTrackMergeTargetStrategyWhichWillLookForTaggedMergecommits(bool trackMergeTarget, string expectedVersion)
136+
public void EnsureTrackMergeTargetStrategyWhichWillLookForTaggedMergeCommits(bool trackMergeTarget, string expectedVersion)
137137
{
138138
// * 9daa6ea 53 minutes ago (HEAD -> develop)
139139
// | * 85536f2 55 minutes ago (tag: 1.1.0, main)
@@ -1283,7 +1283,7 @@ public void EnsureVersionAfterMainIsMergedBackToDevelopIsCorrectForMainline(bool
12831283
}
12841284

12851285
[TestCase(false, "2.0.0-alpha.3")]
1286-
[TestCase(true, "2.0.0-alpha.3")]
1286+
[TestCase(true, "3.0.0-alpha.2")]
12871287
public void EnsureVersionAfterMainIsMergedBackToDevelopIsCorrectForGitFlow(bool applyTag, string semanticVersion)
12881288
{
12891289
var configuration = GitFlowConfigurationBuilder.New.Build();
@@ -1300,7 +1300,7 @@ public void EnsureVersionAfterMainIsMergedBackToDevelopIsCorrectForGitFlow(bool
13001300

13011301
fixture.Checkout("main");
13021302
fixture.MakeACommit("C");
1303-
if (applyTag) fixture.ApplyTag("1.0.1");
1303+
if (applyTag) fixture.ApplyTag("2.0.0");
13041304
fixture.Checkout("develop");
13051305
fixture.MergeNoFF("main");
13061306

@@ -1380,7 +1380,8 @@ public void AlternativeSemanticVersionsShouldBeConsidered()
13801380
}
13811381

13821382
[TestCase(null, "6.0.0-beta.6")]
1383-
[TestCase("beta", "6.0.0-beta.21")]
1383+
[TestCase("beta", "6.0.0-beta.6")]
1384+
[TestCase("gamma", "6.0.0-gamma.21")]
13841385
public void AlternativeSemanticVersionsShouldBeConsidered(string? labelOnMain, string version)
13851386
{
13861387
var configuration = GitFlowConfigurationBuilder.New
@@ -1391,14 +1392,16 @@ public void AlternativeSemanticVersionsShouldBeConsidered(string? labelOnMain, s
13911392
using var fixture = new EmptyRepositoryFixture();
13921393

13931394
fixture.MakeATaggedCommit("1.0.0");
1394-
fixture.MakeATaggedCommit("4.0.0-beta.14");
13951395
fixture.MakeACommit("A");
1396+
fixture.ApplyTag("4.0.0-beta.14");
1397+
fixture.ApplyTag("4.0.0-gamma.14");
1398+
fixture.MakeACommit("B");
13961399
fixture.MakeATaggedCommit("6.0.0-alpha.1");
13971400
fixture.MakeATaggedCommit("6.0.0-alpha.2");
13981401
fixture.MakeATaggedCommit("6.0.0-alpha.3");
1399-
fixture.MakeACommit("B");
1400-
fixture.MakeATaggedCommit("6.0.0-beta.5");
14011402
fixture.MakeACommit("C");
1403+
fixture.MakeATaggedCommit("6.0.0-beta.5");
1404+
fixture.MakeACommit("D");
14021405

14031406
fixture.AssertFullSemver(version, configuration);
14041407
}

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

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,20 +12,23 @@ public void RepositoryWithALotOfTags()
1212

1313
using var fixture = new EmptyRepositoryFixture();
1414

15-
const int maxCommits = 500;
16-
for (int i = 0; i < maxCommits; i++)
15+
Random random = new(4711);
16+
SemanticVersion semanticVersion = SemanticVersion.Empty;
17+
for (int i = 0; i < 500; i++)
1718
{
18-
fixture.MakeATaggedCommit($"1.0.{i}");
19+
VersionField versionField = (VersionField)random.Next(1, 4);
20+
semanticVersion = semanticVersion.Increment(versionField, string.Empty, forceIncrement: true);
21+
fixture.MakeATaggedCommit(semanticVersion.ToString("j"));
1922
}
2023

2124
fixture.BranchTo("feature");
2225
fixture.MakeACommit();
2326

2427
var sw = Stopwatch.StartNew();
2528

26-
fixture.AssertFullSemver($"1.0.{maxCommits}-feature.1+1", configuration);
29+
fixture.AssertFullSemver("170.3.3-feature.1+1", configuration);
2730
sw.Stop();
2831

29-
sw.ElapsedMilliseconds.ShouldBeLessThan(5000);
32+
sw.ElapsedMilliseconds.ShouldBeLessThan(1000);
3033
}
3134
}

src/GitVersion.Core/VersionCalculation/IncrementStrategyFinder.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,12 @@ private IReadOnlyCollection<ICommit> GetCommitHistory(string? tagPrefix, Semanti
106106
.ToHashSet()
107107
);
108108

109-
var intermediateCommits = GetIntermediateCommits(baseVersionSource, currentCommit, ignore).ToArray();
109+
var intermediateCommits = this.repositoryStore.GetCommitLog(
110+
baseVersionSource: baseVersionSource,
111+
currentCommit: currentCommit,
112+
ignore: ignore
113+
);
114+
//var intermediateCommits = GetIntermediateCommits(baseVersionSource, currentCommit, ignore).ToArray();
110115
var commitLog = intermediateCommits.ToDictionary(element => element.Id.Sha);
111116

112117
foreach (var intermediateCommit in intermediateCommits.Reverse())

src/GitVersion.Core/VersionCalculation/VersionSearchStrategies/TaggedCommitVersionStrategy.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ private IEnumerable<BaseVersion> GetBaseVersionsInternal(EffectiveBranchConfigur
4141

4242
var label = configuration.Value.GetBranchSpecificLabel(Context.CurrentBranch.Name, null);
4343

44+
SemanticVersion semanticVersionTreshold = new(0, 0, 0);
4445
List<SemanticVersionWithTag> alternativeSemanticVersionsWithTag = [];
4546
foreach (var semanticVersionWithTag in taggedSemanticVersions)
4647
{
@@ -50,6 +51,11 @@ private IEnumerable<BaseVersion> GetBaseVersionsInternal(EffectiveBranchConfigur
5051
continue;
5152
}
5253

54+
if (semanticVersionWithTag.Value.IsLessThan(semanticVersionTreshold, includePreRelease: false))
55+
{
56+
alternativeSemanticVersionsWithTag.Clear();
57+
continue;
58+
}
5359
var baseVersionSource = semanticVersionWithTag.Tag.Commit;
5460
var increment = incrementStrategyFinder.DetermineIncrementedField(
5561
currentCommit: Context.CurrentCommit,
@@ -58,6 +64,7 @@ private IEnumerable<BaseVersion> GetBaseVersionsInternal(EffectiveBranchConfigur
5864
configuration: configuration.Value,
5965
label: label
6066
);
67+
semanticVersionTreshold = semanticVersionWithTag.Value.Increment(increment, null, forceIncrement: true);
6168

6269
yield return new BaseVersion(
6370
$"Git tag '{semanticVersionWithTag.Tag.Name.Friendly}'", semanticVersionWithTag.Value, baseVersionSource)

0 commit comments

Comments
 (0)