Skip to content

Commit a0c170b

Browse files
committed
Fix GitVersion calculates the wrong version after main is merged back to develop.
1 parent 45a307e commit a0c170b

File tree

2 files changed

+67
-7
lines changed

2 files changed

+67
-7
lines changed

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

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1218,4 +1218,57 @@ public void EnsurePreventIncrementWhenCurrentCommitTaggedOnReleaseBranchAndIncre
12181218

12191219
fixture.AssertFullSemver(semVersion, configuration);
12201220
}
1221+
1222+
[TestCase(false, "2.0.0-alpha.3")]
1223+
[TestCase(true, "2.0.0-alpha.2")]
1224+
public void EnsureVersionAfterMainIsMergedBackToDevelopIsCorrectForTrunkBased(bool applyTag, string semanticVersion)
1225+
{
1226+
var configuration = GitFlowConfigurationBuilder.New
1227+
.WithVersionStrategy(VersionStrategies.TrunkBased)
1228+
.Build();
1229+
1230+
using var fixture = new EmptyRepositoryFixture("main");
1231+
1232+
fixture.MakeACommit("A");
1233+
fixture.ApplyTag("1.0.0");
1234+
fixture.BranchTo("develop");
1235+
fixture.MakeACommit("B +semver: major");
1236+
1237+
// ✅ succeeds as expected
1238+
fixture.AssertFullSemver("2.0.0-alpha.1", configuration);
1239+
1240+
fixture.Checkout("main");
1241+
fixture.MakeACommit("C");
1242+
if (applyTag) fixture.ApplyTag("1.0.1");
1243+
fixture.Checkout("develop");
1244+
fixture.MergeNoFF("main");
1245+
1246+
// ✅ succeeds as expected
1247+
fixture.AssertFullSemver(semanticVersion, configuration);
1248+
}
1249+
1250+
[Test]
1251+
public void EnsureVersionAfterMainIsMergedBackToDevelopIsCorrectForGitFlow()
1252+
{
1253+
var configuration = GitFlowConfigurationBuilder.New.Build();
1254+
1255+
using var fixture = new EmptyRepositoryFixture("main");
1256+
1257+
fixture.MakeACommit("A");
1258+
fixture.ApplyTag("1.0.0");
1259+
fixture.BranchTo("develop");
1260+
fixture.MakeACommit("B +semver: major");
1261+
1262+
// ✅ succeeds as expected
1263+
fixture.AssertFullSemver("2.0.0-alpha.1", configuration);
1264+
1265+
fixture.Checkout("main");
1266+
fixture.MakeACommit("C");
1267+
fixture.ApplyTag("1.0.1");
1268+
fixture.Checkout("develop");
1269+
fixture.MergeNoFF("main");
1270+
1271+
// ✅ succeeds as expected
1272+
fixture.AssertFullSemver("2.0.0-alpha.3", configuration);
1273+
}
12211274
}

src/GitVersion.Core/VersionCalculation/IncrementStrategyFinder.cs

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ public VersionField DetermineIncrementedField(
4040
configuration.NotNull();
4141

4242
var commitMessageIncrement = FindCommitMessageIncrement(
43-
configuration, baseVersion.BaseVersionSource, currentCommit, label);
43+
configuration, baseVersion, currentCommit, label);
4444

4545
var defaultIncrement = configuration.Increment.ToVersionField();
4646

@@ -81,31 +81,38 @@ public VersionField DetermineIncrementedField(
8181
}
8282

8383
private VersionField? FindCommitMessageIncrement(
84-
EffectiveConfiguration configuration, ICommit? baseCommit, ICommit? currentCommit, string? label)
84+
EffectiveConfiguration configuration, BaseVersion baseVersion, ICommit? currentCommit, string? label)
8585
{
8686
if (configuration.CommitMessageIncrementing == CommitMessageIncrementMode.Disabled)
8787
{
8888
return null;
8989
}
9090

91+
var baseCommit = baseVersion.BaseVersionSource;
92+
9193
//get tags with valid version - depends on configuration (see #3757)
9294
var targetShas = new Lazy<IReadOnlySet<string>>(() =>
9395
this.taggedSemanticVersionRepository.GetTaggedSemanticVersions(configuration.TagPrefix, configuration.SemanticVersionFormat)
94-
.SelectMany(_ => _).Where(_ => _.Value.IsMatchForBranchSpecificLabel(label)).Select(_ => _.Tag.TargetSha).ToHashSet()
96+
.SelectMany(_ => _).Where(_ => _.Value.IsMatchForBranchSpecificLabel(label)).Select(_ => _.Tag.TargetSha).ToHashSet()
9597
);
9698

97-
var commits = GetIntermediateCommits(baseCommit, currentCommit);
99+
var targetTags = this.taggedSemanticVersionRepository
100+
.GetTaggedSemanticVersions(configuration.TagPrefix, configuration.SemanticVersionFormat)
101+
.SelectMany(_ => _).Where(element => element.Value.IsMatchForBranchSpecificLabel(label)
102+
&& element.Value.CompareTo(baseVersion.GetSemanticVersion()) == 0).Select(_ => _.Tag.TargetSha).ToHashSet();
103+
104+
var intermediateCommits = GetIntermediateCommits(baseCommit, currentCommit);
98105
// consider commit messages since latest tag only (see #3071)
99-
commits = commits
106+
var commits = intermediateCommits
100107
.Reverse()
101-
.TakeWhile(x => !targetShas.Value.Contains(x.Sha))
108+
.TakeWhile(x => baseCommit != x)
109+
.Where(element => !targetShas.Value.Contains(element.Sha))
102110
.Reverse();
103111

104112
if (configuration.CommitMessageIncrementing == CommitMessageIncrementMode.MergeMessageOnly)
105113
{
106114
commits = commits.Where(c => c.Parents.Count() > 1);
107115
}
108-
109116
return GetIncrementForCommits(
110117
majorVersionBumpMessage: configuration.MajorVersionBumpMessage,
111118
minorVersionBumpMessage: configuration.MinorVersionBumpMessage,

0 commit comments

Comments
 (0)