Skip to content

Commit 97a5781

Browse files
committed
Support building only public repositories
1 parent 93656a9 commit 97a5781

File tree

24 files changed

+273
-97
lines changed

24 files changed

+273
-97
lines changed

config/assembler.yml

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@ references:
9494
elastic-otel-python:
9595
elastic-serverless-forwarder:
9696
integration-docs:
97+
private: true
9798
integrations:
9899
logstash-docs-md:
99100
opentelemetry:
@@ -104,7 +105,12 @@ references:
104105

105106
# @elastic/admin-docs
106107
cloud-on-k8s:
107-
cloud: *master
108+
cloud:
109+
current: master
110+
next: master
111+
edge: master
112+
private: true
113+
108114
curator: *master
109115
ecctl: *master
110116

src/Elastic.Documentation.Configuration/Assembler/AssemblyConfiguration.cs

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44

55
using System.Text.RegularExpressions;
66
using Elastic.Documentation.Extensions;
7-
using YamlDotNet.RepresentationModel;
87
using YamlDotNet.Serialization;
98
using YamlStaticContext = Elastic.Documentation.Configuration.Serialization.YamlStaticContext;
109

@@ -13,9 +12,9 @@ namespace Elastic.Documentation.Configuration.Assembler;
1312
public record AssemblyConfiguration
1413
{
1514
public static AssemblyConfiguration Create(ConfigurationFileProvider provider) =>
16-
Deserialize(provider.AssemblerFile.ReadToEnd());
15+
Deserialize(provider.AssemblerFile.ReadToEnd(), skipPrivateRepositories: provider.SkipPrivateRepositories);
1716

18-
public static AssemblyConfiguration Deserialize(string yaml)
17+
public static AssemblyConfiguration Deserialize(string yaml, bool skipPrivateRepositories = false)
1918
{
2019
var input = new StringReader(yaml);
2120

@@ -28,13 +27,28 @@ public static AssemblyConfiguration Deserialize(string yaml)
2827
var config = deserializer.Deserialize<AssemblyConfiguration>(input);
2928
foreach (var (name, r) in config.ReferenceRepositories)
3029
{
30+
if (name == "cloud")
31+
{
32+
}
3133
var repository = RepositoryDefaults(r, name);
3234
config.ReferenceRepositories[name] = repository;
3335
}
36+
var privateRepositories = config.ReferenceRepositories.Where(r => r.Value.Private).ToList();
37+
foreach (var (name, _) in privateRepositories)
38+
{
39+
if (skipPrivateRepositories)
40+
_ = config.ReferenceRepositories.Remove(name);
41+
}
3442

3543
foreach (var (name, env) in config.Environments)
3644
env.Name = name;
3745
config.Narrative = RepositoryDefaults(config.Narrative, NarrativeRepository.RepositoryName);
46+
47+
config.AvailableRepositories = config.ReferenceRepositories.Values
48+
.Where(r => !r.Skip)
49+
.Concat([config.Narrative]).ToDictionary(kvp => kvp.Name, kvp => kvp);
50+
51+
config.PrivateRepositories = privateRepositories.ToDictionary(kvp => kvp.Key, kvp => kvp.Value);
3852
return config;
3953
}
4054
catch (Exception e)
@@ -80,6 +94,15 @@ private static TRepository RepositoryDefaults<TRepository>(TRepository r, string
8094
[YamlMember(Alias = "references")]
8195
public Dictionary<string, Repository> ReferenceRepositories { get; set; } = [];
8296

97+
/// All available repositories, combines <see cref="ReferenceRepositories"/> and <see cref="Narrative"/> and will filter private repositories if `skip-private-repositories`
98+
/// is specified
99+
[YamlIgnore]
100+
public IReadOnlyDictionary<string, Repository> AvailableRepositories { get; private set; } = new Dictionary<string, Repository>();
101+
102+
/// Repositories marked as private, these are listed under <see cref="AvailableRepositories"/> if `--skip-private-repositories` is not specified
103+
[YamlIgnore]
104+
public IReadOnlyDictionary<string, Repository> PrivateRepositories { get; private set; } = new Dictionary<string, Repository>();
105+
83106
[YamlMember(Alias = "environments")]
84107
public Dictionary<string, PublishEnvironment> Environments { get; set; } = [];
85108

src/Elastic.Documentation.Configuration/Assembler/Repository.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,9 @@ public record Repository
4848
[YamlMember(Alias = "sparse_paths")]
4949
public string[] SparsePaths { get; set; } = ["docs"];
5050

51+
[YamlMember(Alias = "private")]
52+
public bool Private { get; set; }
53+
5154
public string GetBranch(ContentSource contentSource) => contentSource switch
5255
{
5356
ContentSource.Current => GitReferenceCurrent,

src/Elastic.Documentation.Configuration/ConfigurationFileProvider.cs

Lines changed: 74 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,11 @@
33
// See the LICENSE file in the project root for more information
44

55
using System.IO.Abstractions;
6+
using System.Text.RegularExpressions;
7+
using Elastic.Documentation.Configuration.Assembler;
68
using Microsoft.Extensions.DependencyInjection;
79
using NetEscapades.EnumGenerators;
10+
using YamlDotNet.RepresentationModel;
811

912
namespace Elastic.Documentation.Configuration;
1013

@@ -16,18 +19,19 @@ public enum ConfigurationSource
1619
Embedded
1720
}
1821

19-
public class ConfigurationFileProvider
22+
public partial class ConfigurationFileProvider
2023
{
2124
private readonly IFileSystem _fileSystem;
2225
private readonly string _assemblyName;
2326

2427
public ConfigurationSource ConfigurationSource { get; private set; } = ConfigurationSource.Embedded;
2528
public string? GitReference { get; }
2629

27-
public ConfigurationFileProvider(IFileSystem fileSystem)
30+
public ConfigurationFileProvider(IFileSystem fileSystem, bool skipPrivateRepositories = false)
2831
{
2932
_fileSystem = fileSystem;
3033
_assemblyName = typeof(ConfigurationFileProvider).Assembly.GetName().Name!;
34+
SkipPrivateRepositories = skipPrivateRepositories;
3135
TemporaryDirectory = fileSystem.Directory.CreateTempSubdirectory("docs-builder-config");
3236

3337
VersionFile = CreateTemporaryConfigurationFile("versions.yml");
@@ -39,16 +43,75 @@ public ConfigurationFileProvider(IFileSystem fileSystem)
3943
GitReference = _fileSystem.File.ReadAllText(path);
4044
}
4145

46+
public bool SkipPrivateRepositories { get; }
47+
4248
private IDirectoryInfo TemporaryDirectory { get; }
4349

44-
public IFileInfo NavigationFile { get; }
50+
public IFileInfo NavigationFile { get; private set; }
4551

4652
public IFileInfo VersionFile { get; }
4753

4854
public IFileInfo AssemblerFile { get; }
4955

5056
public IFileInfo LegacyUrlMappingsFile { get; }
5157

58+
public IFileInfo CreateNavigationFile(IReadOnlyDictionary<string, Repository> privateRepositories)
59+
{
60+
if (privateRepositories.Count == 0)
61+
return NavigationFile;
62+
63+
var targets = string.Join("|", privateRepositories.Keys);
64+
65+
var tempFile = Path.Combine(TemporaryDirectory.FullName, "navigation.filtered.yml");
66+
if (_fileSystem.File.Exists(tempFile))
67+
return NavigationFile;
68+
69+
var spacing = -1;
70+
var reindenting = -1;
71+
var breakingLine = string.Empty;
72+
foreach (var l in _fileSystem.File.ReadAllLines(NavigationFile.FullName))
73+
{
74+
var line = l;
75+
if (spacing > -1 && !string.IsNullOrWhiteSpace(line) && !line.StartsWith(new string(' ', spacing), StringComparison.Ordinal))
76+
{
77+
spacing = -1;
78+
reindenting = -1;
79+
}
80+
81+
if (spacing != -1 && Regex.IsMatch(line, $@"^\s{{{spacing}}}\S"))
82+
{
83+
spacing = -1;
84+
reindenting = -1;
85+
}
86+
87+
else if (spacing != -1 && Regex.IsMatch(line, $@"^(\s{{{spacing + 3},}})\S"))
88+
{
89+
var matches = Regex.Match(line, $@"^(?<spacing>\s{{{spacing}}})(?<remainder>.+)$");
90+
line = $"{new string(' ', Math.Max(0, spacing - 4))}{matches.Groups["remainder"].Value}";
91+
reindenting = spacing;
92+
}
93+
94+
else if (spacing == -1 && TocPrefixRegex().IsMatch(line))
95+
{
96+
var matches = Regex.Match(line, $@"^(?<spacing>\s+)-\s?toc:\s?(?:{targets})\:");
97+
if (matches.Success)
98+
{
99+
spacing = matches.Groups["spacing"].Value.Length;
100+
breakingLine = line;
101+
}
102+
if (spacing == 0)
103+
spacing = -1;
104+
}
105+
106+
if (spacing == -1 || reindenting > 0)
107+
_fileSystem.File.AppendAllLines(tempFile, [line]);
108+
}
109+
NavigationFile = _fileSystem.FileInfo.New(tempFile);
110+
return NavigationFile;
111+
112+
113+
}
114+
52115
private IFileInfo CreateTemporaryConfigurationFile(string fileName)
53116
{
54117
using var stream = GetLocalOrEmbedded(fileName);
@@ -90,14 +153,19 @@ private StreamReader GetEmbeddedStream(string fileName)
90153

91154
private static string GetLocalPath(string file) => Path.Combine(LocalConfigurationDirectory, file);
92155
private static string GetAppDataPath(string file) => Path.Combine(AppDataConfigurationDirectory, file);
156+
[GeneratedRegex(@"^\s+-?\s?toc:\s?")]
157+
private static partial Regex TocPrefixRegex();
93158
}
94159

95160
public static class ConfigurationFileProviderServiceCollectionExtensions
96161
{
97-
public static IServiceCollection AddConfigurationFileProvider(this IServiceCollection services,
98-
Action<IServiceCollection, ConfigurationFileProvider> configure)
162+
public static IServiceCollection AddConfigurationFileProvider(
163+
this IServiceCollection services,
164+
bool skipPrivateRepositories,
165+
Action<IServiceCollection, ConfigurationFileProvider> configure
166+
)
99167
{
100-
var provider = new ConfigurationFileProvider(new FileSystem());
168+
var provider = new ConfigurationFileProvider(new FileSystem(), skipPrivateRepositories);
101169
_ = services.AddSingleton(provider);
102170
configure(services, provider);
103171
return services;

src/Elastic.Documentation.ServiceDefaults/AppDefaultsExtensions.cs

Lines changed: 9 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,8 @@
22
// Elasticsearch B.V licenses this file to you under the Apache 2.0 License.
33
// See the LICENSE file in the project root for more information
44

5-
using Actions.Core.Extensions;
65
using Elastic.Documentation.Configuration;
76
using Elastic.Documentation.Configuration.Versions;
8-
using Elastic.Documentation.Diagnostics;
97
using Elastic.Documentation.ServiceDefaults.Logging;
108
using Microsoft.Extensions.DependencyInjection;
119
using Microsoft.Extensions.DependencyInjection.Extensions;
@@ -17,41 +15,32 @@ namespace Elastic.Documentation.ServiceDefaults;
1715

1816
public static class AppDefaultsExtensions
1917
{
20-
public static TBuilder AddAppDefaults<TBuilder>(this TBuilder builder) where TBuilder : IHostApplicationBuilder
18+
public static TBuilder AddDocumentationServiceDefaults<TBuilder>(this TBuilder builder) where TBuilder : IHostApplicationBuilder
2119
{
2220
var args = Array.Empty<string>();
23-
return builder.AddAppDefaults(ref args);
21+
return builder.AddDocumentationServiceDefaults(ref args);
2422
}
25-
public static TBuilder AddAppDefaults<TBuilder>(this TBuilder builder, LogLevel defaultLogLevel) where TBuilder : IHostApplicationBuilder
26-
{
27-
var args = Array.Empty<string>();
28-
return builder.AddAppDefaults(ref args, defaultLogLevel);
29-
}
30-
public static TBuilder AddAppDefaults<TBuilder>(this TBuilder builder, ref string[] args, Action<IServiceCollection, ConfigurationFileProvider> configure) where TBuilder : IHostApplicationBuilder =>
31-
builder.AddAppDefaults(ref args, null, configure);
23+
public static TBuilder AddDocumentationServiceDefaults<TBuilder>(this TBuilder builder, ref string[] args, Action<IServiceCollection, ConfigurationFileProvider> configure) where TBuilder : IHostApplicationBuilder =>
24+
builder.AddDocumentationServiceDefaults(ref args, null, configure);
3225

33-
public static TBuilder AddAppDefaults<TBuilder>(this TBuilder builder, ref string[] args, LogLevel? defaultLogLevel = null, Action<IServiceCollection, ConfigurationFileProvider>? configure = null) where TBuilder : IHostApplicationBuilder
26+
public static TBuilder AddDocumentationServiceDefaults<TBuilder>(this TBuilder builder, ref string[] args, LogLevel? defaultLogLevel = null, Action<IServiceCollection, ConfigurationFileProvider>? configure = null) where TBuilder : IHostApplicationBuilder
3427
{
3528
var logLevel = defaultLogLevel ?? LogLevel.Information;
36-
ProcessCommandLineArguments(ref args, ref logLevel);
29+
GlobalCommandLine.Process(ref args, ref logLevel, out var skipPrivateRepositories);
3730

3831
var services = builder.Services;
3932
_ = services
40-
.AddGitHubActionsCore()
41-
.AddSingleton<DiagnosticsChannel>()
42-
.AddSingleton<DiagnosticsCollector>()
43-
.AddSingleton<ConfigurationFileProvider>()
44-
.AddConfigurationFileProvider((s, p) =>
33+
.AddConfigurationFileProvider(skipPrivateRepositories, (s, p) =>
4534
{
4635
_ = s.AddSingleton(p.CreateVersionConfiguration());
4736
configure?.Invoke(s, p);
4837
});
49-
_ = builder.Services.AddAppLogging(logLevel);
38+
_ = builder.Services.AddElasticDocumentationLogging(logLevel);
5039

5140
return builder.AddServiceDefaults();
5241
}
5342

54-
public static TServiceCollection AddAppLogging<TServiceCollection>(this TServiceCollection services, LogLevel logLevel)
43+
public static TServiceCollection AddElasticDocumentationLogging<TServiceCollection>(this TServiceCollection services, LogLevel logLevel)
5544
where TServiceCollection : IServiceCollection
5645
{
5746
services.TryAddEnumerable(ServiceDescriptor.Singleton<ConsoleFormatter, CondensedConsoleFormatter>());
@@ -63,34 +52,4 @@ public static TServiceCollection AddAppLogging<TServiceCollection>(this TService
6352
return services;
6453
}
6554

66-
private static void ProcessCommandLineArguments(ref string[] args, ref LogLevel defaultLogLevel)
67-
{
68-
var newArgs = new List<string>();
69-
for (var i = 0; i < args.Length; i++)
70-
{
71-
if (args[i] == "--log-level")
72-
{
73-
if (args.Length > i + 1)
74-
defaultLogLevel = GetLogLevel(args[i + 1]);
75-
76-
i++;
77-
}
78-
else
79-
newArgs.Add(args[i]);
80-
}
81-
82-
args = [.. newArgs];
83-
}
84-
85-
private static LogLevel GetLogLevel(string? logLevel) => logLevel switch
86-
{
87-
"trace" => LogLevel.Trace,
88-
"debug" => LogLevel.Debug,
89-
"information" => LogLevel.Information,
90-
"info" => LogLevel.Information,
91-
"warning" => LogLevel.Warning,
92-
"error" => LogLevel.Error,
93-
"critical" => LogLevel.Critical,
94-
_ => LogLevel.Information
95-
};
9655
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
// Licensed to Elasticsearch B.V under one or more agreements.
2+
// Elasticsearch B.V licenses this file to you under the Apache 2.0 License.
3+
// See the LICENSE file in the project root for more information
4+
5+
using Microsoft.Extensions.Logging;
6+
7+
namespace Elastic.Documentation;
8+
9+
public static class GlobalCommandLine
10+
{
11+
public static void Process(ref string[] args, ref LogLevel defaultLogLevel, out bool skipPrivateRepositories)
12+
{
13+
skipPrivateRepositories = false;
14+
var newArgs = new List<string>();
15+
for (var i = 0; i < args.Length; i++)
16+
{
17+
if (args[i] == "--log-level")
18+
{
19+
if (args.Length > i + 1)
20+
defaultLogLevel = GetLogLevel(args[i + 1]);
21+
i++;
22+
}
23+
else if (args[i] == "--skip-private-repositories")
24+
{
25+
skipPrivateRepositories = true;
26+
i++;
27+
}
28+
else
29+
newArgs.Add(args[i]);
30+
}
31+
32+
args = [.. newArgs];
33+
}
34+
35+
private static LogLevel GetLogLevel(string? logLevel) => logLevel switch
36+
{
37+
"trace" => LogLevel.Trace,
38+
"debug" => LogLevel.Debug,
39+
"information" => LogLevel.Information,
40+
"info" => LogLevel.Information,
41+
"warning" => LogLevel.Warning,
42+
"error" => LogLevel.Error,
43+
"critical" => LogLevel.Critical,
44+
_ => LogLevel.Information
45+
};
46+
47+
}

src/api/Elastic.Documentation.Api.Infrastructure/ServicesExtension.cs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,9 +40,7 @@ public static class ServicesExtension
4040
public static void AddElasticDocsApiUsecases(this IServiceCollection services, string? appEnvironment)
4141
{
4242
if (AppEnvExtensions.TryParse(appEnvironment, out var parsedEnvironment, true))
43-
{
4443
AddElasticDocsApiUsecases(services, parsedEnvironment);
45-
}
4644
else
4745
{
4846
var logger = GetLogger(services);

0 commit comments

Comments
 (0)