diff --git a/src/GitVersion.Configuration.Tests/Configuration/ConfigurationFileLocatorTests.cs b/src/GitVersion.Configuration.Tests/Configuration/ConfigurationFileLocatorTests.cs index 1074bc07d7..89393ec5cb 100644 --- a/src/GitVersion.Configuration.Tests/Configuration/ConfigurationFileLocatorTests.cs +++ b/src/GitVersion.Configuration.Tests/Configuration/ConfigurationFileLocatorTests.cs @@ -154,19 +154,39 @@ public void DoNotThrowWhenWorkingAndRepoPathsAreSame_WithDifferentCasing() } [Test] - public void DoNotThrowWhenFileNameAreSame_WithDifferentCasing() + public void ReturnConfigurationFilePathIfCustomConfigurationIsSet() { this.workingPath = this.repoPath; + string configurationFilePath = Path.Combine(this.workingPath, "Configuration", "CustomConfig.yaml"); - this.gitVersionOptions = new() { ConfigurationInfo = { ConfigurationFile = "MyConfig.yaml" } }; + this.gitVersionOptions = new() { ConfigurationInfo = { ConfigurationFile = configurationFilePath } }; + + var serviceProvider = GetServiceProvider(this.gitVersionOptions); + this.fileSystem = serviceProvider.GetRequiredService(); + + using var _ = this.fileSystem.SetupConfigFile( + path: Path.Combine(this.workingPath, "Configuration"), fileName: "CustomConfig.yaml" + ); + this.configFileLocator = serviceProvider.GetRequiredService(); + + var config = this.configFileLocator.GetConfigurationFile(this.workingPath); + config.ShouldBe(configurationFilePath); + } + + [TestCase(null)] + [TestCase("")] + [TestCase(" ")] + [TestCase("Configuration/CustomConfig2.yaml")] + public void ReturnConfigurationFilePathIfCustomConfigurationIsSet_InvalidConfigurationFilePaths(string? configFile) + { + this.workingPath = this.repoPath; + + this.gitVersionOptions = new() { ConfigurationInfo = { ConfigurationFile = configFile } }; var sp = GetServiceProvider(this.gitVersionOptions); this.configFileLocator = sp.GetRequiredService(); - this.fileSystem = sp.GetRequiredService(); - - using var _ = this.fileSystem.SetupConfigFile(path: this.workingPath, fileName: ConfigFile.ToLower()); - var config = Should.NotThrow(() => this.configFileLocator.GetConfigurationFile(this.workingPath)); - config.ShouldNotBe(null); + var config = this.configFileLocator.GetConfigurationFile(this.workingPath); + config.ShouldBe(null); } [Test] diff --git a/src/GitVersion.Configuration/ConfigurationFileLocator.cs b/src/GitVersion.Configuration/ConfigurationFileLocator.cs index c2a3ecbafa..1cdddbb560 100644 --- a/src/GitVersion.Configuration/ConfigurationFileLocator.cs +++ b/src/GitVersion.Configuration/ConfigurationFileLocator.cs @@ -38,32 +38,48 @@ public void Verify(string? workingDirectory, string? projectRootDirectory) WarnAboutAmbiguousConfigFileSelection(workingDirectory, projectRootDirectory); } - public string? GetConfigurationFile(string? directory) + public string? GetConfigurationFile(string? directoryPath) { - if (directory is null) return null; + string? customConfigurationFile = GetCustomConfigurationFilePathIfEligable(directoryPath); + if (!string.IsNullOrWhiteSpace(customConfigurationFile)) + { + return customConfigurationFile; + } - string[] candidates = !string.IsNullOrWhiteSpace(this.ConfigurationFile) - ? [this.ConfigurationFile, .. this.SupportedConfigFileNames] - : this.SupportedConfigFileNames; + if (string.IsNullOrWhiteSpace(directoryPath) || !fileSystem.Directory.Exists(directoryPath)) + { + return null; + } - foreach (var fileName in candidates) + string[] files = fileSystem.Directory.GetFiles(directoryPath); + foreach (var fileName in this.SupportedConfigFileNames) { - this.log.Debug($"Trying to find configuration file {fileName} at '{directory}'"); - if (directory != null && fileSystem.Directory.Exists(directory)) + this.log.Debug($"Trying to find configuration file {fileName} at '{directoryPath}'"); + string? matchingFile = files.FirstOrDefault(file => string.Equals(PathHelper.GetFileName(file), fileName, StringComparison.OrdinalIgnoreCase)); + if (matchingFile != null) { - var files = fileSystem.Directory.GetFiles(directory); + this.log.Info($"Found configuration file at '{matchingFile}'"); + return matchingFile; + } + } - var matchingFile = files.FirstOrDefault(file => - string.Equals(fileSystem.Path.GetFileName(file), fileName, StringComparison.OrdinalIgnoreCase)); + return null; + } - if (matchingFile != null) - { - this.log.Info($"Found configuration file at '{matchingFile}'"); - return matchingFile; - } + private string? GetCustomConfigurationFilePathIfEligable(string? directoryPath) + { + if (!string.IsNullOrWhiteSpace(this.ConfigurationFile)) + { + string configurationFilePath = this.ConfigurationFile; + if (!string.IsNullOrWhiteSpace(directoryPath)) + { + configurationFilePath = Path.Combine(directoryPath, this.ConfigurationFile); } - this.log.Debug($"Configuration file {fileName} not found at '{directory}'"); + if (fileSystem.File.Exists(configurationFilePath)) + { + return configurationFilePath; + } } return null; diff --git a/src/GitVersion.Core/Configuration/IConfigurationFileLocator.cs b/src/GitVersion.Core/Configuration/IConfigurationFileLocator.cs index 2ab64908cd..24ff54d935 100644 --- a/src/GitVersion.Core/Configuration/IConfigurationFileLocator.cs +++ b/src/GitVersion.Core/Configuration/IConfigurationFileLocator.cs @@ -3,5 +3,5 @@ namespace GitVersion.Configuration; public interface IConfigurationFileLocator { void Verify(string? workingDirectory, string? projectRootDirectory); - string? GetConfigurationFile(string? directory); + string? GetConfigurationFile(string? directoryPath); } diff --git a/src/GitVersion.Core/PublicAPI.Shipped.txt b/src/GitVersion.Core/PublicAPI.Shipped.txt index a2138c8c06..6b0a485718 100644 --- a/src/GitVersion.Core/PublicAPI.Shipped.txt +++ b/src/GitVersion.Core/PublicAPI.Shipped.txt @@ -113,7 +113,7 @@ GitVersion.Configuration.IConfigurationBuilder GitVersion.Configuration.IConfigurationBuilder.AddOverride(System.Collections.Generic.IReadOnlyDictionary! value) -> void GitVersion.Configuration.IConfigurationBuilder.Build() -> GitVersion.Configuration.IGitVersionConfiguration! GitVersion.Configuration.IConfigurationFileLocator -GitVersion.Configuration.IConfigurationFileLocator.GetConfigurationFile(string? directory) -> string? +GitVersion.Configuration.IConfigurationFileLocator.GetConfigurationFile(string? directoryPath) -> string? GitVersion.Configuration.IConfigurationFileLocator.Verify(string? workingDirectory, string? projectRootDirectory) -> void GitVersion.Configuration.IConfigurationProvider GitVersion.Configuration.IConfigurationProvider.Provide(System.Collections.Generic.IReadOnlyDictionary? overrideConfiguration = null) -> GitVersion.Configuration.IGitVersionConfiguration!