6
6
using System . Text . RegularExpressions ;
7
7
using Elastic . Documentation . Configuration . Assembler ;
8
8
using Microsoft . Extensions . DependencyInjection ;
9
- using NetEscapades . EnumGenerators ;
9
+ using Microsoft . Extensions . Logging ;
10
10
11
11
namespace Elastic . Documentation . Configuration ;
12
12
13
- [ EnumExtensions ]
14
- public enum ConfigurationSource
15
- {
16
- Local ,
17
- Checkout ,
18
- Embedded
19
- }
20
-
21
13
public partial class ConfigurationFileProvider
22
14
{
23
15
private readonly IFileSystem _fileSystem ;
24
16
private readonly string _assemblyName ;
17
+ private readonly ILogger < ConfigurationFileProvider > _logger ;
25
18
26
- public ConfigurationSource ConfigurationSource { get ; private set ; } = ConfigurationSource . Embedded ;
19
+ public ConfigurationSource ConfigurationSource { get ; }
27
20
public string ? GitReference { get ; }
28
21
29
- public ConfigurationFileProvider ( IFileSystem fileSystem , bool skipPrivateRepositories = false )
22
+ public ConfigurationFileProvider (
23
+ ILoggerFactory logFactory ,
24
+ IFileSystem fileSystem ,
25
+ bool skipPrivateRepositories = false ,
26
+ ConfigurationSource ? configurationSource = null
27
+ )
30
28
{
29
+ _logger = logFactory . CreateLogger < ConfigurationFileProvider > ( ) ;
31
30
_fileSystem = fileSystem ;
32
31
_assemblyName = typeof ( ConfigurationFileProvider ) . Assembly . GetName ( ) . Name ! ;
33
32
SkipPrivateRepositories = skipPrivateRepositories ;
34
33
TemporaryDirectory = fileSystem . Directory . CreateTempSubdirectory ( "docs-builder-config" ) ;
35
34
35
+ ConfigurationSource = configurationSource ?? (
36
+ fileSystem . Directory . Exists ( LocalConfigurationDirectory )
37
+ ? ConfigurationSource . Local : ConfigurationSource . Embedded
38
+ ) ;
39
+
40
+ if ( ConfigurationSource == ConfigurationSource . Local && ! fileSystem . Directory . Exists ( LocalConfigurationDirectory ) )
41
+ throw new Exception ( $ "Required directory form { nameof ( ConfigurationSource ) } .{ nameof ( ConfigurationSource . Local ) } directory { LocalConfigurationDirectory } does not exist.") ;
42
+
43
+ if ( ConfigurationSource == ConfigurationSource . Remote && ! fileSystem . Directory . Exists ( AppDataConfigurationDirectory ) )
44
+ throw new Exception ( $ "Required directory form { nameof ( ConfigurationSource ) } .{ nameof ( ConfigurationSource . Remote ) } directory { AppDataConfigurationDirectory } does not exist.") ;
45
+
46
+ var path = GetAppDataPath ( "git-ref.txt" ) ;
47
+ if ( _fileSystem . File . Exists ( path ) )
48
+ GitReference = _fileSystem . File . ReadAllText ( path ) ;
49
+ else if ( ConfigurationSource == ConfigurationSource . Remote )
50
+ throw new Exception ( $ "Can not read git-ref.txt in directory { LocalConfigurationDirectory } ") ;
51
+
52
+ if ( ConfigurationSource == ConfigurationSource . Remote )
53
+ {
54
+ _logger . LogInformation ( "{ConfigurationSource}: git ref '{GitReference}', in {Directory}" ,
55
+ $ "{ nameof ( ConfigurationSource ) } .{ nameof ( ConfigurationSource . Remote ) } ", GitReference , AppDataConfigurationDirectory ) ;
56
+ }
57
+
58
+ if ( ConfigurationSource == ConfigurationSource . Local )
59
+ {
60
+ _logger . LogInformation ( "{ConfigurationSource}: located {Directory}" ,
61
+ $ "{ nameof ( ConfigurationSource ) } .{ nameof ( ConfigurationSource . Local ) } ", LocalConfigurationDirectory ) ;
62
+ }
63
+ if ( ConfigurationSource == ConfigurationSource . Embedded )
64
+ {
65
+ _logger . LogInformation ( "{ConfigurationSource} using embedded in binary configuration" ,
66
+ $ "{ nameof ( ConfigurationSource ) } .{ nameof ( ConfigurationSource . Embedded ) } ") ;
67
+ }
68
+
36
69
VersionFile = CreateTemporaryConfigurationFile ( "versions.yml" ) ;
37
70
AssemblerFile = CreateTemporaryConfigurationFile ( "assembler.yml" ) ;
38
71
NavigationFile = CreateTemporaryConfigurationFile ( "navigation.yml" ) ;
39
72
LegacyUrlMappingsFile = CreateTemporaryConfigurationFile ( "legacy-url-mappings.yml" ) ;
40
- var path = GetAppDataPath ( "git-ref.txt" ) ;
41
- if ( ConfigurationSource == ConfigurationSource . Checkout && _fileSystem . File . Exists ( path ) )
42
- GitReference = _fileSystem . File . ReadAllText ( path ) ;
43
73
}
44
74
45
75
public bool SkipPrivateRepositories { get ; }
@@ -66,6 +96,8 @@ public IFileInfo CreateNavigationFile(AssemblyConfiguration configuration)
66
96
if ( _fileSystem . File . Exists ( tempFile ) )
67
97
return NavigationFile ;
68
98
99
+ _logger . LogInformation ( "Filtering navigation file to remove private repositories" ) ;
100
+
69
101
// This routine removes `toc: `'s linking to private repositories and reindents any later lines if needed.
70
102
// This will make any public children in the nav move up one place.
71
103
var spacing = - 1 ;
@@ -139,19 +171,22 @@ private IFileInfo CreateTemporaryConfigurationFile(string fileName)
139
171
private StreamReader GetLocalOrEmbedded ( string fileName )
140
172
{
141
173
var localPath = GetLocalPath ( fileName ) ;
142
- var appDataPath = GetAppDataPath ( fileName ) ;
143
- if ( _fileSystem . File . Exists ( localPath ) )
174
+ if ( ConfigurationSource == ConfigurationSource . Local && _fileSystem . File . Exists ( localPath ) )
144
175
{
145
- ConfigurationSource = ConfigurationSource . Local ;
146
176
var reader = _fileSystem . File . OpenText ( localPath ) ;
147
177
return reader ;
148
178
}
149
- if ( _fileSystem . File . Exists ( appDataPath ) )
179
+ if ( ConfigurationSource == ConfigurationSource . Local )
180
+ throw new Exception ( $ "Can not read { fileName } in directory { LocalConfigurationDirectory } ") ;
181
+
182
+ var appDataPath = GetAppDataPath ( fileName ) ;
183
+ if ( ConfigurationSource == ConfigurationSource . Remote && _fileSystem . File . Exists ( appDataPath ) )
150
184
{
151
- ConfigurationSource = ConfigurationSource . Checkout ;
152
185
var reader = _fileSystem . File . OpenText ( appDataPath ) ;
153
186
return reader ;
154
187
}
188
+ if ( ConfigurationSource == ConfigurationSource . Remote )
189
+ throw new Exception ( $ "Can not read { fileName } in directory { AppDataConfigurationDirectory } ") ;
155
190
return GetEmbeddedStream ( fileName ) ;
156
191
}
157
192
@@ -163,24 +198,26 @@ private StreamReader GetEmbeddedStream(string fileName)
163
198
return reader ;
164
199
}
165
200
166
- private static string AppDataConfigurationDirectory { get ; } = Path . Combine ( Paths . ApplicationData . FullName , "config-clone" , "config" ) ;
167
- private static string LocalConfigurationDirectory { get ; } = Path . Combine ( Paths . WorkingDirectoryRoot . FullName , "config" ) ;
201
+ public static string AppDataConfigurationDirectory { get ; } = Path . Combine ( Paths . ApplicationData . FullName , "config-clone" , "config" ) ;
202
+ public static string LocalConfigurationDirectory { get ; } = Path . Combine ( Paths . WorkingDirectoryRoot . FullName , "config" ) ;
168
203
169
204
private static string GetLocalPath ( string file ) => Path . Combine ( LocalConfigurationDirectory , file ) ;
170
205
private static string GetAppDataPath ( string file ) => Path . Combine ( AppDataConfigurationDirectory , file ) ;
206
+
171
207
[ GeneratedRegex ( @"^\s+-?\s?toc:\s?" ) ]
172
208
private static partial Regex TocPrefixRegex ( ) ;
173
209
}
174
210
175
211
public static class ConfigurationFileProviderServiceCollectionExtensions
176
212
{
177
- public static IServiceCollection AddConfigurationFileProvider (
178
- this IServiceCollection services ,
213
+ public static IServiceCollection AddConfigurationFileProvider ( this IServiceCollection services ,
179
214
bool skipPrivateRepositories ,
180
- Action < IServiceCollection , ConfigurationFileProvider > configure
181
- )
215
+ ConfigurationSource ? configurationSource ,
216
+ Action < IServiceCollection , ConfigurationFileProvider > configure )
182
217
{
183
- var provider = new ConfigurationFileProvider ( new FileSystem ( ) , skipPrivateRepositories ) ;
218
+ using var sp = services . BuildServiceProvider ( ) ;
219
+ var logFactory = sp . GetRequiredService < ILoggerFactory > ( ) ;
220
+ var provider = new ConfigurationFileProvider ( logFactory , new FileSystem ( ) , skipPrivateRepositories , configurationSource ) ;
184
221
_ = services . AddSingleton ( provider ) ;
185
222
configure ( services , provider ) ;
186
223
return services ;
0 commit comments