Skip to content

Commit 86d5b43

Browse files
committed
Create TrunkBasedVersionStrategy implementation (see #3601 for more details)
1 parent 4157e11 commit 86d5b43

37 files changed

+1228
-0
lines changed
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
using GitVersion.Configuration;
2+
using GitVersion.Extensions;
3+
4+
namespace GitVersion.VersionCalculation.TrunkBased;
5+
6+
internal sealed class EnrichIncrement : ITrunkBasedContextPreEnricher
7+
{
8+
public void Enrich(TrunkBasedIteration iteration, TrunkBasedCommit commit, TrunkBasedContext context)
9+
{
10+
var incrementForcedByBranch = commit.GetIncrementForcedByBranch();
11+
var incrementForcedByCommit = commit.Increment;
12+
context.Increment = context.Increment.Consolidate(incrementForcedByBranch, incrementForcedByCommit);
13+
14+
if (commit.Predecessor is not null && commit.Predecessor.BranchName != commit.BranchName)
15+
context.Label = null;
16+
context.Label ??= commit.Configuration.GetBranchSpecificLabel(commit.BranchName, null);
17+
18+
if (commit.Configuration.IsMainline)
19+
context.BaseVersionSource = commit.Predecessor?.Value;
20+
context.ForceIncrement |= commit.Configuration.IsMainline || commit.IsPredecessorTheLastCommitOnTrunk;
21+
}
22+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
using GitVersion.Configuration;
2+
using GitVersion.Extensions;
3+
4+
namespace GitVersion.VersionCalculation.TrunkBased;
5+
6+
internal sealed class EnrichSemanticVersion : ITrunkBasedContextPreEnricher
7+
{
8+
public void Enrich(TrunkBasedIteration iteration, TrunkBasedCommit commit, TrunkBasedContext context)
9+
{
10+
var branchSpecificLabel = context.TargetLabel;
11+
branchSpecificLabel ??= iteration.Configuration.GetBranchSpecificLabel(commit.BranchName, null);
12+
branchSpecificLabel ??= commit.Configuration.GetBranchSpecificLabel(commit.BranchName, null);
13+
14+
var semanticVersions = commit.SemanticVersions.Where(
15+
element => element.IsMatchForBranchSpecificLabel(branchSpecificLabel)
16+
).ToList();
17+
context.AlternativeSemanticVersions.AddRange(commit.SemanticVersions.Except(semanticVersions));
18+
context.SemanticVersion = semanticVersions.Max();
19+
}
20+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
namespace GitVersion.VersionCalculation.TrunkBased;
2+
3+
internal interface ITrunkBasedContextPostEnricher
4+
{
5+
void Enrich(TrunkBasedIteration iteration, TrunkBasedCommit commit, TrunkBasedContext context);
6+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
namespace GitVersion.VersionCalculation.TrunkBased;
2+
3+
internal interface ITrunkBasedContextPreEnricher
4+
{
5+
void Enrich(TrunkBasedIteration iteration, TrunkBasedCommit commit, TrunkBasedContext context);
6+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
namespace GitVersion.VersionCalculation.TrunkBased;
2+
3+
internal interface ITrunkBasedIncrementer
4+
{
5+
bool MatchPrecondition(TrunkBasedIteration iteration, TrunkBasedCommit commit, TrunkBasedContext context);
6+
7+
IEnumerable<BaseVersionV2> GetIncrements(TrunkBasedIteration iteration, TrunkBasedCommit commit, TrunkBasedContext context);
8+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
using GitVersion.Configuration;
2+
3+
namespace GitVersion.VersionCalculation.TrunkBased.NonTrunk;
4+
5+
internal sealed class CommitOnNonTrunk : ITrunkBasedIncrementer
6+
{
7+
// B 57 minutes ago (HEAD -> feature/foo)
8+
// A 58 minutes ago <<--
9+
10+
// B 57 minutes ago (HEAD -> feature/foo) <<--
11+
// A 58 minutes ago
12+
13+
public bool MatchPrecondition(TrunkBasedIteration iteration, TrunkBasedCommit commit, TrunkBasedContext context)
14+
=> commit.ChildIteration is null && !commit.Configuration.IsMainline && context.SemanticVersion is null;
15+
16+
public IEnumerable<BaseVersionV2> GetIncrements(TrunkBasedIteration iteration, TrunkBasedCommit commit, TrunkBasedContext context)
17+
{
18+
if (commit.Predecessor is not null && commit.Predecessor.BranchName != commit.BranchName)
19+
context.Label = null;
20+
context.Label ??= commit.Configuration.GetBranchSpecificLabel(commit.BranchName, null);
21+
22+
if (commit.Successor is null)
23+
{
24+
yield return BaseVersionV2.ShouldIncrementTrue(
25+
source: GetType().Name,
26+
baseVersionSource: context.BaseVersionSource,
27+
increment: context.Increment,
28+
label: context.Label,
29+
forceIncrement: context.ForceIncrement,
30+
alternativeSemanticVersion: context.AlternativeSemanticVersions.Max()
31+
);
32+
33+
context.BaseVersionSource = commit.Value;
34+
}
35+
}
36+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
using GitVersion.Configuration;
2+
using GitVersion.Extensions;
3+
4+
namespace GitVersion.VersionCalculation.TrunkBased.NonTrunk;
5+
6+
internal abstract class CommitOnNonTrunkBranchedBase : ITrunkBasedIncrementer
7+
{
8+
public virtual bool MatchPrecondition(TrunkBasedIteration iteration, TrunkBasedCommit commit, TrunkBasedContext context)
9+
=> !commit.Configuration.IsMainline && commit.BranchName != iteration.BranchName && commit.Successor is null;
10+
11+
public virtual IEnumerable<BaseVersionV2> GetIncrements(TrunkBasedIteration iteration, TrunkBasedCommit commit, TrunkBasedContext context)
12+
{
13+
context.BaseVersionSource = commit.Value;
14+
15+
var incrementForcedByBranch = iteration.Configuration.Increment == IncrementStrategy.Inherit
16+
? commit.GetIncrementForcedByBranch() : iteration.Configuration.Increment.ToVersionField();
17+
context.Increment = context.Increment.Consolidate(incrementForcedByBranch);
18+
19+
context.Label = iteration.Configuration.GetBranchSpecificLabel(iteration.BranchName, null) ?? context.Label;
20+
context.ForceIncrement = true;
21+
22+
yield return BaseVersionV2.ShouldIncrementFalse(
23+
source: GetType().Name,
24+
baseVersionSource: null,
25+
label: context.Label,
26+
alternativeSemanticVersion: context.AlternativeSemanticVersions.Max()
27+
);
28+
}
29+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
namespace GitVersion.VersionCalculation.TrunkBased.NonTrunk;
2+
3+
internal sealed class CommitOnNonTrunkBranchedToNonTrunk : CommitOnNonTrunkBranchedBase
4+
{
5+
// B 51 minutes ago (HEAD -> feature/foo, main) <<--
6+
// A 59 minutes ago
7+
8+
// B 58 minutes ago (main)
9+
// A 59 minutes ago (HEAD -> feature/foo) <<--
10+
11+
// * 54 minutes ago (main)
12+
// | B 56 minutes ago (HEAD -> feature/foo)
13+
// |/
14+
// A 58 minutes ago <<--
15+
16+
public override bool MatchPrecondition(TrunkBasedIteration iteration, TrunkBasedCommit commit, TrunkBasedContext context)
17+
=> base.MatchPrecondition(iteration, commit, context) && !iteration.Configuration.IsMainline;
18+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
namespace GitVersion.VersionCalculation.TrunkBased.NonTrunk;
2+
3+
internal sealed class CommitOnNonTrunkBranchedToTrunk : CommitOnNonTrunkBranchedBase
4+
{
5+
// B 51 minutes ago (HEAD -> release/1.0.x, main) <<--
6+
// A 59 minutes ago
7+
8+
// B 58 minutes ago (main)
9+
// A 59 minutes ago (HEAD -> release/1.0.x) <<--
10+
11+
// * 54 minutes ago (main)
12+
// | B 56 minutes ago (HEAD -> release/1.0.x)
13+
// |/
14+
// A 58 minutes ago <<--
15+
16+
public override bool MatchPrecondition(TrunkBasedIteration iteration, TrunkBasedCommit commit, TrunkBasedContext context)
17+
=> base.MatchPrecondition(iteration, commit, context) && iteration.Configuration.IsMainline;
18+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
namespace GitVersion.VersionCalculation.TrunkBased.NonTrunk;
2+
3+
internal sealed class CommitOnNonTrunkWithPreReleaseTag : CommitOnNonTrunkWithPreReleaseTagBase
4+
{
5+
// B 57 minutes ago (HEAD -> feature/foo)
6+
// A 58 minutes ago (tag 1.2.3-1) <<--
7+
8+
public override bool MatchPrecondition(TrunkBasedIteration iteration, TrunkBasedCommit commit, TrunkBasedContext context)
9+
=> base.MatchPrecondition(iteration, commit, context) && commit.Successor is not null;
10+
}

0 commit comments

Comments
 (0)