diff --git a/src/Elastic.Markdown/Diagnostics/DiagnosticsChannel.cs b/src/Elastic.Markdown/Diagnostics/DiagnosticsChannel.cs index 9522dcee6..a9944ea75 100644 --- a/src/Elastic.Markdown/Diagnostics/DiagnosticsChannel.cs +++ b/src/Elastic.Markdown/Diagnostics/DiagnosticsChannel.cs @@ -84,6 +84,8 @@ public class DiagnosticsCollector(ILoggerFactory loggerFactory, IReadOnlyCollect public long Warnings => _warnings; public long Errors => _errors; + public HashSet OffendingFiles { get; } = new(); + public async Task StartAsync(Cancel ctx) { await Channel.WaitToWrite(); @@ -107,6 +109,7 @@ void Drain() { IncrementSeverityCount(item); HandleItem(item); + OffendingFiles.Add(item.File); foreach (var output in _outputs) output.Write(item); } diff --git a/src/Elastic.Markdown/DocumentationGenerator.cs b/src/Elastic.Markdown/DocumentationGenerator.cs index 770693f1a..c85e07243 100644 --- a/src/Elastic.Markdown/DocumentationGenerator.cs +++ b/src/Elastic.Markdown/DocumentationGenerator.cs @@ -13,12 +13,12 @@ namespace Elastic.Markdown; [JsonSourceGenerationOptions(WriteIndented = true)] [JsonSerializable(typeof(OutputState))] -internal partial class SourceGenerationContext : JsonSerializerContext -{ -} +internal partial class SourceGenerationContext : JsonSerializerContext; + public class OutputState { public DateTimeOffset LastSeenChanges { get; set; } + public string[] Conflict { get; set; } = []; } public class DocumentationGenerator @@ -87,8 +87,15 @@ public async Task GenerateAll(Cancel ctx) DocumentationSet.ClearOutputDirectory(); _logger.LogInformation($"Last write source: {DocumentationSet.LastWrite}, output observed: {OutputState?.LastSeenChanges}"); + + var offendingFiles = new HashSet(OutputState?.Conflict ?? []); var outputSeenChanges = OutputState?.LastSeenChanges ?? DateTimeOffset.MinValue; - if (DocumentationSet.LastWrite > outputSeenChanges && OutputState != null) + if (offendingFiles.Count > 0) + { + _logger.LogInformation($"Reapplying changes since {DocumentationSet.LastWrite}"); + _logger.LogInformation($"Reapplying for {offendingFiles.Count} files with errors/warnings"); + } + else if (DocumentationSet.LastWrite > outputSeenChanges && OutputState != null) _logger.LogInformation($"Using incremental build picking up changes since: {OutputState.LastSeenChanges}"); else if (DocumentationSet.LastWrite <= outputSeenChanges && OutputState != null) { @@ -108,8 +115,11 @@ public async Task GenerateAll(Cancel ctx) await Parallel.ForEachAsync(DocumentationSet.Files, ctx, async (file, token) => { - if (file.SourceFile.LastWriteTimeUtc <= outputSeenChanges) + if (offendingFiles.Contains(file.SourceFile.FullName)) + _logger.LogInformation($"Re-evaluating {file.SourceFile.FullName}"); + else if (file.SourceFile.LastWriteTimeUtc <= outputSeenChanges) return; + var item = Interlocked.Increment(ref handledItems); var outputFile = OutputFile(file.RelativePath); if (file is MarkdownFile markdown) @@ -147,7 +157,13 @@ private async Task GenerateDocumentationState(Cancel ctx) { var stateFile = DocumentationSet.OutputStateFile; _logger.LogInformation($"Writing documentation state {DocumentationSet.LastWrite} to {stateFile.FullName}"); - var state = new OutputState { LastSeenChanges = DocumentationSet.LastWrite }; + var badFiles = Context.Collector.OffendingFiles.ToArray(); + var state = new OutputState + { + LastSeenChanges = DocumentationSet.LastWrite, + Conflict = badFiles + + }; var bytes = JsonSerializer.SerializeToUtf8Bytes(state, SourceGenerationContext.Default.OutputState); await DocumentationSet.OutputPath.FileSystem.File.WriteAllBytesAsync(stateFile.FullName, bytes, ctx); } diff --git a/src/Elastic.Markdown/IO/DocumentationSet.cs b/src/Elastic.Markdown/IO/DocumentationSet.cs index 978094dc0..8f71f33ac 100644 --- a/src/Elastic.Markdown/IO/DocumentationSet.cs +++ b/src/Elastic.Markdown/IO/DocumentationSet.cs @@ -14,9 +14,10 @@ public class DocumentationSet public string Name { get; } public IDirectoryInfo SourcePath { get; } public IDirectoryInfo OutputPath { get; } - public DateTimeOffset LastWrite { get; } public IFileInfo OutputStateFile { get; } + public DateTimeOffset LastWrite { get; } + public ConfigurationFile Configuration { get; } private MarkdownParser MarkdownParser { get; }