diff --git a/docs/input/docs/usage/cli/arguments.md b/docs/input/docs/usage/cli/arguments.md index c47e115ba7..01d773c752 100644 --- a/docs/input/docs/usage/cli/arguments.md +++ b/docs/input/docs/usage/cli/arguments.md @@ -41,9 +41,9 @@ GitVersion [path] E.g. /output json /format {SemVer} - will output `1.2.3+beta.4` /output json /format {Major}.{Minor} - will output `1.2` /l Path to logfile. - /config Path to config file (defaults to GitVersion.yml or GitVersion.yaml) + /config Path to config file (defaults to GitVersion.yml, GitVersion.yaml, .GitVersion.yml or .GitVersion.yaml) /showconfig Outputs the effective GitVersion config (defaults + custom - from GitVersion.yml or GitVersion.yaml) in yaml format + from GitVersion.yml, GitVersion.yaml, .GitVersion.yml or .GitVersion.yaml) in yaml format /overrideconfig Overrides GitVersion config values inline (semicolon- separated key value pairs e.g. /overrideconfig tag-prefix=Foo) @@ -97,7 +97,7 @@ GitVersion [path] ## Override config -`/overrideconfig [key=value]` will override appropriate `key` from 'GitVersion.yml' or 'GitVersion.yaml'. +`/overrideconfig [key=value]` will override appropriate `key` from 'GitVersion.yml', 'GitVersion.yaml', '.GitVersion.yml' or '.GitVersion.yaml'. To specify multiple options add multiple `/overrideconfig [key=value]` entries: `/overrideconfig key1=value1 /overrideconfig key2=value2`. @@ -129,7 +129,7 @@ Following options are supported: Read more about [Configuration](/docs/reference/configuration). -Using `override-config` on the command line will not change the contents of the config file `GitVersion.yml` or `GitVersion.yaml`. +Using `override-config` on the command line will not change the contents of the config file `GitVersion.yml`, `GitVersion.yaml`, `.GitVersion.yml` or `.GitVersion.yaml`. ### Example: How to override configuration option 'tag-prefix' to use prefix 'custom' diff --git a/src/GitVersion.App/OverrideConfigurationOptionParser.cs b/src/GitVersion.App/OverrideConfigurationOptionParser.cs index 1d4d6fa985..f3e886ddcf 100644 --- a/src/GitVersion.App/OverrideConfigurationOptionParser.cs +++ b/src/GitVersion.App/OverrideConfigurationOptionParser.cs @@ -18,7 +18,7 @@ internal class OverrideConfigurationOptionParser /// /// /// - /// Lookup keys are created from to match 'GitVersion.yml' or 'GitVersion.yaml' file + /// Lookup keys are created from to match 'GitVersion.yml', 'GitVersion.yaml', '.GitVersion.yml' or '.GitVersion.yaml' file /// options as close as possible. /// private static ILookup GetSupportedProperties() => typeof(GitVersionConfiguration).GetProperties(BindingFlags.Public | BindingFlags.Instance) diff --git a/src/GitVersion.Configuration.Tests/Configuration/ConfigurationFileLocatorTests.cs b/src/GitVersion.Configuration.Tests/Configuration/ConfigurationFileLocatorTests.cs index 48c43afa15..e89ac22636 100644 --- a/src/GitVersion.Configuration.Tests/Configuration/ConfigurationFileLocatorTests.cs +++ b/src/GitVersion.Configuration.Tests/Configuration/ConfigurationFileLocatorTests.cs @@ -37,8 +37,20 @@ public void Setup() [TestCase(ConfigurationFileLocator.DefaultFileName, ConfigurationFileLocator.DefaultFileName)] [TestCase(ConfigurationFileLocator.DefaultFileName, ConfigurationFileLocator.DefaultAlternativeFileName)] + [TestCase(ConfigurationFileLocator.DefaultFileName, ConfigurationFileLocator.DefaultFileNameDotted)] + [TestCase(ConfigurationFileLocator.DefaultFileName, ConfigurationFileLocator.DefaultAlternativeFileNameDotted)] [TestCase(ConfigurationFileLocator.DefaultAlternativeFileName, ConfigurationFileLocator.DefaultFileName)] [TestCase(ConfigurationFileLocator.DefaultAlternativeFileName, ConfigurationFileLocator.DefaultAlternativeFileName)] + [TestCase(ConfigurationFileLocator.DefaultAlternativeFileName, ConfigurationFileLocator.DefaultFileNameDotted)] + [TestCase(ConfigurationFileLocator.DefaultAlternativeFileName, ConfigurationFileLocator.DefaultAlternativeFileNameDotted)] + [TestCase(ConfigurationFileLocator.DefaultFileNameDotted, ConfigurationFileLocator.DefaultFileName)] + [TestCase(ConfigurationFileLocator.DefaultFileNameDotted, ConfigurationFileLocator.DefaultAlternativeFileName)] + [TestCase(ConfigurationFileLocator.DefaultFileNameDotted, ConfigurationFileLocator.DefaultFileNameDotted)] + [TestCase(ConfigurationFileLocator.DefaultFileNameDotted, ConfigurationFileLocator.DefaultAlternativeFileNameDotted)] + [TestCase(ConfigurationFileLocator.DefaultAlternativeFileNameDotted, ConfigurationFileLocator.DefaultFileName)] + [TestCase(ConfigurationFileLocator.DefaultAlternativeFileNameDotted, ConfigurationFileLocator.DefaultAlternativeFileName)] + [TestCase(ConfigurationFileLocator.DefaultAlternativeFileNameDotted, ConfigurationFileLocator.DefaultFileNameDotted)] + [TestCase(ConfigurationFileLocator.DefaultAlternativeFileNameDotted, ConfigurationFileLocator.DefaultAlternativeFileNameDotted)] public void ThrowsExceptionOnAmbiguousConfigFileLocation(string repoConfigFile, string workingConfigFile) { using var repositoryConfigFilePath = this.fileSystem.SetupConfigFile(path: this.repoPath, fileName: repoConfigFile); @@ -52,6 +64,8 @@ public void ThrowsExceptionOnAmbiguousConfigFileLocation(string repoConfigFile, [TestCase(ConfigurationFileLocator.DefaultFileName)] [TestCase(ConfigurationFileLocator.DefaultAlternativeFileName)] + [TestCase(ConfigurationFileLocator.DefaultFileNameDotted)] + [TestCase(ConfigurationFileLocator.DefaultAlternativeFileNameDotted)] public void NoWarnOnGitVersionYmlFile(string configurationFile) { using var _ = this.fileSystem.SetupConfigFile(path: this.repoPath, fileName: configurationFile); @@ -59,6 +73,18 @@ public void NoWarnOnGitVersionYmlFile(string configurationFile) Should.NotThrow(() => this.configurationProvider.ProvideForDirectory(this.repoPath)); } + [TestCase(ConfigurationFileLocator.DefaultFileName)] + [TestCase(ConfigurationFileLocator.DefaultAlternativeFileName)] + [TestCase(ConfigurationFileLocator.DefaultFileNameDotted)] + [TestCase(ConfigurationFileLocator.DefaultAlternativeFileNameDotted)] + public void NoWarnOnLowercasedGitVersionYmlFile(string configurationFile) + { + var lowercasedConfigurationFile = configurationFile.ToLower(); + using var _ = this.fileSystem.SetupConfigFile(path: this.repoPath, fileName: lowercasedConfigurationFile); + + Should.NotThrow(() => this.configurationProvider.ProvideForDirectory(this.repoPath)); + } + [Test] public void NoWarnOnNoGitVersionYmlFile() => Should.NotThrow(() => this.configurationProvider.ProvideForDirectory(this.repoPath)); } diff --git a/src/GitVersion.Configuration/ConfigurationFileLocator.cs b/src/GitVersion.Configuration/ConfigurationFileLocator.cs index 6d23ac35c5..0354d9a0c9 100644 --- a/src/GitVersion.Configuration/ConfigurationFileLocator.cs +++ b/src/GitVersion.Configuration/ConfigurationFileLocator.cs @@ -13,6 +13,9 @@ internal class ConfigurationFileLocator( { public const string DefaultFileName = "GitVersion.yml"; public const string DefaultAlternativeFileName = "GitVersion.yaml"; + public const string DefaultFileNameDotted = $".{DefaultFileName}"; + public const string DefaultAlternativeFileNameDotted = $".{DefaultAlternativeFileName}"; + public List SupportedConfigFileNames = [DefaultFileName, DefaultAlternativeFileName, DefaultFileNameDotted, DefaultAlternativeFileNameDotted]; private readonly IFileSystem fileSystem = fileSystem.NotNull(); private readonly ILog log = log.NotNull(); @@ -30,7 +33,8 @@ public void Verify(string? workingDirectory, string? projectRootDirectory) public string? GetConfigurationFile(string? directory) { if (directory is null) return null; - string?[] candidates = [this.ConfigurationFile, DefaultFileName, DefaultAlternativeFileName]; + + string?[] candidates = [this.ConfigurationFile, .. SupportedConfigFileNames]; var candidatePaths = from candidate in candidates where !candidate.IsNullOrWhiteSpace() @@ -65,7 +69,7 @@ private void WarnAboutAmbiguousConfigFileSelection(string? workingDirectory, str if (!hasConfigInProjectRootDirectory && !hasConfigInWorkingDirectory) { - if (this.ConfigurationFile is not (DefaultFileName or DefaultAlternativeFileName)) + if (!SupportedConfigFileNames.Any(entry => entry.Equals(this.ConfigurationFile, StringComparison.OrdinalIgnoreCase))) { workingConfigFile = PathHelper.Combine(workingDirectory, this.ConfigurationFile); projectRootConfigFile = PathHelper.Combine(projectRootDirectory, this.ConfigurationFile); diff --git a/src/GitVersion.Core.Tests/Core/GitVersionExecutorTests.cs b/src/GitVersion.Core.Tests/Core/GitVersionExecutorTests.cs index 2fea817d8f..f2dac1d3f8 100644 --- a/src/GitVersion.Core.Tests/Core/GitVersionExecutorTests.cs +++ b/src/GitVersion.Core.Tests/Core/GitVersionExecutorTests.cs @@ -243,6 +243,8 @@ public void CacheFileIsMissing() [TestCase(ConfigurationFileLocator.DefaultFileName)] [TestCase(ConfigurationFileLocator.DefaultAlternativeFileName)] + [TestCase(ConfigurationFileLocator.DefaultFileNameDotted)] + [TestCase(ConfigurationFileLocator.DefaultAlternativeFileNameDotted)] public void ConfigChangeInvalidatesCache(string configFileName) { const string versionCacheFileContent = """