Skip to content

Commit e945107

Browse files
committed
Support of TrackMergeTarget for the TrunkBased branching strategy.
1 parent 10f9c60 commit e945107

16 files changed

+476
-204
lines changed

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ public void RepositoryWithALotOfTags()
2424
var sw = Stopwatch.StartNew();
2525

2626
fixture.AssertFullSemver($"1.0.{maxCommits}-feature.1+1", configuration);
27+
sw.Stop();
28+
2729
sw.ElapsedMilliseconds.ShouldBeLessThan(5000);
2830
}
2931
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ public void WhenSupportIsBranchedFromMainWithSpecificTag()
7979
using var fixture = new EmptyRepositoryFixture();
8080

8181
fixture.MakeACommit();
82-
fixture.AssertFullSemver("0.0.1-1");
82+
fixture.AssertFullSemver("0.0.1-1", configuration);
8383

8484
fixture.ApplyTag("1.4.0-rc");
8585
fixture.MakeACommit();
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
using GitVersion.Configuration;
2+
using GitVersion.Core.Tests;
3+
using GitVersion.Core.Tests.IntegrationTests;
4+
using GitVersion.VersionCalculation;
5+
6+
namespace GitVersion.Core.TrunkBased;
7+
8+
internal partial class TrunkBasedScenariosWithAGitFlow
9+
{
10+
[Parallelizable(ParallelScope.All)]
11+
public class GivenADevelopBranchWithOneCommitMergedToMainWithTrackMergeTargetWhenMergedCommitTaggedAsStable
12+
{
13+
private EmptyRepositoryFixture? fixture;
14+
15+
private static GitFlowConfigurationBuilder TrunkBasedBuilder => GitFlowConfigurationBuilder.New.WithLabel(null)
16+
.WithVersioningMode(VersioningMode.TrunkBased)
17+
.WithBranch("main", _ => _.WithVersioningMode(VersioningMode.ManualDeployment))
18+
.WithBranch("develop", _ => _.WithVersioningMode(VersioningMode.ManualDeployment).WithTrackMergeTarget(true));
19+
20+
[OneTimeSetUp]
21+
public void OneTimeSetUp()
22+
{
23+
// * 55 minutes ago (tag: 1.0.0, main)
24+
// |\
25+
// | * 56 minutes ago (HEAD -> develop)
26+
// |/
27+
// * 58 minutes ago
28+
29+
fixture = new EmptyRepositoryFixture("main");
30+
31+
fixture.MakeACommit("A");
32+
fixture.BranchTo("develop");
33+
fixture.MakeACommit("B");
34+
fixture.MergeTo("main");
35+
fixture.ApplyTag("1.0.0");
36+
fixture.Checkout("develop");
37+
}
38+
39+
[OneTimeTearDown]
40+
public void OneTimeTearDown() => fixture?.Dispose();
41+
42+
[TestCase(IncrementStrategy.None, IncrementStrategy.None, ExpectedResult = "1.0.0-alpha.1+0")]
43+
[TestCase(IncrementStrategy.None, IncrementStrategy.Patch, ExpectedResult = "1.0.1-alpha.1+0")]
44+
[TestCase(IncrementStrategy.None, IncrementStrategy.Minor, ExpectedResult = "1.1.0-alpha.1+0")]
45+
[TestCase(IncrementStrategy.None, IncrementStrategy.Major, ExpectedResult = "2.0.0-alpha.1+0")]
46+
47+
[TestCase(IncrementStrategy.Patch, IncrementStrategy.None, ExpectedResult = "1.0.0-alpha.1+0")]
48+
[TestCase(IncrementStrategy.Patch, IncrementStrategy.Patch, ExpectedResult = "1.0.1-alpha.1+0")]
49+
[TestCase(IncrementStrategy.Patch, IncrementStrategy.Minor, ExpectedResult = "1.1.0-alpha.1+0")]
50+
[TestCase(IncrementStrategy.Patch, IncrementStrategy.Major, ExpectedResult = "2.0.0-alpha.1+0")]
51+
52+
[TestCase(IncrementStrategy.Minor, IncrementStrategy.None, ExpectedResult = "1.0.0-alpha.1+0")]
53+
[TestCase(IncrementStrategy.Minor, IncrementStrategy.Patch, ExpectedResult = "1.0.1-alpha.1+0")]
54+
[TestCase(IncrementStrategy.Minor, IncrementStrategy.Minor, ExpectedResult = "1.1.0-alpha.1+0")]
55+
[TestCase(IncrementStrategy.Minor, IncrementStrategy.Major, ExpectedResult = "2.0.0-alpha.1+0")]
56+
57+
[TestCase(IncrementStrategy.Major, IncrementStrategy.None, ExpectedResult = "1.0.0-alpha.1+0")]
58+
[TestCase(IncrementStrategy.Major, IncrementStrategy.Patch, ExpectedResult = "1.0.1-alpha.1+0")]
59+
[TestCase(IncrementStrategy.Major, IncrementStrategy.Minor, ExpectedResult = "1.1.0-alpha.1+0")]
60+
[TestCase(IncrementStrategy.Major, IncrementStrategy.Major, ExpectedResult = "2.0.0-alpha.1+0")]
61+
public string GetVersion(IncrementStrategy incrementOnMain, IncrementStrategy increment)
62+
{
63+
IGitVersionConfiguration trunkBased = TrunkBasedBuilder
64+
.WithBranch("main", _ => _.WithIncrement(incrementOnMain).WithLabel(null))
65+
.WithBranch("develop", _ => _.WithIncrement(increment))
66+
.Build();
67+
68+
return fixture!.GetVersion(trunkBased).FullSemVer;
69+
}
70+
}
71+
}

src/GitVersion.Core/Core/Abstractions/IRepositoryStore.cs

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -42,18 +42,11 @@ public interface IRepositoryStore
4242

4343
SemanticVersion? GetCurrentCommitTaggedVersion(ICommit? commit, string? tagPrefix, SemanticVersionFormat format, bool handleDetachedBranch);
4444

45-
IEnumerable<SemanticVersion> GetVersionTagsOnBranch(IBranch branch, string? tagPrefix, SemanticVersionFormat format);
46-
4745
IReadOnlyList<SemanticVersionWithTag> GetTaggedSemanticVersions(string? tagPrefix, SemanticVersionFormat format);
4846

4947
IReadOnlyList<SemanticVersionWithTag> GetTaggedSemanticVersionsOnBranch(IBranch branch, string? tagPrefix, SemanticVersionFormat format);
5048

5149
bool IsCommitOnBranch(ICommit? baseVersionSource, IBranch branch, ICommit firstMatchingCommit);
5250

5351
int GetNumberOfUncommittedChanges();
54-
55-
IEnumerable<SemanticVersionWithTag> GetSemanticVersions(
56-
IGitVersionConfiguration configuration, IBranch currentBranch, ICommit currentCommit,
57-
bool trackMergeTarget, bool tracksReleaseBranches
58-
);
5952
}

src/GitVersion.Core/Core/RepositoryStore.cs

Lines changed: 0 additions & 112 deletions
Original file line numberDiff line numberDiff line change
@@ -257,29 +257,6 @@ public IEnumerable<BranchCommit> FindCommitBranchesWasBranchedFrom(IBranch branc
257257
.SelectMany(tag => GetCurrentCommitSemanticVersions(commit, tagPrefix, tag, format, handleDetachedBranch))
258258
.Max();
259259

260-
public IEnumerable<SemanticVersion> GetVersionTagsOnBranch(IBranch branch, string? tagPrefix, SemanticVersionFormat format)
261-
{
262-
branch = branch.NotNull();
263-
264-
if (this.taggedSemanticVersionsOnBranchCache.TryGetValue(branch, out var onBranch))
265-
{
266-
this.log.Debug($"Cache hit for version tags on branch '{branch.Name.Canonical}");
267-
return onBranch.Select(element => element.Value);
268-
}
269-
270-
using (this.log.IndentLog($"Getting version tags from branch '{branch.Name.Canonical}'."))
271-
{
272-
var semanticVersions = GetTaggedSemanticVersions(tagPrefix, format);
273-
var tagsBySha = semanticVersions.Where(t => t.Tag.TargetSha != null).ToLookup(t => t.Tag.TargetSha, t => t);
274-
275-
var versionTags = (branch.Commits.SelectMany(c => tagsBySha[c.Sha].Select(t => t))
276-
?? Enumerable.Empty<SemanticVersionWithTag>()).ToList();
277-
278-
this.taggedSemanticVersionsOnBranchCache.Add(branch, versionTags);
279-
return versionTags.Select(element => element.Value);
280-
}
281-
}
282-
283260
public IReadOnlyList<SemanticVersionWithTag> GetTaggedSemanticVersions(string? tagPrefix, SemanticVersionFormat format)
284261
{
285262
if (this.taggedSemanticVersionsCache != null)
@@ -359,93 +336,4 @@ private IEnumerable<SemanticVersion> GetCurrentCommitSemanticVersions(ICommit? c
359336
? new[] { version }
360337
: Array.Empty<SemanticVersion>();
361338
}
362-
363-
public IEnumerable<SemanticVersionWithTag> GetSemanticVersions(IGitVersionConfiguration configuration,
364-
IBranch currentBranch, ICommit currentCommit, bool trackMergeTarget, bool tracksReleaseBranches)
365-
{
366-
var olderThan = currentCommit?.When;
367-
368-
IEnumerable<SemanticVersionWithTag> GetSemanticVersions()
369-
{
370-
var semanticVersions = GetTaggedSemanticVersions(
371-
configuration.TagPrefix, configuration.SemanticVersionFormat
372-
).ToList();
373-
var semanticVersionsByCommitLazy = new Lazy<ILookup<string, SemanticVersionWithTag>>(
374-
() => semanticVersions.ToLookup(element => element.Tag.Commit.Id.Sha)
375-
);
376-
377-
foreach (var semanticVersion in GetSemanticVersionsCommon(currentBranch, semanticVersionsByCommitLazy))
378-
{
379-
if (semanticVersion.Tag.Commit.When <= olderThan) yield return semanticVersion;
380-
}
381-
382-
if (trackMergeTarget)
383-
{
384-
foreach (var semanticVersion in GetSemanticVersionsTrackMergeTarget(currentBranch, semanticVersionsByCommitLazy))
385-
{
386-
if (semanticVersion.Tag.Commit.When <= olderThan) yield return semanticVersion;
387-
}
388-
}
389-
390-
if (tracksReleaseBranches)
391-
{
392-
foreach (var semanticVersion in GetSemanticVersionsTracksReleaseBranches(configuration, semanticVersionsByCommitLazy))
393-
{
394-
yield return semanticVersion;
395-
}
396-
}
397-
}
398-
399-
var alreadyReturnedValues = new HashSet<SemanticVersionWithTag>();
400-
401-
foreach (var semanticVersion in GetSemanticVersions())
402-
{
403-
if (alreadyReturnedValues.Add(semanticVersion))
404-
yield return semanticVersion;
405-
}
406-
}
407-
408-
private static IEnumerable<SemanticVersionWithTag> GetSemanticVersionsCommon(
409-
IBranch currentBranch, Lazy<ILookup<string, SemanticVersionWithTag>> semanticVersionsByCommitLazy)
410-
{
411-
foreach (var commit in currentBranch.Commits)
412-
{
413-
foreach (var semanticVersion in semanticVersionsByCommitLazy.Value[commit.Id.Sha])
414-
{
415-
yield return semanticVersion;
416-
}
417-
}
418-
}
419-
420-
private static IEnumerable<SemanticVersionWithTag> GetSemanticVersionsTrackMergeTarget(
421-
IBranch currentBranch, Lazy<ILookup<string, SemanticVersionWithTag>> semanticVersionsByCommitLazy)
422-
{
423-
var commitsOnCurrentBranch = currentBranch.Commits.ToArray();
424-
if (!commitsOnCurrentBranch.Any()) yield break;
425-
426-
var shaHashSet = new HashSet<string>(commitsOnCurrentBranch.Select(element => element.Id.Sha));
427-
foreach (var semanticVersion in semanticVersionsByCommitLazy.Value.SelectMany(element => element))
428-
{
429-
var parentCommits = semanticVersion.Tag.Commit.Parents ?? Array.Empty<ICommit>();
430-
if (parentCommits.Any(element => shaHashSet.Contains(element.Id.Sha)))
431-
{
432-
yield return semanticVersion;
433-
}
434-
}
435-
}
436-
437-
private IEnumerable<SemanticVersionWithTag> GetSemanticVersionsTracksReleaseBranches(
438-
IGitVersionConfiguration configuration, Lazy<ILookup<string, SemanticVersionWithTag>> semanticVersionsByCommitLazy)
439-
{
440-
foreach (var mainBranch in FindMainlineBranches(configuration))
441-
{
442-
foreach (var commit in mainBranch.Commits?.ToArray() ?? Array.Empty<ICommit>())
443-
{
444-
foreach (var semanticVersion in semanticVersionsByCommitLazy.Value[commit.Id.Sha])
445-
{
446-
yield return semanticVersion;
447-
}
448-
}
449-
}
450-
}
451339
}

0 commit comments

Comments
 (0)