Skip to content

Commit 4c983b8

Browse files
authored
Merge pull request #3396 from HHobeck/feature/using-effective-branch-configuration
Using effective branch configuration
2 parents 9e0c7a9 + 0ed09e9 commit 4c983b8

15 files changed

+115
-140
lines changed

src/GitVersion.Core.Tests/Configuration/Init/InitScenarios.CanSetNextVersion.approved.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,4 @@ semantic-version-format: Strict
55
branches: {}
66
ignore:
77
sha: []
8+
increment: None

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -443,11 +443,11 @@ public void VerifyIncrementConfigIsHonoured()
443443
.WithIncrement(IncrementStrategy.Minor)
444444
.WithBranch("main", builder => builder
445445
.WithVersioningMode(VersioningMode.Mainline)
446-
.WithIncrement(null)
446+
.WithIncrement(IncrementStrategy.Inherit)
447447
)
448448
.WithBranch("feature", builder => builder
449449
.WithVersioningMode(VersioningMode.Mainline)
450-
.WithIncrement(null)
450+
.WithIncrement(IncrementStrategy.Inherit)
451451
)
452452
.Build();
453453

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ public void TakesVersionFromNameOfRemoteReleaseBranchInOrigin()
5252
}
5353

5454
[Test]
55-
public void DoesNotTakeVersionFromNameOfRemoteReleaseBranchInCustomRemote()
55+
public void TakesVersionFromNameOfRemoteReleaseBranchInCustom()
5656
{
5757
using var fixture = new RemoteRepositoryFixture();
5858
fixture.LocalRepositoryFixture.Repository.Network.Remotes.Rename("origin", "upstream");
@@ -62,6 +62,6 @@ public void DoesNotTakeVersionFromNameOfRemoteReleaseBranchInCustomRemote()
6262

6363
fixture.LocalRepositoryFixture.Checkout("upstream/release/2.0.0");
6464

65-
fixture.LocalRepositoryFixture.AssertFullSemver("0.0.0-beta.1+6");
65+
fixture.LocalRepositoryFixture.AssertFullSemver("2.0.0-beta.1+1");
6666
}
6767
}

src/GitVersion.Core.Tests/VersionCalculation/EffectiveBranchConfigurationFinderTests.cs

Lines changed: 28 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -200,28 +200,7 @@ public void UsesFirstBranchConfigWhenMultipleMatch(string branchName, IncrementS
200200
}
201201

202202
[Test]
203-
public void When_getting_configurations_of_an_orphaned_branch_Given_fallback_configuaration_without_increment_Then_result_should_be_empty()
204-
{
205-
// Arrange
206-
var branchMock = GitToolsTestingExtensions.CreateMockBranch("develop", GitToolsTestingExtensions.CreateMockCommit());
207-
var configuration = GitFlowConfigurationBuilder.New
208-
.WithIncrement(null)
209-
.WithBranch("develop", builder => builder.WithIncrement(IncrementStrategy.Inherit))
210-
.Build();
211-
var repositoryStoreMock = Substitute.For<IRepositoryStore>();
212-
repositoryStoreMock.GetSourceBranches(branchMock, configuration, Arg.Any<HashSet<IBranch>>()).Returns(Enumerable.Empty<IBranch>());
213-
214-
var unitUnderTest = new EffectiveBranchConfigurationFinder(Substitute.For<ILog>(), repositoryStoreMock);
215-
216-
// Act
217-
var actual = unitUnderTest.GetConfigurations(branchMock, configuration).ToArray();
218-
219-
// Assert
220-
actual.ShouldBeEmpty();
221-
}
222-
223-
[Test]
224-
public void When_getting_configurations_of_an_orphaned_branch_Given_fallback_configuration_with_increment_inherit_Then_result_should_have_increment_none()
203+
public void When_getting_configurations_of_an_orphaned_branch_Given_fallback_configuration_with_increment_inherit_Then_result_should_be_empty()
225204
{
226205
// Arrange
227206
var branchMock = GitToolsTestingExtensions.CreateMockBranch("develop", GitToolsTestingExtensions.CreateMockCommit());
@@ -238,9 +217,7 @@ public void When_getting_configurations_of_an_orphaned_branch_Given_fallback_con
238217
var actual = unitUnderTest.GetConfigurations(branchMock, configuration).ToArray();
239218

240219
// Assert
241-
actual.ShouldHaveSingleItem();
242-
actual[0].Branch.ShouldBe(branchMock);
243-
actual[0].Value.Increment.ShouldBe(IncrementStrategy.None);
220+
actual.ShouldBeEmpty();
244221
}
245222

246223
[TestCase(IncrementStrategy.None)]
@@ -271,12 +248,13 @@ public void When_getting_configurations_of_an_orphaned_branch_Given_fallback_con
271248
}
272249

273250
[Test]
274-
public void When_getting_configurations_of_an_unknown_branch_Given_fallback_configuaration_without_increment_and_unknown_configuration_with_increment_inherit_Then_result_should_be_empty()
251+
public void When_getting_configurations_of_an_unknown_branch_Given_fallback_and_unknown_configuration_with_increment_inherit_Then_result_should_be_empty()
275252
{
276253
// Arrange
277254
var branchMock = GitToolsTestingExtensions.CreateMockBranch("unknown", GitToolsTestingExtensions.CreateMockCommit());
278255
var configuration = GitFlowConfigurationBuilder.New
279-
.WithIncrement(null)
256+
.WithIncrement(IncrementStrategy.Inherit)
257+
.WithBranch("unknown", builder => builder.WithIncrement(IncrementStrategy.Inherit))
280258
.Build();
281259
var repositoryStoreMock = Substitute.For<IRepositoryStore>();
282260
repositoryStoreMock.GetSourceBranches(branchMock, configuration, Arg.Any<HashSet<IBranch>>()).Returns(Enumerable.Empty<IBranch>());
@@ -301,6 +279,7 @@ public void When_getting_configurations_of_an_unknown_branch_Given_fallback_conf
301279
var branchMock = GitToolsTestingExtensions.CreateMockBranch("unknown", GitToolsTestingExtensions.CreateMockCommit());
302280
var configuration = GitFlowConfigurationBuilder.New
303281
.WithIncrement(fallbackIncrement)
282+
.WithBranch("unknown", builder => builder.WithIncrement(IncrementStrategy.Inherit))
304283
.Build();
305284
var repositoryStoreMock = Substitute.For<IRepositoryStore>();
306285
repositoryStoreMock.GetSourceBranches(branchMock, configuration, Arg.Any<HashSet<IBranch>>()).Returns(Enumerable.Empty<IBranch>());
@@ -318,13 +297,13 @@ public void When_getting_configurations_of_an_unknown_branch_Given_fallback_conf
318297

319298
[Theory]
320299
public void When_getting_configurations_of_an_unknown_branch_Given_fallback_configuaration_with_increment_and_develop_branch_with_increment_Then_result_should_have_develop_increment(
321-
IncrementStrategy fallbackIncrement, IncrementStrategy developBranchIncrement)
300+
IncrementStrategy fallbackIncrement, IncrementStrategy developIncrement)
322301
{
323302
// Arrange
324303
var unknownBranchMock = GitToolsTestingExtensions.CreateMockBranch("unknown", GitToolsTestingExtensions.CreateMockCommit());
325304
var configuration = GitFlowConfigurationBuilder.New
326305
.WithIncrement(fallbackIncrement)
327-
.WithBranch("develop", builder => builder.WithIncrement(developBranchIncrement))
306+
.WithBranch("develop", builder => builder.WithIncrement(developIncrement))
328307
.Build();
329308
var repositoryStoreMock = Substitute.For<IRepositoryStore>();
330309
var developBranchMock = GitToolsTestingExtensions.CreateMockBranch("develop", GitToolsTestingExtensions.CreateMockCommit());
@@ -336,22 +315,24 @@ public void When_getting_configurations_of_an_unknown_branch_Given_fallback_conf
336315
var actual = unitUnderTest.GetConfigurations(unknownBranchMock, configuration).ToArray();
337316

338317
// Assert
339-
actual.ShouldHaveSingleItem();
340-
actual[0].Branch.ShouldBe(developBranchMock);
341-
342-
if (developBranchIncrement == IncrementStrategy.Inherit)
318+
if (fallbackIncrement == IncrementStrategy.Inherit && developIncrement == IncrementStrategy.Inherit)
343319
{
344-
if (fallbackIncrement == IncrementStrategy.Inherit)
345-
{
346-
fallbackIncrement = IncrementStrategy.None;
347-
}
348-
actual[0].Value.Increment.ShouldBe(fallbackIncrement);
320+
actual.ShouldBeEmpty();
349321
}
350322
else
351323
{
352-
actual[0].Value.Increment.ShouldBe(developBranchIncrement);
353-
}
324+
actual.ShouldHaveSingleItem();
325+
actual[0].Branch.ShouldBe(developBranchMock);
354326

327+
if (developIncrement == IncrementStrategy.Inherit)
328+
{
329+
actual[0].Value.Increment.ShouldBe(fallbackIncrement);
330+
}
331+
else
332+
{
333+
actual[0].Value.Increment.ShouldBe(developIncrement);
334+
}
335+
}
355336
}
356337

357338
[Theory]
@@ -374,14 +355,16 @@ public void When_getting_configurations_of_an_unknown_branch_Given_fallback_conf
374355
var actual = unitUnderTest.GetConfigurations(unknownBranchMock, configuration).ToArray();
375356

376357
// Assert
377-
actual.ShouldHaveSingleItem();
378-
actual[0].Branch.ShouldBe(developBranchMock);
379-
380358
if (fallbackIncrement == IncrementStrategy.Inherit)
381359
{
382-
fallbackIncrement = IncrementStrategy.None;
360+
actual.ShouldBeEmpty();
361+
}
362+
else
363+
{
364+
actual.ShouldHaveSingleItem();
365+
actual[0].Branch.ShouldBe(developBranchMock);
366+
actual[0].Value.Increment.ShouldBe(fallbackIncrement);
383367
}
384-
actual[0].Value.Increment.ShouldBe(fallbackIncrement);
385368
}
386369

387370
[TestCase(IncrementStrategy.None)]

src/GitVersion.Core.Tests/VersionCalculation/Strategies/VersionInBranchNameBaseVersionStrategyTests.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -60,14 +60,14 @@ public void CanTakeVersionFromNameOfConfiguredReleaseBranch(string branchName, s
6060
fixture.Repository.MakeACommit();
6161
fixture.Repository.CreateBranch(branchName);
6262

63-
var configurationBuilder = GitFlowConfigurationBuilder.New
64-
.WithBranch("support", builder => builder.WithIsReleaseBranch(true));
65-
ConfigurationHelper configurationHelper = new(configurationBuilder.Build());
63+
var configuration = GitFlowConfigurationBuilder.New
64+
.WithBranch("support", builder => builder.WithIsReleaseBranch(true))
65+
.Build();
66+
ConfigurationHelper configurationHelper = new(configuration);
6667

6768
var gitRepository = fixture.Repository.ToGitRepository();
6869
var strategy = GetVersionStrategy(fixture.RepositoryPath, gitRepository, branchName, configurationHelper.Dictionary);
6970

70-
var configuration = GitFlowConfigurationBuilder.New.Build();
7171
var branchConfiguration = configuration.GetBranchConfiguration(branchName);
7272
var effectiveConfiguration = new EffectiveConfiguration(configuration, branchConfiguration);
7373

src/GitVersion.Core/Configuration/BranchConfiguration.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ public BranchConfiguration(BranchConfiguration branchConfiguration)
4242

4343
[JsonPropertyName("increment")]
4444
[JsonPropertyDescription("The increment strategy for this branch. Can be 'Inherit', 'Patch', 'Minor', 'Major', 'None'.")]
45-
public IncrementStrategy? Increment { get; set; }
45+
public IncrementStrategy Increment { get; set; }
4646

4747
[JsonPropertyName("prevent-increment-of-merged-branch-version")]
4848
[JsonPropertyDescription("Prevent increment of merged branch version.")]
@@ -105,7 +105,7 @@ public BranchConfiguration Inherit(BranchConfiguration? parentConfig)
105105

106106
var result = new BranchConfiguration(this);
107107

108-
if (result.Increment is null || result.Increment == IncrementStrategy.Inherit)
108+
if (result.Increment == IncrementStrategy.Inherit)
109109
result.Increment = parentConfig.Increment;
110110
result.VersioningMode ??= parentConfig.VersioningMode;
111111
result.Label ??= parentConfig.Label;

src/GitVersion.Core/Configuration/BranchConfigurationBuilder.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ public class BranchConfigurationBuilder
99
private string name;
1010
private VersioningMode? versioningMode;
1111
private string? label;
12-
private IncrementStrategy? increment;
12+
private IncrementStrategy increment;
1313
private bool? preventIncrementOfMergedBranchVersion;
1414
private string? labelNumberPattern;
1515
private bool? trackMergeTarget;
@@ -45,7 +45,7 @@ public virtual BranchConfigurationBuilder WithLabel(string? value)
4545
return this;
4646
}
4747

48-
public virtual BranchConfigurationBuilder WithIncrement(IncrementStrategy? value)
48+
public virtual BranchConfigurationBuilder WithIncrement(IncrementStrategy value)
4949
{
5050
this.increment = value;
5151
return this;

src/GitVersion.Core/Configuration/ConfigurationBuilderBase.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ internal abstract class ConfigurationBuilderBase<TConfigurationBuilder>
2727
private readonly Dictionary<string, BranchConfigurationBuilder> branchConfigurationBuilders = new();
2828
private VersioningMode? versioningMode;
2929
private string? label;
30-
private IncrementStrategy? increment;
30+
private IncrementStrategy increment = IncrementStrategy.Inherit;
3131
private bool? preventIncrementOfMergedBranchVersion;
3232
private string? labelNumberPattern;
3333
private bool? trackMergeTarget;
@@ -232,7 +232,7 @@ public virtual TConfigurationBuilder WithLabel(string? value)
232232
return (TConfigurationBuilder)this;
233233
}
234234

235-
public virtual TConfigurationBuilder WithIncrement(IncrementStrategy? value)
235+
public virtual TConfigurationBuilder WithIncrement(IncrementStrategy value)
236236
{
237237
this.increment = value;
238238
return (TConfigurationBuilder)this;

src/GitVersion.Core/Configuration/ConfigurationExtensions.cs

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,11 @@ namespace GitVersion.Configuration;
77
public static class ConfigurationExtensions
88
{
99
public static EffectiveConfiguration GetEffectiveConfiguration(this GitVersionConfiguration configuration, IBranch branch)
10+
=> GetEffectiveConfiguration(configuration, branch.NotNull().Name.WithoutRemote);
11+
12+
public static EffectiveConfiguration GetEffectiveConfiguration(this GitVersionConfiguration configuration, string branchName)
1013
{
11-
var branchConfiguration = configuration.GetBranchConfiguration(branch);
14+
BranchConfiguration branchConfiguration = configuration.GetBranchConfiguration(branchName);
1215
return new EffectiveConfiguration(configuration, branchConfiguration);
1316
}
1417

@@ -25,16 +28,6 @@ public static BranchConfiguration GetBranchConfiguration(this GitVersionConfigur
2528
Label = ConfigurationConstants.BranchNamePlaceholder,
2629
Increment = IncrementStrategy.Inherit
2730
};
28-
29-
if (branchConfiguration.Increment == IncrementStrategy.Inherit)
30-
return branchConfiguration;
31-
32-
var fallbackBranchConfiguration = GetFallbackBranchConfiguration(configuration);
33-
branchConfiguration.Increment ??= fallbackBranchConfiguration.Increment;
34-
if (branchConfiguration.Increment != IncrementStrategy.Inherit)
35-
{
36-
branchConfiguration = branchConfiguration.Inherit(fallbackBranchConfiguration);
37-
}
3831
return branchConfiguration;
3932
}
4033

@@ -61,7 +54,6 @@ private static IEnumerable<BranchConfiguration> GetBranchConfigurations(GitVersi
6154
public static BranchConfiguration GetFallbackBranchConfiguration(this GitVersionConfiguration configuration)
6255
{
6356
BranchConfiguration result = new(configuration);
64-
if (result.Increment == IncrementStrategy.Inherit) result.Increment = IncrementStrategy.None;
6557
return result;
6658
}
6759

src/GitVersion.Core/Configuration/EffectiveConfiguration.cs

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -9,26 +9,26 @@ namespace GitVersion.Configuration;
99
/// </summary>
1010
public class EffectiveConfiguration
1111
{
12-
public EffectiveConfiguration(GitVersionConfiguration configuration, BranchConfiguration currentBranchConfig)
12+
public EffectiveConfiguration(GitVersionConfiguration configuration, BranchConfiguration branchConfiguration)
1313
{
1414
configuration.NotNull();
15-
currentBranchConfig.NotNull();
15+
branchConfiguration.NotNull();
1616

17-
var name = currentBranchConfig.Name;
17+
var fallbackBranchConfiguration = configuration.GetFallbackBranchConfiguration();
18+
branchConfiguration = branchConfiguration.Inherit(fallbackBranchConfiguration);
1819

19-
if (!currentBranchConfig.VersioningMode.HasValue)
20-
throw new Exception($"Configuration value for 'Versioning mode' for branch {name} has no value. (this should not happen, please report an issue)");
20+
var name = branchConfiguration.Name;
2121

22-
if (!currentBranchConfig.Increment.HasValue)
23-
throw new Exception($"Configuration value for 'Increment' for branch {name} has no value. (this should not happen, please report an issue)");
22+
if (!branchConfiguration.VersioningMode.HasValue)
23+
throw new Exception($"Configuration value for 'Versioning mode' for branch {name} has no value. (this should not happen, please report an issue)");
2424

2525
if (!configuration.AssemblyVersioningScheme.HasValue)
2626
throw new Exception("Configuration value for 'AssemblyVersioningScheme' has no value. (this should not happen, please report an issue)");
2727

2828
if (!configuration.AssemblyFileVersioningScheme.HasValue)
2929
throw new Exception("Configuration value for 'AssemblyFileVersioningScheme' has no value. (this should not happen, please report an issue)");
3030

31-
if (!currentBranchConfig.CommitMessageIncrementing.HasValue)
31+
if (!branchConfiguration.CommitMessageIncrementing.HasValue)
3232
throw new Exception("Configuration value for 'CommitMessageIncrementing' has no value. (this should not happen, please report an issue)");
3333

3434
if (!configuration.LabelPreReleaseWeight.HasValue)
@@ -39,29 +39,29 @@ public EffectiveConfiguration(GitVersionConfiguration configuration, BranchConfi
3939
AssemblyInformationalFormat = configuration.AssemblyInformationalFormat;
4040
AssemblyVersioningFormat = configuration.AssemblyVersioningFormat;
4141
AssemblyFileVersioningFormat = configuration.AssemblyFileVersioningFormat;
42-
VersioningMode = currentBranchConfig.VersioningMode.Value;
42+
VersioningMode = branchConfiguration.VersioningMode.Value;
4343
LabelPrefix = configuration.LabelPrefix;
44-
Label = currentBranchConfig.Label ?? string.Empty;
44+
Label = branchConfiguration.Label ?? string.Empty;
4545
NextVersion = configuration.NextVersion;
46-
Increment = currentBranchConfig.Increment.Value;
47-
BranchPrefixToTrim = currentBranchConfig.Regex;
48-
PreventIncrementOfMergedBranchVersion = currentBranchConfig.PreventIncrementOfMergedBranchVersion ?? false;
49-
LabelNumberPattern = currentBranchConfig.LabelNumberPattern;
50-
TrackMergeTarget = currentBranchConfig.TrackMergeTarget ?? false;
51-
TrackMergeMessage = currentBranchConfig.TrackMergeMessage ?? true;
46+
Increment = branchConfiguration.Increment;
47+
BranchPrefixToTrim = branchConfiguration.Regex;
48+
PreventIncrementOfMergedBranchVersion = branchConfiguration.PreventIncrementOfMergedBranchVersion ?? false;
49+
LabelNumberPattern = branchConfiguration.LabelNumberPattern;
50+
TrackMergeTarget = branchConfiguration.TrackMergeTarget ?? false;
51+
TrackMergeMessage = branchConfiguration.TrackMergeMessage ?? true;
5252
MajorVersionBumpMessage = configuration.MajorVersionBumpMessage;
5353
MinorVersionBumpMessage = configuration.MinorVersionBumpMessage;
5454
PatchVersionBumpMessage = configuration.PatchVersionBumpMessage;
5555
NoBumpMessage = configuration.NoBumpMessage;
56-
CommitMessageIncrementing = currentBranchConfig.CommitMessageIncrementing.Value;
56+
CommitMessageIncrementing = branchConfiguration.CommitMessageIncrementing.Value;
5757
VersionFilters = configuration.Ignore.ToFilters();
58-
TracksReleaseBranches = currentBranchConfig.TracksReleaseBranches ?? false;
59-
IsReleaseBranch = currentBranchConfig.IsReleaseBranch ?? false;
60-
IsMainline = currentBranchConfig.IsMainline ?? false;
58+
TracksReleaseBranches = branchConfiguration.TracksReleaseBranches ?? false;
59+
IsReleaseBranch = branchConfiguration.IsReleaseBranch ?? false;
60+
IsMainline = branchConfiguration.IsMainline ?? false;
6161
CommitDateFormat = configuration.CommitDateFormat;
6262
UpdateBuildNumber = configuration.UpdateBuildNumber;
6363
SemanticVersionFormat = configuration.SemanticVersionFormat;
64-
PreReleaseWeight = currentBranchConfig.PreReleaseWeight ?? 0;
64+
PreReleaseWeight = branchConfiguration.PreReleaseWeight ?? 0;
6565
LabelPreReleaseWeight = configuration.LabelPreReleaseWeight.Value;
6666
}
6767

@@ -174,7 +174,7 @@ protected EffectiveConfiguration(AssemblyVersioningScheme assemblyVersioningSche
174174

175175
public bool UpdateBuildNumber { get; }
176176

177-
public SemanticVersionFormat SemanticVersionFormat { get; set; } = SemanticVersionFormat.Strict;
177+
public SemanticVersionFormat SemanticVersionFormat { get; set; }
178178

179179
public int PreReleaseWeight { get; }
180180

0 commit comments

Comments
 (0)