Skip to content

Commit deaaa0f

Browse files
authored
Merge pull request #1635 from ruhullahshah/bugfix/CommitsSinceVersionSource-goes-down-on-deleting-a-merged-feature
[Bugfix] CommitsSinceVersionSource decreases upon deleting a merged Release branch
2 parents debc1fc + a100491 commit deaaa0f

File tree

4 files changed

+129
-5
lines changed

4 files changed

+129
-5
lines changed

src/GitVersionCore.Tests/IntegrationTests/DevelopScenarios.cs

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -222,4 +222,81 @@ public void TagOnHotfixShouldNotAffectDevelop()
222222
fixture.AssertFullSemver("1.3.0-alpha.2");
223223
}
224224
}
225+
226+
[Test]
227+
public void CommitsSinceVersionSourceShouldNotGoDownUponGitFlowReleaseFinish()
228+
{
229+
var config = new Config
230+
{
231+
VersioningMode = VersioningMode.ContinuousDeployment
232+
};
233+
234+
using (var fixture = new EmptyRepositoryFixture())
235+
{
236+
fixture.MakeACommit();
237+
fixture.ApplyTag("1.1.0");
238+
fixture.BranchTo("develop");
239+
fixture.MakeACommit("commit in develop - 1");
240+
fixture.AssertFullSemver("1.2.0-alpha.1");
241+
fixture.BranchTo("release/1.2.0");
242+
fixture.AssertFullSemver("1.2.0-beta.1+0");
243+
fixture.Checkout("develop");
244+
fixture.MakeACommit("commit in develop - 2");
245+
fixture.MakeACommit("commit in develop - 3");
246+
fixture.MakeACommit("commit in develop - 4");
247+
fixture.MakeACommit("commit in develop - 5");
248+
fixture.AssertFullSemver("1.3.0-alpha.4");
249+
fixture.Checkout("release/1.2.0");
250+
fixture.MakeACommit("commit in release/1.2.0 - 1");
251+
fixture.MakeACommit("commit in release/1.2.0 - 2");
252+
fixture.MakeACommit("commit in release/1.2.0 - 3");
253+
fixture.AssertFullSemver("1.2.0-beta.1+3");
254+
fixture.Checkout("master");
255+
fixture.MergeNoFF("release/1.2.0");
256+
fixture.ApplyTag("1.2.0");
257+
fixture.Checkout("develop");
258+
fixture.MergeNoFF("release/1.2.0");
259+
fixture.MakeACommit("commit in develop - 6");
260+
fixture.AssertFullSemver("1.3.0-alpha.9");
261+
fixture.SequenceDiagram.Destroy("release/1.2.0");
262+
fixture.Repository.Branches.Remove("release/1.2.0");
263+
264+
var expectedFullSemVer = "1.3.0-alpha.9";
265+
fixture.AssertFullSemver(config, expectedFullSemVer);
266+
}
267+
}
268+
269+
[Test]
270+
public void CommitsSinceVersionSourceShouldNotGoDownUponMergingFeatureOnlyToDevelop()
271+
{
272+
var config = new Config
273+
{
274+
VersioningMode = VersioningMode.ContinuousDeployment
275+
};
276+
277+
using (var fixture = new EmptyRepositoryFixture())
278+
{
279+
fixture.MakeACommit("commit in master - 1");
280+
fixture.ApplyTag("1.1.0");
281+
fixture.BranchTo("develop");
282+
fixture.MakeACommit("commit in develop - 1");
283+
fixture.AssertFullSemver("1.2.0-alpha.1");
284+
fixture.BranchTo("release/1.2.0");
285+
fixture.MakeACommit("commit in release - 1");
286+
fixture.MakeACommit("commit in release - 2");
287+
fixture.MakeACommit("commit in release - 3");
288+
fixture.AssertFullSemver("1.2.0-beta.1+3");
289+
fixture.ApplyTag("1.2.0");
290+
fixture.Checkout("develop");
291+
fixture.MakeACommit("commit in develop - 2");
292+
fixture.AssertFullSemver("1.3.0-alpha.1");
293+
fixture.MergeNoFF("release/1.2.0");
294+
fixture.AssertFullSemver("1.3.0-alpha.5");
295+
fixture.SequenceDiagram.Destroy("release/1.2.0");
296+
fixture.Repository.Branches.Remove("release/1.2.0");
297+
298+
var expectedFullSemVer = "1.3.0-alpha.5";
299+
fixture.AssertFullSemver(config, expectedFullSemVer);
300+
}
301+
}
225302
}

src/GitVersionCore.Tests/IntegrationTests/ReleaseBranchScenarios.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ public void NoMergeBacksToDevelopInCaseThereAreChangesInReleaseBranch()
5151
fixture.Repository.MakeACommit();
5252
fixture.Repository.Branches.Remove("release/1.0.0");
5353

54-
fixture.AssertFullSemver("1.1.0-alpha.2");
54+
fixture.AssertFullSemver("1.1.0-alpha.3");
5555
}
5656
}
5757

src/GitVersionCore/VersionCalculation/BaseVersionCalculator.cs

Lines changed: 48 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
1-
namespace GitVersion.VersionCalculation
1+
namespace GitVersion.VersionCalculation
22
{
33
using System;
4+
using System.Collections.Generic;
45
using System.Linq;
6+
using System.Text.RegularExpressions;
57
using GitVersion.VersionCalculation.BaseVersionCalculators;
68

79
public class BaseVersionCalculator : IBaseVersionCalculator
@@ -37,13 +39,15 @@ public BaseVersion GetBaseVersion(GitVersionContext context)
3739

3840
return true;
3941
})
40-
.Select(v => new
42+
.Select(v => new Versions
4143
{
4244
IncrementedVersion = MaybeIncrement(context, v),
4345
Version = v
4446
})
4547
.ToList();
4648

49+
FixTheBaseVersionSourceOfMergeMessageStrategyIfReleaseBranchWasMergedAndDeleted
50+
(context, baseVersions);
4751
var maxVersion = baseVersions.Aggregate((v1, v2) => v1.IncrementedVersion > v2.IncrementedVersion ? v1 : v2);
4852
var matchingVersionsOnceIncremented = baseVersions
4953
.Where(b => b.Version.BaseVersionSource != null && b.IncrementedVersion == maxVersion.IncrementedVersion)
@@ -92,5 +96,46 @@ public static SemanticVersion MaybeIncrement(GitVersionContext context, BaseVers
9296

9397
return version.SemanticVersion;
9498
}
99+
100+
private void FixTheBaseVersionSourceOfMergeMessageStrategyIfReleaseBranchWasMergedAndDeleted(
101+
GitVersionContext context, List<Versions> baseVersions)
102+
{
103+
if (!ReleaseBranchExistsInRepo(context))
104+
{
105+
foreach (var baseVersion in baseVersions)
106+
{
107+
if (baseVersion.Version.Source.Contains(
108+
MergeMessageBaseVersionStrategy.MergeMessageStrategyPrefix)
109+
&& baseVersion.Version.Source.Contains("Merge branch")
110+
&& baseVersion.Version.Source.Contains("release"))
111+
{
112+
var parents = baseVersion.Version.BaseVersionSource.Parents.ToList();
113+
baseVersion.Version = new BaseVersion(
114+
context,
115+
baseVersion.Version.Source,
116+
baseVersion.Version.ShouldIncrement,
117+
baseVersion.Version.SemanticVersion,
118+
context.Repository.ObjectDatabase.FindMergeBase(parents[0], parents[1]),
119+
baseVersion.Version.BranchNameOverride);
120+
}
121+
}
122+
}
123+
}
124+
125+
private bool ReleaseBranchExistsInRepo(GitVersionContext context)
126+
{
127+
var releaseBranchConfig = context.FullConfiguration.Branches
128+
.Where(b => b.Value.IsReleaseBranch == true)
129+
.ToList();
130+
var releaseBranches = context.Repository.Branches
131+
.Where(b => releaseBranchConfig.Any(c => Regex.IsMatch(b.FriendlyName, c.Value.Regex)));
132+
return releaseBranches.Any();
133+
}
134+
135+
private class Versions
136+
{
137+
public SemanticVersion IncrementedVersion { get; set; }
138+
public BaseVersion Version { get; set; }
139+
}
95140
}
96-
}
141+
}

src/GitVersionCore/VersionCalculation/BaseVersionCalculators/MergeMessageBaseVersionStrategy.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,14 +26,16 @@ public override IEnumerable<BaseVersion> GetVersions(GitVersionContext context)
2626
var shouldIncrement = !context.Configuration.PreventIncrementForMergedBranchVersion;
2727
return new[]
2828
{
29-
new BaseVersion(context, $"Merge message '{c.Message.Trim()}'", shouldIncrement, mergeMessage.Version, c, null)
29+
new BaseVersion(context, $"{MergeMessageStrategyPrefix} '{c.Message.Trim()}'", shouldIncrement, mergeMessage.Version, c, null)
3030
};
3131
}
3232
return Enumerable.Empty<BaseVersion>();
3333
}).ToList();
3434
return baseVersions;
3535
}
3636

37+
public static readonly string MergeMessageStrategyPrefix = "Merge message";
38+
3739
static bool TryParse(Commit mergeCommit, GitVersionContext context, out MergeMessage mergeMessage)
3840
{
3941
mergeMessage = Inner(mergeCommit, context);

0 commit comments

Comments
 (0)