From 18587cc673145cfee8b7f718601c430d432254ab Mon Sep 17 00:00:00 2001 From: Mattias Karlsson Date: Fri, 5 Dec 2025 23:23:38 +0100 Subject: [PATCH] GH45: Fix missing exception handling in GeneratorScriptHost Add top-level exception handling to GeneratorScriptHost to match BuildScriptHost behavior. This ensures CakeReportException reports are displayed before rethrowing, providing consistent error output between `dotnet cake` and `dotnet cake.cs` commands. * Fixes #45 --- ...RunGenerators#CakeScriptHost.g.verified.cs | 34 ++++++++++++++++--- ...inMethodCalls#CakeScriptHost.g.verified.cs | 34 ++++++++++++++++--- ...s_WithModules#CakeScriptHost.g.verified.cs | 34 ++++++++++++++++--- .../CakeGenerator.Generate.ScriptHost.cs | 34 ++++++++++++++++--- 4 files changed, 120 insertions(+), 16 deletions(-) diff --git a/src/Cake.Generator.Core.Tests/Unit/CakeGeneratorTests.RunGenerators#CakeScriptHost.g.verified.cs b/src/Cake.Generator.Core.Tests/Unit/CakeGeneratorTests.RunGenerators#CakeScriptHost.g.verified.cs index 34c690f..8ec99fb 100644 --- a/src/Cake.Generator.Core.Tests/Unit/CakeGeneratorTests.RunGenerators#CakeScriptHost.g.verified.cs +++ b/src/Cake.Generator.Core.Tests/Unit/CakeGeneratorTests.RunGenerators#CakeScriptHost.g.verified.cs @@ -46,18 +46,44 @@ private class GeneratorScriptHost(ICakeEngine engine, ICakeContext context, IExe public override async Task RunTargetAsync(string target) { Settings.SetTarget(target); - var report = await Engine.RunTargetAsync(Context, strategy, Settings); - reporter.Write(report); + var report = await internalRunTargetAsync(); return report; } public override async Task RunTargetsAsync(IEnumerable targets) { Settings.SetTargets(targets); - var report = await Engine.RunTargetAsync(Context, strategy, Settings); - reporter.Write(report); + var report = await internalRunTargetAsync(); return report; } + + private async Task internalRunTargetAsync() + { + try + { + var report = await Engine + .RunTargetAsync(Context, strategy, Settings) + .ConfigureAwait(false); + + if (report != null && !report.IsEmpty) + { + reporter.Write(report); + } + + ArgumentNullException.ThrowIfNull(report); + + return report; + } + catch (CakeReportException cre) + { + if (cre.Report != null && !cre.Report.IsEmpty) + { + reporter.Write(cre.Report); + } + + throw; + } + } } /// diff --git a/src/Cake.Generator.Core.Tests/Unit/CakeGeneratorTests.RunGenerators_WithMainMethods_GeneratesMainMethodCalls#CakeScriptHost.g.verified.cs b/src/Cake.Generator.Core.Tests/Unit/CakeGeneratorTests.RunGenerators_WithMainMethods_GeneratesMainMethodCalls#CakeScriptHost.g.verified.cs index f5032b2..cf23a1a 100644 --- a/src/Cake.Generator.Core.Tests/Unit/CakeGeneratorTests.RunGenerators_WithMainMethods_GeneratesMainMethodCalls#CakeScriptHost.g.verified.cs +++ b/src/Cake.Generator.Core.Tests/Unit/CakeGeneratorTests.RunGenerators_WithMainMethods_GeneratesMainMethodCalls#CakeScriptHost.g.verified.cs @@ -47,18 +47,44 @@ private class GeneratorScriptHost(ICakeEngine engine, ICakeContext context, IExe public override async Task RunTargetAsync(string target) { Settings.SetTarget(target); - var report = await Engine.RunTargetAsync(Context, strategy, Settings); - reporter.Write(report); + var report = await internalRunTargetAsync(); return report; } public override async Task RunTargetsAsync(IEnumerable targets) { Settings.SetTargets(targets); - var report = await Engine.RunTargetAsync(Context, strategy, Settings); - reporter.Write(report); + var report = await internalRunTargetAsync(); return report; } + + private async Task internalRunTargetAsync() + { + try + { + var report = await Engine + .RunTargetAsync(Context, strategy, Settings) + .ConfigureAwait(false); + + if (report != null && !report.IsEmpty) + { + reporter.Write(report); + } + + ArgumentNullException.ThrowIfNull(report); + + return report; + } + catch (CakeReportException cre) + { + if (cre.Report != null && !cre.Report.IsEmpty) + { + reporter.Write(cre.Report); + } + + throw; + } + } } /// diff --git a/src/Cake.Generator.Core.Tests/Unit/CakeGeneratorTests.RunGenerators_WithModules#CakeScriptHost.g.verified.cs b/src/Cake.Generator.Core.Tests/Unit/CakeGeneratorTests.RunGenerators_WithModules#CakeScriptHost.g.verified.cs index 34c690f..8ec99fb 100644 --- a/src/Cake.Generator.Core.Tests/Unit/CakeGeneratorTests.RunGenerators_WithModules#CakeScriptHost.g.verified.cs +++ b/src/Cake.Generator.Core.Tests/Unit/CakeGeneratorTests.RunGenerators_WithModules#CakeScriptHost.g.verified.cs @@ -46,18 +46,44 @@ private class GeneratorScriptHost(ICakeEngine engine, ICakeContext context, IExe public override async Task RunTargetAsync(string target) { Settings.SetTarget(target); - var report = await Engine.RunTargetAsync(Context, strategy, Settings); - reporter.Write(report); + var report = await internalRunTargetAsync(); return report; } public override async Task RunTargetsAsync(IEnumerable targets) { Settings.SetTargets(targets); - var report = await Engine.RunTargetAsync(Context, strategy, Settings); - reporter.Write(report); + var report = await internalRunTargetAsync(); return report; } + + private async Task internalRunTargetAsync() + { + try + { + var report = await Engine + .RunTargetAsync(Context, strategy, Settings) + .ConfigureAwait(false); + + if (report != null && !report.IsEmpty) + { + reporter.Write(report); + } + + ArgumentNullException.ThrowIfNull(report); + + return report; + } + catch (CakeReportException cre) + { + if (cre.Report != null && !cre.Report.IsEmpty) + { + reporter.Write(cre.Report); + } + + throw; + } + } } /// diff --git a/src/Cake.Generator.Core/CakeGenerator.Generate.ScriptHost.cs b/src/Cake.Generator.Core/CakeGenerator.Generate.ScriptHost.cs index e02b68c..c77c43e 100644 --- a/src/Cake.Generator.Core/CakeGenerator.Generate.ScriptHost.cs +++ b/src/Cake.Generator.Core/CakeGenerator.Generate.ScriptHost.cs @@ -76,18 +76,44 @@ private class GeneratorScriptHost(ICakeEngine engine, ICakeContext context, IExe public override async Task RunTargetAsync(string target) { Settings.SetTarget(target); - var report = await Engine.RunTargetAsync(Context, strategy, Settings); - reporter.Write(report); + var report = await internalRunTargetAsync(); return report; } public override async Task RunTargetsAsync(IEnumerable targets) { Settings.SetTargets(targets); - var report = await Engine.RunTargetAsync(Context, strategy, Settings); - reporter.Write(report); + var report = await internalRunTargetAsync(); return report; } + + private async Task internalRunTargetAsync() + { + try + { + var report = await Engine + .RunTargetAsync(Context, strategy, Settings) + .ConfigureAwait(false); + + if (report != null && !report.IsEmpty) + { + reporter.Write(report); + } + + ArgumentNullException.ThrowIfNull(report); + + return report; + } + catch (CakeReportException cre) + { + if (cre.Report != null && !cre.Report.IsEmpty) + { + reporter.Write(cre.Report); + } + + throw; + } + } } """);