Skip to content

Commit b6eea77

Browse files
committed
minor refactoring in ConfigurationFileLocator
1 parent e531621 commit b6eea77

File tree

7 files changed

+84
-86
lines changed

7 files changed

+84
-86
lines changed

src/GitVersion.Configuration.Tests/Configuration/ConfigurationProviderTests.cs

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -363,31 +363,31 @@ public void ShouldNotOverrideAnythingWhenOverrideConfigIsEmpty()
363363
.WithNextVersion("1.2.3")
364364
.WithTagPrefix("custom-tag-prefix-from-yml")
365365
.Build();
366-
var overridenConfig = this.configurationProvider.ProvideForDirectory(this.repoPath);
367-
368-
overridenConfig.AssemblyVersioningScheme.ShouldBe(expectedConfig.AssemblyVersioningScheme);
369-
overridenConfig.AssemblyFileVersioningScheme.ShouldBe(expectedConfig.AssemblyFileVersioningScheme);
370-
overridenConfig.AssemblyInformationalFormat.ShouldBe(expectedConfig.AssemblyInformationalFormat);
371-
overridenConfig.AssemblyVersioningFormat.ShouldBe(expectedConfig.AssemblyVersioningFormat);
372-
overridenConfig.AssemblyFileVersioningFormat.ShouldBe(expectedConfig.AssemblyFileVersioningFormat);
373-
overridenConfig.TagPrefix.ShouldBe(expectedConfig.TagPrefix);
374-
overridenConfig.NextVersion.ShouldBe(expectedConfig.NextVersion);
375-
overridenConfig.MajorVersionBumpMessage.ShouldBe(expectedConfig.MajorVersionBumpMessage);
376-
overridenConfig.MinorVersionBumpMessage.ShouldBe(expectedConfig.MinorVersionBumpMessage);
377-
overridenConfig.PatchVersionBumpMessage.ShouldBe(expectedConfig.PatchVersionBumpMessage);
378-
overridenConfig.NoBumpMessage.ShouldBe(expectedConfig.NoBumpMessage);
379-
overridenConfig.TagPreReleaseWeight.ShouldBe(expectedConfig.TagPreReleaseWeight);
380-
overridenConfig.CommitDateFormat.ShouldBe(expectedConfig.CommitDateFormat);
381-
overridenConfig.MergeMessageFormats.ShouldBe(expectedConfig.MergeMessageFormats);
382-
overridenConfig.UpdateBuildNumber.ShouldBe(expectedConfig.UpdateBuildNumber);
383-
384-
overridenConfig.Ignore.ShouldBeEquivalentTo(expectedConfig.Ignore);
385-
386-
overridenConfig.Branches.Keys.ShouldBe(expectedConfig.Branches.Keys);
387-
388-
foreach (var branch in overridenConfig.Branches.Keys)
366+
var configuration = this.configurationProvider.ProvideForDirectory(this.repoPath);
367+
368+
configuration.AssemblyVersioningScheme.ShouldBe(expectedConfig.AssemblyVersioningScheme);
369+
configuration.AssemblyFileVersioningScheme.ShouldBe(expectedConfig.AssemblyFileVersioningScheme);
370+
configuration.AssemblyInformationalFormat.ShouldBe(expectedConfig.AssemblyInformationalFormat);
371+
configuration.AssemblyVersioningFormat.ShouldBe(expectedConfig.AssemblyVersioningFormat);
372+
configuration.AssemblyFileVersioningFormat.ShouldBe(expectedConfig.AssemblyFileVersioningFormat);
373+
configuration.TagPrefix.ShouldBe(expectedConfig.TagPrefix);
374+
configuration.NextVersion.ShouldBe(expectedConfig.NextVersion);
375+
configuration.MajorVersionBumpMessage.ShouldBe(expectedConfig.MajorVersionBumpMessage);
376+
configuration.MinorVersionBumpMessage.ShouldBe(expectedConfig.MinorVersionBumpMessage);
377+
configuration.PatchVersionBumpMessage.ShouldBe(expectedConfig.PatchVersionBumpMessage);
378+
configuration.NoBumpMessage.ShouldBe(expectedConfig.NoBumpMessage);
379+
configuration.TagPreReleaseWeight.ShouldBe(expectedConfig.TagPreReleaseWeight);
380+
configuration.CommitDateFormat.ShouldBe(expectedConfig.CommitDateFormat);
381+
configuration.MergeMessageFormats.ShouldBe(expectedConfig.MergeMessageFormats);
382+
configuration.UpdateBuildNumber.ShouldBe(expectedConfig.UpdateBuildNumber);
383+
384+
configuration.Ignore.ShouldBeEquivalentTo(expectedConfig.Ignore);
385+
386+
configuration.Branches.Keys.ShouldBe(expectedConfig.Branches.Keys);
387+
388+
foreach (var branch in configuration.Branches.Keys)
389389
{
390-
overridenConfig.Branches[branch].ShouldBeEquivalentTo(expectedConfig.Branches[branch]);
390+
configuration.Branches[branch].ShouldBeEquivalentTo(expectedConfig.Branches[branch]);
391391
}
392392
}
393393

src/GitVersion.Configuration/ConfigurationFileLocator.cs

Lines changed: 34 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1,74 +1,62 @@
11
using GitVersion.Extensions;
22
using GitVersion.Helpers;
3+
using GitVersion.Logging;
34
using Microsoft.Extensions.Options;
45

56
namespace GitVersion.Configuration;
67

7-
internal class ConfigurationFileLocator(IFileSystem fileSystem, IConfigurationSerializer configurationSerializer, IOptions<GitVersionOptions> options)
8+
internal class ConfigurationFileLocator(
9+
IFileSystem fileSystem,
10+
ILog log,
11+
IOptions<GitVersionOptions> options)
812
: IConfigurationFileLocator
913
{
1014
public const string DefaultFileName = "GitVersion.yml";
1115
public const string DefaultAlternativeFileName = "GitVersion.yaml";
1216

13-
private readonly string? configurationFile = options.Value.ConfigurationInfo.ConfigurationFile;
17+
private readonly IFileSystem fileSystem = fileSystem.NotNull();
18+
private readonly ILog log = log.NotNull();
19+
private readonly IOptions<GitVersionOptions> options = options.NotNull();
1420

15-
public bool TryGetConfigurationFile(string? workingDirectory, string? projectRootDirectory, out string? configFilePath)
16-
=>
17-
HasConfigurationFile(workingDirectory, out configFilePath)
18-
|| HasConfigurationFile(projectRootDirectory, out configFilePath);
21+
private string? ConfigurationFile => options.Value.ConfigurationInfo.ConfigurationFile;
1922

2023
public void Verify(string? workingDirectory, string? projectRootDirectory)
2124
{
22-
if (Path.IsPathRooted(this.configurationFile)) return;
25+
if (Path.IsPathRooted(this.ConfigurationFile)) return;
2326
if (PathHelper.Equal(workingDirectory, projectRootDirectory)) return;
2427
WarnAboutAmbiguousConfigFileSelection(workingDirectory, projectRootDirectory);
2528
}
2629

27-
public IGitVersionConfiguration ReadConfiguration(string? configFilePath)
30+
public string? GetConfigurationFile(string? directory)
2831
{
29-
if (configFilePath == null || !fileSystem.Exists(configFilePath)) return GitHubFlowConfigurationBuilder.New.Build();
30-
31-
var readAllText = fileSystem.ReadAllText(configFilePath);
32-
var configuration = configurationSerializer.ReadConfiguration(readAllText)
33-
?? GitHubFlowConfigurationBuilder.New.Build();
34-
return configuration;
35-
}
36-
37-
public IReadOnlyDictionary<object, object?>? ReadOverrideConfiguration(string? configFilePath)
38-
{
39-
if (configFilePath == null || !fileSystem.Exists(configFilePath)) return null;
40-
41-
var readAllText = fileSystem.ReadAllText(configFilePath);
42-
43-
return configurationSerializer.Deserialize<Dictionary<object, object?>>(readAllText);
44-
}
45-
46-
private bool HasConfigurationFile(string? workingDirectory, out string? path)
47-
{
48-
bool HasConfigurationFileAt(string fileName, out string? configFile)
32+
if (directory is null) return null;
33+
string?[] candidates = [this.ConfigurationFile, DefaultFileName, DefaultAlternativeFileName];
34+
var candidatePaths =
35+
from candidate in candidates
36+
where !candidate.IsNullOrWhiteSpace()
37+
select PathHelper.Combine(directory, candidate);
38+
39+
foreach (var candidatePath in candidatePaths)
4940
{
50-
configFile = null;
51-
if (!fileSystem.Exists(PathHelper.Combine(workingDirectory, fileName))) return false;
52-
53-
configFile = PathHelper.Combine(workingDirectory, fileName);
54-
return true;
41+
this.log.Debug($"Trying to find configuration file at '{candidatePath}'");
42+
if (fileSystem.Exists(candidatePath))
43+
{
44+
this.log.Info($"Found configuration file at '{candidatePath}'");
45+
return candidatePath;
46+
}
47+
this.log.Debug($"Configuration file not found at '{candidatePath}'");
5548
}
5649

57-
path = null;
58-
if (workingDirectory is null) return false;
59-
return !this.configurationFile.IsNullOrWhiteSpace()
60-
? HasConfigurationFileAt(this.configurationFile, out path)
61-
: HasConfigurationFileAt(DefaultFileName, out path)
62-
|| HasConfigurationFileAt(DefaultAlternativeFileName, out path);
50+
return null;
6351
}
6452

6553
private void WarnAboutAmbiguousConfigFileSelection(string? workingDirectory, string? projectRootDirectory)
6654
{
67-
TryGetConfigurationFile(workingDirectory, null, out var workingConfigFile);
68-
TryGetConfigurationFile(null, projectRootDirectory, out var projectRootConfigFile);
55+
var workingConfigFile = GetConfigurationFile(workingDirectory);
56+
var projectRootConfigFile = GetConfigurationFile(projectRootDirectory);
6957

70-
var hasConfigInWorkingDirectory = workingConfigFile != null && fileSystem.Exists(workingConfigFile);
71-
var hasConfigInProjectRootDirectory = projectRootConfigFile != null && fileSystem.Exists(projectRootConfigFile);
58+
var hasConfigInWorkingDirectory = workingConfigFile != null;
59+
var hasConfigInProjectRootDirectory = projectRootConfigFile != null;
7260

7361
if (hasConfigInProjectRootDirectory && hasConfigInWorkingDirectory)
7462
{
@@ -77,10 +65,10 @@ private void WarnAboutAmbiguousConfigFileSelection(string? workingDirectory, str
7765

7866
if (!hasConfigInProjectRootDirectory && !hasConfigInWorkingDirectory)
7967
{
80-
if (this.configurationFile != DefaultFileName && this.configurationFile != DefaultAlternativeFileName)
68+
if (this.ConfigurationFile is not (DefaultFileName or DefaultAlternativeFileName))
8169
{
82-
workingConfigFile = PathHelper.Combine(workingDirectory, this.configurationFile);
83-
projectRootConfigFile = PathHelper.Combine(projectRootDirectory, this.configurationFile);
70+
workingConfigFile = PathHelper.Combine(workingDirectory, this.ConfigurationFile);
71+
projectRootConfigFile = PathHelper.Combine(projectRootDirectory, this.ConfigurationFile);
8472
throw new WarningException($"The configuration file was not found at '{workingConfigFile}' or '{projectRootConfigFile}'");
8573
}
8674
}

src/GitVersion.Configuration/ConfigurationProvider.cs

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,14 @@ namespace GitVersion.Configuration;
77

88
internal class ConfigurationProvider(
99
IConfigurationFileLocator configFileLocator,
10+
IFileSystem fileSystem,
11+
IConfigurationSerializer configurationSerializer,
1012
IOptions<GitVersionOptions> options)
1113
: IConfigurationProvider
1214
{
1315
private readonly IConfigurationFileLocator configFileLocator = configFileLocator.NotNull();
16+
private readonly IFileSystem fileSystem = fileSystem.NotNull();
17+
private readonly IConfigurationSerializer configurationSerializer = configurationSerializer.NotNull();
1418
private readonly IOptions<GitVersionOptions> options = options.NotNull();
1519

1620
public IGitVersionConfiguration Provide(IReadOnlyDictionary<object, object?>? overrideConfiguration)
@@ -19,22 +23,25 @@ public IGitVersionConfiguration Provide(IReadOnlyDictionary<object, object?>? ov
1923
var workingDirectory = gitVersionOptions.WorkingDirectory;
2024
var projectRootDirectory = workingDirectory.FindGitDir()?.WorkingTreeDirectory;
2125

22-
return this.configFileLocator.TryGetConfigurationFile(workingDirectory, projectRootDirectory, out var configFilePath)
23-
? ProvideConfiguration(configFilePath, overrideConfiguration)
26+
var configurationFile = this.configFileLocator.GetConfigurationFile(workingDirectory)
27+
?? this.configFileLocator.GetConfigurationFile(projectRootDirectory);
28+
29+
return configurationFile is not null
30+
? ProvideConfiguration(configurationFile, overrideConfiguration)
2431
: ProvideForDirectory(null, overrideConfiguration);
2532
}
2633

2734
internal IGitVersionConfiguration ProvideForDirectory(string? workingDirectory,
28-
IReadOnlyDictionary<object, object?>? overrideConfiguration = null)
35+
IReadOnlyDictionary<object, object?>? overrideConfiguration = null)
2936
{
30-
this.configFileLocator.TryGetConfigurationFile(workingDirectory, null, out var configFilePath);
37+
var configFilePath = this.configFileLocator.GetConfigurationFile(workingDirectory);
3138
return ProvideConfiguration(configFilePath, overrideConfiguration);
3239
}
3340

3441
private IGitVersionConfiguration ProvideConfiguration(string? configFile,
35-
IReadOnlyDictionary<object, object?>? overrideConfiguration = null)
42+
IReadOnlyDictionary<object, object?>? overrideConfiguration = null)
3643
{
37-
var overrideConfigurationFromFile = this.configFileLocator.ReadOverrideConfiguration(configFile);
44+
var overrideConfigurationFromFile = ReadOverrideConfiguration(configFile);
3845

3946
var workflow = GetWorkflow(overrideConfiguration, overrideConfigurationFromFile);
4047

@@ -45,7 +52,7 @@ private IGitVersionConfiguration ProvideConfiguration(string? configFile,
4552
var overrideConfigurationFromWorkflow = WorkflowManager.GetOverrideConfiguration(workflow);
4653
foreach (var item in new[] { overrideConfigurationFromWorkflow, overrideConfigurationFromFile, overrideConfiguration })
4754
{
48-
if (item != null) configurationBuilder.AddOverride(item);
55+
if (item is not null) configurationBuilder.AddOverride(item);
4956
}
5057

5158
try
@@ -62,6 +69,13 @@ private IGitVersionConfiguration ProvideConfiguration(string? configFile,
6269
}
6370
}
6471

72+
private IReadOnlyDictionary<object, object?>? ReadOverrideConfiguration(string? configFilePath)
73+
{
74+
if (configFilePath == null || !fileSystem.Exists(configFilePath)) return null;
75+
var content = fileSystem.ReadAllText(configFilePath);
76+
return configurationSerializer.Deserialize<Dictionary<object, object?>>(content);
77+
}
78+
6579
private static string? GetWorkflow(IReadOnlyDictionary<object, object?>? overrideConfiguration, IReadOnlyDictionary<object, object?>? overrideConfigurationFromFile)
6680
{
6781
string? workflow = null;

src/GitVersion.Configuration/Workflows/WorkflowManager.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ private static string DetermineResourceNameTemplate()
1414
return $"{resourceNamePrefix}.{{0}}.yml";
1515
}
1616

17-
public static Dictionary<object, object?>? GetOverrideConfiguration(string? workflow)
17+
public static IReadOnlyDictionary<object, object?>? GetOverrideConfiguration(string? workflow)
1818
{
1919
if (string.IsNullOrEmpty(workflow)) return null;
2020

src/GitVersion.Core/Configuration/IConfigurationFileLocator.cs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@ namespace GitVersion.Configuration;
22

33
public interface IConfigurationFileLocator
44
{
5-
bool TryGetConfigurationFile(string? workingDirectory, string? projectRootDirectory, out string? configFilePath);
6-
IGitVersionConfiguration ReadConfiguration(string? configFilePath);
7-
IReadOnlyDictionary<object, object?>? ReadOverrideConfiguration(string? configFilePath);
85
void Verify(string? workingDirectory, string? projectRootDirectory);
6+
string? GetConfigurationFile(string? directory);
97
}

src/GitVersion.Core/PublicAPI.Unshipped.txt

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -109,9 +109,7 @@ GitVersion.Configuration.IBranchConfiguration.TrackMergeMessage.get -> bool?
109109
GitVersion.Configuration.IBranchConfiguration.TrackMergeTarget.get -> bool?
110110
GitVersion.Configuration.IBranchConfiguration.TracksReleaseBranches.get -> bool?
111111
GitVersion.Configuration.IConfigurationFileLocator
112-
GitVersion.Configuration.IConfigurationFileLocator.ReadConfiguration(string? configFilePath) -> GitVersion.Configuration.IGitVersionConfiguration!
113-
GitVersion.Configuration.IConfigurationFileLocator.ReadOverrideConfiguration(string? configFilePath) -> System.Collections.Generic.IReadOnlyDictionary<object!, object?>?
114-
GitVersion.Configuration.IConfigurationFileLocator.TryGetConfigurationFile(string? workingDirectory, string? projectRootDirectory, out string? configFilePath) -> bool
112+
GitVersion.Configuration.IConfigurationFileLocator.GetConfigurationFile(string? directory) -> string?
115113
GitVersion.Configuration.IConfigurationFileLocator.Verify(string? workingDirectory, string? projectRootDirectory) -> void
116114
GitVersion.Configuration.IConfigurationProvider
117115
GitVersion.Configuration.IConfigurationProvider.Provide(System.Collections.Generic.IReadOnlyDictionary<object!, object?>? overrideConfiguration = null) -> GitVersion.Configuration.IGitVersionConfiguration!

src/GitVersion.Core/VersionCalculation/Caching/GitVersionCacheKeyFactory.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -170,8 +170,8 @@ private string GetConfigFileHash()
170170
var workingDirectory = this.options.Value.WorkingDirectory;
171171
var projectRootDirectory = this.repositoryInfo.ProjectRootDirectory;
172172

173-
if (!this.configFileLocator.TryGetConfigurationFile(workingDirectory, projectRootDirectory, out var configFilePath))
174-
return string.Empty;
173+
var configFilePath = this.configFileLocator.GetConfigurationFile(workingDirectory)
174+
?? this.configFileLocator.GetConfigurationFile(projectRootDirectory);
175175
if (configFilePath == null) return string.Empty;
176176
if (!this.fileSystem.Exists(configFilePath)) return string.Empty;
177177

0 commit comments

Comments
 (0)