66using System . Text . RegularExpressions ;
77using Elastic . Documentation . Configuration . Assembler ;
88using Microsoft . Extensions . DependencyInjection ;
9- using NetEscapades . EnumGenerators ;
9+ using Microsoft . Extensions . Logging ;
1010
1111namespace Elastic . Documentation . Configuration ;
1212
13- [ EnumExtensions ]
14- public enum ConfigurationSource
15- {
16- Local ,
17- Checkout ,
18- Embedded
19- }
20-
2113public partial class ConfigurationFileProvider
2214{
2315 private readonly IFileSystem _fileSystem ;
2416 private readonly string _assemblyName ;
17+ private readonly ILogger < ConfigurationFileProvider > _logger ;
2518
26- public ConfigurationSource ConfigurationSource { get ; private set ; } = ConfigurationSource . Embedded ;
19+ public ConfigurationSource ConfigurationSource { get ; }
2720 public string ? GitReference { get ; }
2821
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+ )
3028 {
29+ _logger = logFactory . CreateLogger < ConfigurationFileProvider > ( ) ;
3130 _fileSystem = fileSystem ;
3231 _assemblyName = typeof ( ConfigurationFileProvider ) . Assembly . GetName ( ) . Name ! ;
3332 SkipPrivateRepositories = skipPrivateRepositories ;
3433 TemporaryDirectory = fileSystem . Directory . CreateTempSubdirectory ( "docs-builder-config" ) ;
3534
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+
3669 VersionFile = CreateTemporaryConfigurationFile ( "versions.yml" ) ;
3770 AssemblerFile = CreateTemporaryConfigurationFile ( "assembler.yml" ) ;
3871 NavigationFile = CreateTemporaryConfigurationFile ( "navigation.yml" ) ;
3972 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 ) ;
4373 }
4474
4575 public bool SkipPrivateRepositories { get ; }
@@ -66,6 +96,8 @@ public IFileInfo CreateNavigationFile(AssemblyConfiguration configuration)
6696 if ( _fileSystem . File . Exists ( tempFile ) )
6797 return NavigationFile ;
6898
99+ _logger . LogInformation ( "Filtering navigation file to remove private repositories" ) ;
100+
69101 // This routine removes `toc: `'s linking to private repositories and reindents any later lines if needed.
70102 // This will make any public children in the nav move up one place.
71103 var spacing = - 1 ;
@@ -139,19 +171,22 @@ private IFileInfo CreateTemporaryConfigurationFile(string fileName)
139171 private StreamReader GetLocalOrEmbedded ( string fileName )
140172 {
141173 var localPath = GetLocalPath ( fileName ) ;
142- var appDataPath = GetAppDataPath ( fileName ) ;
143- if ( _fileSystem . File . Exists ( localPath ) )
174+ if ( ConfigurationSource == ConfigurationSource . Local && _fileSystem . File . Exists ( localPath ) )
144175 {
145- ConfigurationSource = ConfigurationSource . Local ;
146176 var reader = _fileSystem . File . OpenText ( localPath ) ;
147177 return reader ;
148178 }
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 ) )
150184 {
151- ConfigurationSource = ConfigurationSource . Checkout ;
152185 var reader = _fileSystem . File . OpenText ( appDataPath ) ;
153186 return reader ;
154187 }
188+ if ( ConfigurationSource == ConfigurationSource . Remote )
189+ throw new Exception ( $ "Can not read { fileName } in directory { AppDataConfigurationDirectory } ") ;
155190 return GetEmbeddedStream ( fileName ) ;
156191 }
157192
@@ -163,24 +198,26 @@ private StreamReader GetEmbeddedStream(string fileName)
163198 return reader ;
164199 }
165200
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" ) ;
168203
169204 private static string GetLocalPath ( string file ) => Path . Combine ( LocalConfigurationDirectory , file ) ;
170205 private static string GetAppDataPath ( string file ) => Path . Combine ( AppDataConfigurationDirectory , file ) ;
206+
171207 [ GeneratedRegex ( @"^\s+-?\s?toc:\s?" ) ]
172208 private static partial Regex TocPrefixRegex ( ) ;
173209}
174210
175211public static class ConfigurationFileProviderServiceCollectionExtensions
176212{
177- public static IServiceCollection AddConfigurationFileProvider (
178- this IServiceCollection services ,
213+ public static IServiceCollection AddConfigurationFileProvider ( this IServiceCollection services ,
179214 bool skipPrivateRepositories ,
180- Action < IServiceCollection , ConfigurationFileProvider > configure
181- )
215+ ConfigurationSource ? configurationSource ,
216+ Action < IServiceCollection , ConfigurationFileProvider > configure )
182217 {
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 ) ;
184221 _ = services . AddSingleton ( provider ) ;
185222 configure ( services , provider ) ;
186223 return services ;
0 commit comments