Skip to content

Commit 21d2ef2

Browse files
committed
Patch CrossLinkFetcher with Diagnostics Collector. Ensure an error is registered to the workflow.
1 parent b767a42 commit 21d2ef2

File tree

18 files changed

+55
-31
lines changed

18 files changed

+55
-31
lines changed

src/Elastic.Markdown/IO/DocumentationSet.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
using Elastic.Documentation.Configuration;
1111
using Elastic.Documentation.Configuration.Builder;
1212
using Elastic.Documentation.Configuration.TableOfContents;
13+
using Elastic.Documentation.Diagnostics;
1314
using Elastic.Documentation.LinkIndex;
1415
using Elastic.Documentation.Links;
1516
using Elastic.Documentation.Site.Navigation;
@@ -135,6 +136,7 @@ public class DocumentationSet : INavigationLookups, IPositionalNavigation
135136
public DocumentationSet(
136137
BuildContext context,
137138
ILoggerFactory logFactory,
139+
IDiagnosticsCollector collector,
138140
ICrossLinkResolver? linkResolver = null,
139141
TableOfContentsTreeCollector? treeCollector = null
140142
)
@@ -144,7 +146,7 @@ public DocumentationSet(
144146
SourceDirectory = context.DocumentationSourceDirectory;
145147
OutputDirectory = context.OutputDirectory;
146148
LinkResolver =
147-
linkResolver ?? new CrossLinkResolver(new ConfigurationCrossLinkFetcher(logFactory, context.Configuration, Aws3LinkIndexReader.CreateAnonymous()));
149+
linkResolver ?? new CrossLinkResolver(new ConfigurationCrossLinkFetcher(logFactory, context.Configuration, Aws3LinkIndexReader.CreateAnonymous(), collector));
148150
Configuration = context.Configuration;
149151
EnabledExtensions = InstantiateExtensions();
150152
treeCollector ??= new TableOfContentsTreeCollector();

src/Elastic.Markdown/Links/CrossLinks/ConfigurationCrossLinkFetcher.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,14 @@
44

55
using System.Collections.Frozen;
66
using Elastic.Documentation.Configuration.Builder;
7+
using Elastic.Documentation.Diagnostics;
78
using Elastic.Documentation.LinkIndex;
89
using Elastic.Documentation.Links;
910
using Microsoft.Extensions.Logging;
1011

1112
namespace Elastic.Markdown.Links.CrossLinks;
1213

13-
public class ConfigurationCrossLinkFetcher(ILoggerFactory logFactory, ConfigurationFile configuration, ILinkIndexReader linkIndexProvider) : CrossLinkFetcher(logFactory, linkIndexProvider)
14+
public class ConfigurationCrossLinkFetcher(ILoggerFactory logFactory, ConfigurationFile configuration, ILinkIndexReader linkIndexProvider, IDiagnosticsCollector collector) : CrossLinkFetcher(logFactory, linkIndexProvider, collector)
1415
{
1516
public override async Task<FetchedCrossLinks> Fetch(Cancel ctx)
1617
{

src/Elastic.Markdown/Links/CrossLinks/CrossLinkFetcher.cs

Lines changed: 28 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
using System.Collections.Frozen;
77
using System.Text.Json;
88
using Elastic.Documentation.Configuration;
9+
using Elastic.Documentation.Diagnostics;
910
using Elastic.Documentation.LinkIndex;
1011
using Elastic.Documentation.Links;
1112
using Elastic.Documentation.Serialization;
@@ -32,7 +33,7 @@ public record FetchedCrossLinks
3233
};
3334
}
3435

35-
public abstract class CrossLinkFetcher(ILoggerFactory logFactory, ILinkIndexReader linkIndexProvider) : IDisposable
36+
public abstract class CrossLinkFetcher(ILoggerFactory logFactory, ILinkIndexReader linkIndexProvider, IDiagnosticsCollector collector) : IDisposable
3637
{
3738
private readonly ILogger _logger = logFactory.CreateLogger(nameof(CrossLinkFetcher));
3839
private readonly HttpClient _client = new();
@@ -60,32 +61,40 @@ protected async Task<LinkRegistryEntry> GetLinkIndexEntry(string repository, Can
6061
{
6162
var linkIndex = await FetchLinkIndex(ctx);
6263
if (!linkIndex.Repositories.TryGetValue(repository, out var repositoryLinks))
64+
{
65+
collector.EmitError(repository, $"Repository {repository} not found in link index");
6366
throw new Exception($"Repository {repository} not found in link index");
67+
}
68+
6469
return GetNextContentSourceLinkIndexEntry(repositoryLinks, repository);
6570
}
6671

67-
protected static LinkRegistryEntry GetNextContentSourceLinkIndexEntry(IDictionary<string, LinkRegistryEntry> repositoryLinks, string repository)
72+
protected LinkRegistryEntry GetNextContentSourceLinkIndexEntry(IDictionary<string, LinkRegistryEntry> repositoryLinks, string repository)
6873
{
69-
var linkIndexEntry =
70-
(repositoryLinks.TryGetValue("main", out var link)
71-
? link
72-
: repositoryLinks.TryGetValue("master", out link) ? link : null)
73-
?? throw new Exception($"Repository {repository} found in link index, but no main or master branch found");
74-
return linkIndexEntry;
74+
var linkIndexEntry = repositoryLinks.TryGetValue("main", out var link) ? link : repositoryLinks.TryGetValue("master", out link) ? link : null;
75+
if (linkIndexEntry is not null)
76+
return linkIndexEntry;
77+
78+
collector.EmitError(repository, $"Repository found in link index however neither 'main' nor 'master' branches found");
79+
throw new Exception($"Repository {repository} found in link index, but no main or master branch found");
7580
}
7681

7782
protected async Task<RepositoryLinks> Fetch(string repository, string[] keys, Cancel ctx)
7883
{
7984
var linkIndex = await FetchLinkIndex(ctx);
8085
if (!linkIndex.Repositories.TryGetValue(repository, out var repositoryLinks))
86+
{
87+
collector.EmitError(repository, $"Repository {repository} not found in link index");
8188
throw new Exception($"Repository {repository} not found in link index");
89+
}
8290

8391
foreach (var key in keys)
8492
{
8593
if (repositoryLinks.TryGetValue(key, out var linkIndexEntry))
8694
return await FetchLinkIndexEntry(repository, linkIndexEntry, ctx);
8795
}
8896

97+
collector.EmitError(repository, $"Repository found in link index however none of: '{string.Join(", ", keys)}' branches found");
8998
throw new Exception($"Repository found in link index however none of: '{string.Join(", ", keys)}' branches found");
9099
}
91100

@@ -97,7 +106,17 @@ protected async Task<RepositoryLinks> FetchLinkIndexEntry(string repository, Lin
97106

98107
var url = $"https://elastic-docs-link-index.s3.us-east-2.amazonaws.com/{linkRegistryEntry.Path}";
99108
_logger.LogInformation("Fetching links.json for '{Repository}': {Url}", repository, url);
100-
var json = await _client.GetStringAsync(url, ctx);
109+
string json;
110+
try
111+
{
112+
json = await _client.GetStringAsync(url, ctx);
113+
}
114+
catch (Exception e)
115+
{
116+
collector.EmitError(repository, $"An error occurred fetching links.json for '{repository}' from '{url}': {e.Message}");
117+
throw new Exception($"An error occurred fetching links.json for '{repository}' from '{url}': {e.Message}", e);
118+
}
119+
101120
linkReference = Deserialize(json);
102121
WriteLinksJsonCachedFile(repository, linkRegistryEntry, json);
103122
return linkReference;

src/Elastic.Markdown/Links/InboundLinks/LinkIndexCrossLinkFetcher.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,15 @@
33
// See the LICENSE file in the project root for more information
44

55
using System.Collections.Frozen;
6+
using Elastic.Documentation.Diagnostics;
67
using Elastic.Documentation.LinkIndex;
78
using Elastic.Documentation.Links;
89
using Elastic.Markdown.Links.CrossLinks;
910
using Microsoft.Extensions.Logging;
1011

1112
namespace Elastic.Markdown.Links.InboundLinks;
1213

13-
public class LinksIndexCrossLinkFetcher(ILoggerFactory logFactory, ILinkIndexReader linkIndexProvider) : CrossLinkFetcher(logFactory, linkIndexProvider)
14+
public class LinksIndexCrossLinkFetcher(ILoggerFactory logFactory, ILinkIndexReader linkIndexProvider, IDiagnosticsCollector collector) : CrossLinkFetcher(logFactory, linkIndexProvider, collector)
1415
{
1516
public override async Task<FetchedCrossLinks> Fetch(Cancel ctx)
1617
{

src/Elastic.Markdown/Links/InboundLinks/LinkIndexLinkChecker.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ private sealed record RepositoryFilter
2525

2626
public async Task CheckAll(IDiagnosticsCollector collector, Cancel ctx)
2727
{
28-
var fetcher = new LinksIndexCrossLinkFetcher(logFactory, _linkIndexProvider);
28+
var fetcher = new LinksIndexCrossLinkFetcher(logFactory, _linkIndexProvider, collector);
2929
var resolver = new CrossLinkResolver(fetcher);
3030
var crossLinks = await resolver.FetchLinks(ctx);
3131

@@ -34,7 +34,7 @@ public async Task CheckAll(IDiagnosticsCollector collector, Cancel ctx)
3434

3535
public async Task CheckRepository(IDiagnosticsCollector collector, string? toRepository, string? fromRepository, Cancel ctx)
3636
{
37-
var fetcher = new LinksIndexCrossLinkFetcher(logFactory, _linkIndexProvider);
37+
var fetcher = new LinksIndexCrossLinkFetcher(logFactory, _linkIndexProvider, collector);
3838
var resolver = new CrossLinkResolver(fetcher);
3939
var crossLinks = await resolver.FetchLinks(ctx);
4040
var filter = new RepositoryFilter
@@ -48,7 +48,7 @@ public async Task CheckRepository(IDiagnosticsCollector collector, string? toRep
4848

4949
public async Task CheckWithLocalLinksJson(IDiagnosticsCollector collector, string repository, string localLinksJson, Cancel ctx)
5050
{
51-
var fetcher = new LinksIndexCrossLinkFetcher(logFactory, _linkIndexProvider);
51+
var fetcher = new LinksIndexCrossLinkFetcher(logFactory, _linkIndexProvider, collector);
5252
var resolver = new CrossLinkResolver(fetcher);
5353
// ReSharper disable once RedundantAssignment
5454
var crossLinks = await resolver.FetchLinks(ctx);

src/tooling/docs-assembler/AssembleSources.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ IReadOnlySet<Exporter> availableExporters
8080
HistoryMappings = GetLegacyUrlMappings(assembleContext);
8181
var linkIndexProvider = Aws3LinkIndexReader.CreateAnonymous();
8282

83-
var crossLinkFetcher = new AssemblerCrossLinkFetcher(logFactory, assembleContext.Configuration, assembleContext.Environment, linkIndexProvider);
83+
var crossLinkFetcher = new AssemblerCrossLinkFetcher(logFactory, assembleContext.Configuration, assembleContext.Environment, linkIndexProvider, assembleContext.Collector);
8484
UriResolver = new PublishEnvironmentUriResolver(NavigationTocMappings, assembleContext.Environment);
8585

8686
var crossLinkResolver = new CrossLinkResolver(crossLinkFetcher, UriResolver);

src/tooling/docs-assembler/Building/AssemblerCrossLinkFetcher.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,16 @@
44

55
using System.Collections.Frozen;
66
using Elastic.Documentation.Configuration.Assembler;
7+
using Elastic.Documentation.Diagnostics;
78
using Elastic.Documentation.LinkIndex;
89
using Elastic.Documentation.Links;
910
using Elastic.Markdown.Links.CrossLinks;
1011
using Microsoft.Extensions.Logging;
1112

1213
namespace Documentation.Assembler.Building;
1314

14-
public class AssemblerCrossLinkFetcher(ILoggerFactory logFactory, AssemblyConfiguration configuration, PublishEnvironment publishEnvironment, ILinkIndexReader linkIndexProvider)
15-
: CrossLinkFetcher(logFactory, linkIndexProvider)
15+
public class AssemblerCrossLinkFetcher(ILoggerFactory logFactory, AssemblyConfiguration configuration, PublishEnvironment publishEnvironment, ILinkIndexReader linkIndexProvider, IDiagnosticsCollector collector)
16+
: CrossLinkFetcher(logFactory, linkIndexProvider, collector)
1617
{
1718
public override async Task<FetchedCrossLinks> Fetch(Cancel ctx)
1819
{

src/tooling/docs-assembler/Cli/ContentSourceCommands.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ public async Task<int> Validate(Cancel ctx = default)
3535
var fs = new FileSystem();
3636
var context = new AssembleContext(configuration, configurationContext, "dev", collector, fs, fs, null, null);
3737
ILinkIndexReader linkIndexReader = Aws3LinkIndexReader.CreateAnonymous();
38-
var fetcher = new AssemblerCrossLinkFetcher(logFactory, context.Configuration, context.Environment, linkIndexReader);
38+
var fetcher = new AssemblerCrossLinkFetcher(logFactory, context.Configuration, context.Environment, linkIndexReader, collector);
3939
var links = await fetcher.FetchLinkIndex(ctx);
4040
var repositories = context.Configuration.AvailableRepositories;
4141

src/tooling/docs-assembler/Cli/RepositoryCommands.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -239,7 +239,7 @@ await Parallel.ForEachAsync(repositories,
239239
checkout.Directory.FullName,
240240
outputPath
241241
);
242-
var set = new DocumentationSet(context, logFactory);
242+
var set = new DocumentationSet(context, logFactory, collector);
243243
var generator = new DocumentationGenerator(set, logFactory, null, null, null);
244244
_ = await generator.GenerateAll(c);
245245

src/tooling/docs-assembler/Links/NavigationPrefixChecker.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ public async Task CheckAllPublishedLinks(IDiagnosticsCollector collector, Cancel
8282
private async Task FetchAndValidateCrossLinks(IDiagnosticsCollector collector, string? updateRepository, RepositoryLinks? updateReference, Cancel ctx)
8383
{
8484
var linkIndexProvider = Aws3LinkIndexReader.CreateAnonymous();
85-
var fetcher = new LinksIndexCrossLinkFetcher(_logFactoryFactory, linkIndexProvider);
85+
var fetcher = new LinksIndexCrossLinkFetcher(_logFactoryFactory, linkIndexProvider, collector);
8686
var resolver = new CrossLinkResolver(fetcher);
8787
var crossLinks = await resolver.FetchLinks(ctx);
8888
var dictionary = new Dictionary<string, SeenPaths>();

0 commit comments

Comments
 (0)