diff --git a/src/services/Elastic.Documentation.Assembler/Navigation/NavigationPrefixChecker.cs b/src/services/Elastic.Documentation.Assembler/Navigation/NavigationPrefixChecker.cs index 051ed12f1..7bbd0f00b 100644 --- a/src/services/Elastic.Documentation.Assembler/Navigation/NavigationPrefixChecker.cs +++ b/src/services/Elastic.Documentation.Assembler/Navigation/NavigationPrefixChecker.cs @@ -99,7 +99,6 @@ private async Task FetchAndValidateCrossLinks(IDiagnosticsCollector collector, s if (!string.IsNullOrEmpty(updateRepository) && updateReference is not null) crossLinks = crossLinkResolver.UpdateLinkReference(updateRepository, updateReference); - var skippedPhantoms = 0; foreach (var (repository, linkReference) in crossLinks.LinkReferences) { if (!_repositories.Contains(repository)) @@ -117,14 +116,9 @@ private async Task FetchAndValidateCrossLinks(IDiagnosticsCollector collector, s var path = relativeLink.Split('/').SkipLast(1); var pathUri = new Uri($"{repository}://{string.Join('/', path)}"); - var baseOfAPhantom = _phantoms.Any(p => p == pathUri); + var baseOfAPhantom = _phantoms.Any(p => IsPhantomOrDescendant(p, pathUri)); if (baseOfAPhantom) - { - skippedPhantoms++; - if (skippedPhantoms > _phantoms.Count * 3) - collector.EmitError(repository, $"Too many items are being marked as part of a phantom this looks like a bug. ({skippedPhantoms})"); continue; - } collector.EmitError(repository, $"'Can not validate '{crossLink}' it's not declared in any link reference nor is it a phantom"); continue; } @@ -157,6 +151,12 @@ private async Task FetchAndValidateCrossLinks(IDiagnosticsCollector collector, s } } + private static bool IsPhantomOrDescendant(Uri phantom, Uri candidate) => + candidate.Scheme == phantom.Scheme && + candidate.Host == phantom.Host && + (candidate.AbsolutePath == phantom.AbsolutePath || + candidate.AbsolutePath.StartsWith(phantom.AbsolutePath.TrimEnd('/') + '/', StringComparison.Ordinal)); + private async Task ReadLocalLinksJsonAsync(string localLinksJson, Cancel ctx) { try