forked from GitTools/GitVersion
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathConfigurationFileLocator.cs
85 lines (68 loc) · 3.83 KB
/
ConfigurationFileLocator.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
using GitVersion.Extensions;
using GitVersion.Helpers;
using Microsoft.Extensions.Options;
namespace GitVersion.Configuration;
internal class ConfigurationFileLocator(IFileSystem fileSystem, IOptions<GitVersionOptions> options)
: IConfigurationFileLocator
{
public const string DefaultFileName = "GitVersion.yml";
public const string DefaultAlternativeFileName = "GitVersion.yaml";
private readonly string? configurationFile = options.Value.ConfigurationInfo.ConfigurationFile;
public bool TryGetConfigurationFile(string? workingDirectory, string? projectRootDirectory, out string? configFilePath)
=>
HasConfigurationFile(workingDirectory, out configFilePath)
|| HasConfigurationFile(projectRootDirectory, out configFilePath);
public void Verify(string? workingDirectory, string? projectRootDirectory)
{
if (!Path.IsPathRooted(this.configurationFile) && !fileSystem.PathsEqual(workingDirectory, projectRootDirectory))
WarnAboutAmbiguousConfigFileSelection(workingDirectory, projectRootDirectory);
}
public IGitVersionConfiguration ReadConfiguration(string? configFilePath)
{
if (configFilePath == null || !fileSystem.Exists(configFilePath)) return new GitVersionConfiguration();
var readAllText = fileSystem.ReadAllText(configFilePath);
return ConfigurationSerializer.Read(new StringReader(readAllText));
}
public IReadOnlyDictionary<object, object?>? ReadOverrideConfiguration(string? configFilePath)
{
if (configFilePath == null || !fileSystem.Exists(configFilePath)) return null;
var readAllText = fileSystem.ReadAllText(configFilePath);
return ConfigurationSerializer.Deserialize<Dictionary<object, object?>>(readAllText);
}
private bool HasConfigurationFile(string? workingDirectory, out string? path)
{
bool HasConfigurationFileAt(string fileName, out string? configFile)
{
configFile = null;
if (!fileSystem.Exists(PathHelper.Combine(workingDirectory, fileName))) return false;
configFile = PathHelper.Combine(workingDirectory, fileName);
return true;
}
path = null;
if (workingDirectory is null) return false;
return !this.configurationFile.IsNullOrWhiteSpace()
? HasConfigurationFileAt(this.configurationFile, out path)
: HasConfigurationFileAt(DefaultFileName, out path)
|| HasConfigurationFileAt(DefaultAlternativeFileName, out path);
}
private void WarnAboutAmbiguousConfigFileSelection(string? workingDirectory, string? projectRootDirectory)
{
TryGetConfigurationFile(workingDirectory, null, out var workingConfigFile);
TryGetConfigurationFile(null, projectRootDirectory, out var projectRootConfigFile);
var hasConfigInWorkingDirectory = workingConfigFile != null && fileSystem.Exists(workingConfigFile);
var hasConfigInProjectRootDirectory = projectRootConfigFile != null && fileSystem.Exists(projectRootConfigFile);
if (hasConfigInProjectRootDirectory && hasConfigInWorkingDirectory)
{
throw new WarningException($"Ambiguous configuration file selection from '{workingConfigFile}' and '{projectRootConfigFile}'");
}
if (!hasConfigInProjectRootDirectory && !hasConfigInWorkingDirectory)
{
if (this.configurationFile != DefaultFileName && this.configurationFile != DefaultAlternativeFileName)
{
workingConfigFile = PathHelper.Combine(workingDirectory, this.configurationFile);
projectRootConfigFile = PathHelper.Combine(projectRootDirectory, this.configurationFile);
throw new WarningException($"The configuration file was not found at '{workingConfigFile}' or '{projectRootConfigFile}'");
}
}
}
}