Skip to content

Commit

Permalink
Refactor BranchConfiguration for improved encapsulation and re-usability
Browse files Browse the repository at this point in the history
This commit modifies EffectiveBranchConfiguration and NextVersion to encapsulate branch and configuration data. The changes focus on transforming some classes to records, thus creating better data structures. The countless changes in method calls from various strategies and calculators accommodate the revised data encapsulation. The intention behind this refactor is to enhance readability, reduce redundancy, and provide better design of the data structure. It is important to note that these modifications are not expected to change the existing behavior.
  • Loading branch information
arturcic committed Oct 7, 2023
1 parent a003da2 commit d19a11a
Show file tree
Hide file tree
Showing 15 changed files with 38 additions and 63 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

namespace GitVersion.Core.Tests.Helpers;

public class TestEffectiveConfiguration : EffectiveConfiguration
public record TestEffectiveConfiguration : EffectiveConfiguration
{
public TestEffectiveConfiguration(
AssemblyVersioningScheme assemblyVersioningScheme = AssemblyVersioningScheme.MajorMinorPatch,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,10 +57,8 @@ public void ConfigNextVersionTestShouldFail(string nextVersion, SemanticVersionF
var strategy = contextBuilder.ServicesProvider.GetServiceForType<IVersionStrategy, ConfigNextVersionVersionStrategy>();
var context = contextBuilder.ServicesProvider.GetRequiredService<Lazy<GitVersionContext>>().Value;
var branchMock = GitToolsTestingExtensions.CreateMockBranch("main", GitToolsTestingExtensions.CreateMockCommit());
var branchConfiguration = context.Configuration.GetBranchConfiguration(branchMock);
var effectiveConfiguration = new EffectiveConfiguration(context.Configuration, branchConfiguration);

strategy.ShouldNotBeNull();
return strategy.GetBaseVersions(new(branchMock, effectiveConfiguration)).SingleOrDefault();
return strategy.GetBaseVersions(context.Configuration.GetEffectiveBranchConfiguration(branchMock)).SingleOrDefault();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -35,11 +35,9 @@ public void ShouldNotAllowIncrementOfVersion()
contextBuilder.ServicesProvider.ShouldNotBeNull();
var strategy = contextBuilder.ServicesProvider.GetServiceForType<IVersionStrategy, MergeMessageVersionStrategy>();
var context = contextBuilder.ServicesProvider.GetRequiredService<Lazy<GitVersionContext>>().Value;
var branchConfiguration = context.Configuration.GetBranchConfiguration(mockBranch);
var effectiveConfiguration = new EffectiveConfiguration(context.Configuration, branchConfiguration);

strategy.ShouldNotBeNull();
var baseVersion = strategy.GetBaseVersions(new(mockBranch, effectiveConfiguration)).Single();
var baseVersion = strategy.GetBaseVersions(context.Configuration.GetEffectiveBranchConfiguration(mockBranch)).Single();

baseVersion.ShouldIncrement.ShouldBe(false);
}
Expand Down Expand Up @@ -168,11 +166,9 @@ private static void AssertMergeMessage(string message, string? expectedVersion,
contextBuilder.ServicesProvider.ShouldNotBeNull();
var strategy = contextBuilder.ServicesProvider.GetServiceForType<IVersionStrategy, MergeMessageVersionStrategy>();
var context = contextBuilder.ServicesProvider.GetRequiredService<Lazy<GitVersionContext>>().Value;
var branchConfiguration = context.Configuration.GetBranchConfiguration(mockBranch);
var effectiveConfiguration = new EffectiveConfiguration(context.Configuration, branchConfiguration);

strategy.ShouldNotBeNull();
var baseVersion = strategy.GetBaseVersions(new(mockBranch, effectiveConfiguration)).SingleOrDefault();
var baseVersion = strategy.GetBaseVersions(context.Configuration.GetEffectiveBranchConfiguration(mockBranch)).SingleOrDefault();

if (expectedVersion == null)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,7 @@ public void CanTakeVersionFromNameOfReleaseBranch(string branchName, string expe
var branch = repository.FindBranch(branchName);

var configuration = GitFlowConfigurationBuilder.New.Build();
var branchConfiguration = configuration.GetBranchConfiguration(branch);
var effectiveConfiguration = new EffectiveConfiguration(configuration, branchConfiguration);
var effectiveBranchConfiguration = new EffectiveBranchConfiguration(branch, effectiveConfiguration);
var effectiveBranchConfiguration = configuration.GetEffectiveBranchConfiguration(branch);

strategy.ShouldNotBeNull();
var baseVersion = strategy.GetBaseVersions(effectiveBranchConfiguration).Single();
Expand Down Expand Up @@ -54,9 +52,7 @@ public void ShouldNotTakeVersionFromNameOfNonReleaseBranch(string branchName)
var branch = repository.FindBranch(branchName);

var configuration = GitFlowConfigurationBuilder.New.Build();
var branchConfiguration = configuration.GetBranchConfiguration(branch);
var effectiveConfiguration = new EffectiveConfiguration(configuration, branchConfiguration);
var effectiveBranchConfiguration = new EffectiveBranchConfiguration(branch, effectiveConfiguration);
var effectiveBranchConfiguration = configuration.GetEffectiveBranchConfiguration(branch);

strategy.ShouldNotBeNull();
var baseVersions = strategy.GetBaseVersions(effectiveBranchConfiguration);
Expand Down Expand Up @@ -89,9 +85,7 @@ public void CanTakeVersionFromNameOfConfiguredReleaseBranch(string branchName, s
var strategy = GetVersionStrategy(repository, null, configurationHelper.Dictionary);
var branch = repository.FindBranch(branchName);

var branchConfiguration = configuration.GetBranchConfiguration(branch);
var effectiveConfiguration = new EffectiveConfiguration(configuration, branchConfiguration);
var effectiveBranchConfiguration = new EffectiveBranchConfiguration(branch, effectiveConfiguration);
var effectiveBranchConfiguration = configuration.GetEffectiveBranchConfiguration(branch);

strategy.ShouldNotBeNull();
var baseVersion = strategy.GetBaseVersions(effectiveBranchConfiguration).Single();
Expand All @@ -115,9 +109,7 @@ public void CanTakeVersionFromNameOfRemoteReleaseBranch(string origin, string br
var branch = localRepository.FindBranch(branchName);

var configuration = GitFlowConfigurationBuilder.New.Build();
var branchConfiguration = configuration.GetBranchConfiguration(branch);
var effectiveConfiguration = new EffectiveConfiguration(configuration, branchConfiguration);
var effectiveBranchConfiguration = new EffectiveBranchConfiguration(branch, effectiveConfiguration);
var effectiveBranchConfiguration = configuration.GetEffectiveBranchConfiguration(branch);

strategy.ShouldNotBeNull();
var baseVersion = strategy.GetBaseVersions(effectiveBranchConfiguration).Single();
Expand Down
14 changes: 7 additions & 7 deletions src/GitVersion.Core/Configuration/ConfigurationExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,18 +5,18 @@ namespace GitVersion.Configuration;

public static class ConfigurationExtensions
{
public static EffectiveConfiguration GetEffectiveConfiguration(this IGitVersionConfiguration configuration, IBranch branch)
=> GetEffectiveConfiguration(configuration, branch.NotNull().Name);
public static EffectiveBranchConfiguration GetEffectiveBranchConfiguration(this IGitVersionConfiguration configuration, IBranch branch)
{
var effectiveConfiguration = GetEffectiveConfiguration(configuration, branch.Name);
return new(effectiveConfiguration, branch);
}

public static EffectiveConfiguration GetEffectiveConfiguration(this IGitVersionConfiguration configuration, ReferenceName branchName)
{
IBranchConfiguration branchConfiguration = configuration.GetBranchConfiguration(branchName);
return new EffectiveConfiguration(configuration, branchConfiguration);
var branchConfiguration = configuration.GetBranchConfiguration(branchName);
return new(configuration, branchConfiguration);
}

public static IBranchConfiguration GetBranchConfiguration(this IGitVersionConfiguration configuration, IBranch branch)
=> GetBranchConfiguration(configuration, branch.NotNull().Name);

public static IBranchConfiguration GetBranchConfiguration(this IGitVersionConfiguration configuration, ReferenceName branchName)
{
var branchConfiguration = GetBranchConfigurations(configuration, branchName.WithoutOrigin).FirstOrDefault();
Expand Down
14 changes: 4 additions & 10 deletions src/GitVersion.Core/Configuration/EffectiveBranchConfiguration.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,23 +3,17 @@

namespace GitVersion.Configuration;

public class EffectiveBranchConfiguration
public record EffectiveBranchConfiguration(EffectiveConfiguration Value, IBranch Branch)
{
public IBranch Branch { get; }
public IBranch Branch { get; } = Branch.NotNull();

public EffectiveConfiguration Value { get; }

public EffectiveBranchConfiguration(IBranch branch, EffectiveConfiguration value)
{
Branch = branch.NotNull();
Value = value.NotNull();
}
public EffectiveConfiguration Value { get; } = Value.NotNull();

public NextVersion CreateNextVersion(BaseVersion baseVersion, SemanticVersion incrementedVersion)
{
incrementedVersion.NotNull();
baseVersion.NotNull();

return new NextVersion(incrementedVersion, baseVersion, new EffectiveBranchConfiguration(Branch, Value));
return new(incrementedVersion, baseVersion, this);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ namespace GitVersion.Configuration;
/// Configuration can be applied to different things, effective configuration is the result after applying the
/// appropriate configuration
/// </summary>
public class EffectiveConfiguration
public record EffectiveConfiguration
{
public EffectiveConfiguration(IGitVersionConfiguration configuration, IBranchConfiguration branchConfiguration)
{
Expand Down
2 changes: 1 addition & 1 deletion src/GitVersion.Core/Core/RepositoryStore.cs
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,7 @@ public IEnumerable<IBranch> FindMainlineBranches(IGitVersionConfiguration config

foreach (var branch in this.repository.Branches)
{
var branchConfiguration = configuration.GetBranchConfiguration(branch);
var branchConfiguration = configuration.GetBranchConfiguration(branch.Name);
if (branchConfiguration.IsMainline == true)
{
yield return branch;
Expand Down
8 changes: 3 additions & 5 deletions src/GitVersion.Core/PublicAPI.Unshipped.txt
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,7 @@ GitVersion.Configuration.ConfigurationModule.RegisterTypes(Microsoft.Extensions.
GitVersion.Configuration.EffectiveBranchConfiguration
GitVersion.Configuration.EffectiveBranchConfiguration.Branch.get -> GitVersion.IBranch!
GitVersion.Configuration.EffectiveBranchConfiguration.CreateNextVersion(GitVersion.VersionCalculation.BaseVersion! baseVersion, GitVersion.SemanticVersion! incrementedVersion) -> GitVersion.VersionCalculation.NextVersion!
GitVersion.Configuration.EffectiveBranchConfiguration.EffectiveBranchConfiguration(GitVersion.IBranch! branch, GitVersion.Configuration.EffectiveConfiguration! value) -> void
GitVersion.Configuration.EffectiveBranchConfiguration.EffectiveBranchConfiguration(GitVersion.Configuration.EffectiveConfiguration! Value, GitVersion.IBranch! Branch) -> void
GitVersion.Configuration.EffectiveBranchConfiguration.Value.get -> GitVersion.Configuration.EffectiveConfiguration!
GitVersion.Configuration.EffectiveConfiguration
GitVersion.Configuration.EffectiveConfiguration.AssemblyFileVersioningFormat.get -> string?
Expand Down Expand Up @@ -735,13 +735,12 @@ GitVersion.VersionCalculation.IVersionStrategy
GitVersion.VersionCalculation.IVersionStrategy.GetBaseVersions(GitVersion.Configuration.EffectiveBranchConfiguration! configuration) -> System.Collections.Generic.IEnumerable<GitVersion.VersionCalculation.BaseVersion!>!
GitVersion.VersionCalculation.NextVersion
GitVersion.VersionCalculation.NextVersion.BaseVersion.get -> GitVersion.VersionCalculation.BaseVersion!
GitVersion.VersionCalculation.NextVersion.Branch.get -> GitVersion.IBranch!
GitVersion.VersionCalculation.NextVersion.BranchConfiguration.get -> GitVersion.Configuration.EffectiveBranchConfiguration!
GitVersion.VersionCalculation.NextVersion.CompareTo(GitVersion.VersionCalculation.NextVersion? other) -> int
GitVersion.VersionCalculation.NextVersion.Configuration.get -> GitVersion.Configuration.EffectiveConfiguration!
GitVersion.VersionCalculation.NextVersion.Equals(GitVersion.VersionCalculation.NextVersion? other) -> bool
GitVersion.VersionCalculation.NextVersion.IncrementedVersion.get -> GitVersion.SemanticVersion!
GitVersion.VersionCalculation.NextVersion.NextVersion(GitVersion.SemanticVersion! incrementedVersion, GitVersion.VersionCalculation.BaseVersion! baseVersion, GitVersion.Configuration.EffectiveBranchConfiguration! configuration) -> void
GitVersion.VersionCalculation.NextVersion.NextVersion(GitVersion.SemanticVersion! incrementedVersion, GitVersion.VersionCalculation.BaseVersion! baseVersion, GitVersion.IBranch! branch, GitVersion.Configuration.EffectiveConfiguration! configuration) -> void
GitVersion.VersionCalculation.VersionCalculationModule
GitVersion.VersionCalculation.VersionCalculationModule.RegisterTypes(Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> void
GitVersion.VersionCalculation.VersionCalculationModule.VersionCalculationModule() -> void
Expand Down Expand Up @@ -808,11 +807,10 @@ readonly GitVersion.Agents.BuildAgentBase.Log -> GitVersion.Logging.ILog!
static GitVersion.BranchCommit.operator !=(GitVersion.BranchCommit left, GitVersion.BranchCommit right) -> bool
static GitVersion.BranchCommit.operator ==(GitVersion.BranchCommit left, GitVersion.BranchCommit right) -> bool
static GitVersion.Configuration.ConfigurationExtensions.FindGitDir(this string! path) -> (string! GitDirectory, string! WorkingTreeDirectory)?
static GitVersion.Configuration.ConfigurationExtensions.GetBranchConfiguration(this GitVersion.Configuration.IGitVersionConfiguration! configuration, GitVersion.IBranch! branch) -> GitVersion.Configuration.IBranchConfiguration!
static GitVersion.Configuration.ConfigurationExtensions.GetBranchConfiguration(this GitVersion.Configuration.IGitVersionConfiguration! configuration, GitVersion.ReferenceName! branchName) -> GitVersion.Configuration.IBranchConfiguration!
static GitVersion.Configuration.ConfigurationExtensions.GetBranchSpecificLabel(this GitVersion.Configuration.EffectiveConfiguration! configuration, GitVersion.ReferenceName! branchName, string? branchNameOverride) -> string?
static GitVersion.Configuration.ConfigurationExtensions.GetBranchSpecificLabel(this GitVersion.Configuration.EffectiveConfiguration! configuration, string? branchName, string? branchNameOverride) -> string?
static GitVersion.Configuration.ConfigurationExtensions.GetEffectiveConfiguration(this GitVersion.Configuration.IGitVersionConfiguration! configuration, GitVersion.IBranch! branch) -> GitVersion.Configuration.EffectiveConfiguration!
static GitVersion.Configuration.ConfigurationExtensions.GetEffectiveBranchConfiguration(this GitVersion.Configuration.IGitVersionConfiguration! configuration, GitVersion.IBranch! branch) -> GitVersion.Configuration.EffectiveBranchConfiguration!
static GitVersion.Configuration.ConfigurationExtensions.GetEffectiveConfiguration(this GitVersion.Configuration.IGitVersionConfiguration! configuration, GitVersion.ReferenceName! branchName) -> GitVersion.Configuration.EffectiveConfiguration!
static GitVersion.Configuration.ConfigurationExtensions.GetFallbackBranchConfiguration(this GitVersion.Configuration.IGitVersionConfiguration! configuration) -> GitVersion.Configuration.IBranchConfiguration!
static GitVersion.Configuration.ConfigurationExtensions.GetReleaseBranchConfiguration(this GitVersion.Configuration.IGitVersionConfiguration! configuration) -> System.Collections.Generic.List<System.Collections.Generic.KeyValuePair<string!, GitVersion.Configuration.IBranchConfiguration!>>!
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ private IEnumerable<EffectiveBranchConfiguration> GetEffectiveConfigurationsRecu
{
if (!traversedBranches.Add(branch)) yield break; // This should never happen!! But it is good to have a circuit breaker.

var branchConfiguration = configuration.GetBranchConfiguration(branch);
var branchConfiguration = configuration.GetBranchConfiguration(branch.Name);
if (childBranchConfiguration != null)
{
branchConfiguration = childBranchConfiguration.Inherit(branchConfiguration);
Expand Down Expand Up @@ -66,7 +66,7 @@ in GetEffectiveConfigurationsRecursive(sourceBranch, configuration, branchConfig
}
else
{
yield return new(branch, new EffectiveConfiguration(configuration, branchConfiguration));
yield return new(new(configuration, branchConfiguration), branch);
}
}
}
12 changes: 3 additions & 9 deletions src/GitVersion.Core/VersionCalculation/NextVersion.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,21 +9,15 @@ public class NextVersion : IComparable<NextVersion>, IEquatable<NextVersion>

public SemanticVersion IncrementedVersion { get; }

public IBranch Branch { get; }
public EffectiveBranchConfiguration BranchConfiguration { get; }

public EffectiveConfiguration Configuration { get; }
public EffectiveConfiguration Configuration => BranchConfiguration.Value;

public NextVersion(SemanticVersion incrementedVersion, BaseVersion baseVersion, EffectiveBranchConfiguration configuration)
: this(incrementedVersion, baseVersion, configuration.NotNull().Branch, configuration.NotNull().Value)
{
}

public NextVersion(SemanticVersion incrementedVersion, BaseVersion baseVersion, IBranch branch, EffectiveConfiguration configuration)
{
IncrementedVersion = incrementedVersion.NotNull();
BaseVersion = baseVersion.NotNull();
Configuration = configuration.NotNull();
Branch = branch.NotNull();
BranchConfiguration = configuration;
}

public int CompareTo(NextVersion? other) => IncrementedVersion.CompareTo(other?.IncrementedVersion);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -345,7 +345,7 @@ private static VersionField FindDefaultIncrementForBranch(GitVersionContext cont

private static VersionField FindDefaultIncrementForBranch(GitVersionContext context, IBranch branch)
{
var increment = context.Configuration.GetEffectiveConfiguration(branch).Increment;
var increment = context.Configuration.GetEffectiveConfiguration(branch.Name).Increment;
if (increment == IncrementStrategy.Inherit) increment = IncrementStrategy.Patch;
return increment.ToVersionField();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,9 @@ public virtual NextVersion FindVersion()

var nextVersion = CalculateNextVersion(Context.CurrentBranch, Context.Configuration);
var incrementedVersion = CalculateIncrementedVersion(nextVersion.Configuration.VersioningMode, nextVersion);
return new(incrementedVersion, nextVersion.BaseVersion, new(nextVersion.Branch, nextVersion.Configuration));

var effectiveBranchConfiguration = nextVersion.BranchConfiguration;
return effectiveBranchConfiguration.CreateNextVersion(nextVersion.BaseVersion, incrementedVersion);
}

private SemanticVersion CalculateIncrementedVersion(VersioningMode versioningMode, NextVersion nextVersion)
Expand Down Expand Up @@ -112,7 +114,8 @@ private NextVersion CalculateNextVersion(IBranch branch, IGitVersionConfiguratio

log.Info($"Base version used: {calculatedBase}");
log.Separator();
return new NextVersion(maxVersion.IncrementedVersion, calculatedBase, maxVersion.Branch, maxVersion.Configuration);
var effectiveBranchConfiguration = maxVersion.BranchConfiguration;
return effectiveBranchConfiguration.CreateNextVersion(calculatedBase, maxVersion.IncrementedVersion);
}

private static NextVersion CompareVersions(NextVersion versions1, NextVersion version2)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ protected SemanticVersion CalculateIncrementedVersion(NextVersion nextVersion)
////
// TODO: We need to consider somehow the IGitVersionConfiguration::Ignore property here!!
var semanticVersionWithTag = this.repositoryStore.GetTaggedSemanticVersionsOnBranch(
nextVersion.Branch, Context.Configuration.TagPrefix, Context.Configuration.SemanticVersionFormat
nextVersion.BranchConfiguration.Branch, Context.Configuration.TagPrefix, Context.Configuration.SemanticVersionFormat
).FirstOrDefault(element => Context.CurrentCommit is null || element.Tag.Commit.When <= Context.CurrentCommit.When);
//

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -64,9 +64,9 @@ private IEnumerable<BaseVersion> GetReleaseVersion(IBranch releaseBranch)
{
// Find the commit where the child branch was created.
var baseSource = this.repositoryStore.FindMergeBase(releaseBranch, Context.CurrentBranch);
var configuration = Context.Configuration.GetEffectiveConfiguration(releaseBranch);
var effectiveBranchConfiguration = Context.Configuration.GetEffectiveBranchConfiguration(releaseBranch);
return this.releaseVersionStrategy
.GetBaseVersions(new(releaseBranch, configuration))
.GetBaseVersions(effectiveBranchConfiguration)
.Select(b => new BaseVersion(b.Source, true, b.SemanticVersion, baseSource, b.BranchNameOverride));
}
}

0 comments on commit d19a11a

Please sign in to comment.