Skip to content

Support for dotted versions of the GitVersion config files by default #4432

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 5 commits into from
Feb 26, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions docs/input/docs/usage/cli/arguments.md
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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`.
Expand Down Expand Up @@ -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'

Expand Down
2 changes: 1 addition & 1 deletion src/GitVersion.App/OverrideConfigurationOptionParser.cs
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ internal class OverrideConfigurationOptionParser
/// </summary>
/// <returns></returns>
/// <remarks>
/// Lookup keys are created from <see cref="System.Text.Json.Serialization.JsonPropertyNameAttribute"/> to match 'GitVersion.yml' or 'GitVersion.yaml' file
/// Lookup keys are created from <see cref="System.Text.Json.Serialization.JsonPropertyNameAttribute"/> to match 'GitVersion.yml', 'GitVersion.yaml', '.GitVersion.yml' or '.GitVersion.yaml' file
/// options as close as possible.
/// </remarks>
private static ILookup<string?, PropertyInfo> GetSupportedProperties() => typeof(GitVersionConfiguration).GetProperties(BindingFlags.Public | BindingFlags.Instance)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -52,13 +64,27 @@ 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);

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));
}
Expand Down
8 changes: 6 additions & 2 deletions src/GitVersion.Configuration/ConfigurationFileLocator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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<string> SupportedConfigFileNames = [DefaultFileName, DefaultAlternativeFileName, DefaultFileNameDotted, DefaultAlternativeFileNameDotted];

private readonly IFileSystem fileSystem = fileSystem.NotNull();
private readonly ILog log = log.NotNull();
Expand All @@ -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()
Expand Down Expand Up @@ -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);
Expand Down
2 changes: 2 additions & 0 deletions src/GitVersion.Core.Tests/Core/GitVersionExecutorTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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 = """
Expand Down