diff --git a/src/ModularPipelines/Context/LinuxInstaller.cs b/src/ModularPipelines/Context/LinuxInstaller.cs index d55683981b..f9760bd804 100644 --- a/src/ModularPipelines/Context/LinuxInstaller.cs +++ b/src/ModularPipelines/Context/LinuxInstaller.cs @@ -20,7 +20,7 @@ public virtual async Task InstallFromDpkg(DpkgInstallOptions opti { var linuxInstallationResult = await _command.ExecuteCommandLineTool(options).ConfigureAwait(false); - await _aptGet.Install(new AptGetInstallOptions(null!) + await _aptGet.Install(new AptGetInstallOptions { FixBroken = true, }).ConfigureAwait(false); diff --git a/src/ModularPipelines/Models/ModuleResult.cs b/src/ModularPipelines/Models/ModuleResult.cs index 130be9358c..2c6c07105f 100644 --- a/src/ModularPipelines/Models/ModuleResult.cs +++ b/src/ModularPipelines/Models/ModuleResult.cs @@ -447,32 +447,43 @@ internal sealed class ModuleResultJsonConverter : JsonConverter new ModuleResult.Success(value!) - { - ModuleName = moduleName!, - ModuleDuration = moduleDuration, - ModuleStart = moduleStart, - ModuleEnd = moduleEnd, - ModuleStatus = moduleStatus - }, - "Failure" => new ModuleResult.Failure(exception!) - { - ModuleName = moduleName!, - ModuleDuration = moduleDuration, - ModuleStart = moduleStart, - ModuleEnd = moduleEnd, - ModuleStatus = moduleStatus - }, - "Skipped" => new ModuleResult.Skipped(skipDecision!) - { - ModuleName = moduleName!, - ModuleDuration = moduleDuration, - ModuleStart = moduleStart, - ModuleEnd = moduleEnd, - ModuleStatus = moduleStatus - }, + "Success" => value is not null + ? new ModuleResult.Success(value) + { + ModuleName = moduleName, + ModuleDuration = moduleDuration, + ModuleStart = moduleStart, + ModuleEnd = moduleEnd, + ModuleStatus = moduleStatus + } + : throw new JsonException("Success result requires a Value property in the JSON."), + "Failure" => exception is not null + ? new ModuleResult.Failure(exception) + { + ModuleName = moduleName, + ModuleDuration = moduleDuration, + ModuleStart = moduleStart, + ModuleEnd = moduleEnd, + ModuleStatus = moduleStatus + } + : throw new JsonException("Failure result requires an Exception property in the JSON."), + "Skipped" => skipDecision is not null + ? new ModuleResult.Skipped(skipDecision) + { + ModuleName = moduleName, + ModuleDuration = moduleDuration, + ModuleStart = moduleStart, + ModuleEnd = moduleEnd, + ModuleStatus = moduleStatus + } + : throw new JsonException("Skipped result requires a Decision property in the JSON."), _ => throw new JsonException($"Unknown discriminator: {discriminator}") }; } diff --git a/src/ModularPipelines/Options/Linux/AptGet/AptGetInstallOptions.cs b/src/ModularPipelines/Options/Linux/AptGet/AptGetInstallOptions.cs index df297b324d..d312654e1e 100644 --- a/src/ModularPipelines/Options/Linux/AptGet/AptGetInstallOptions.cs +++ b/src/ModularPipelines/Options/Linux/AptGet/AptGetInstallOptions.cs @@ -6,6 +6,20 @@ namespace ModularPipelines.Options.Linux.AptGet; [ExcludeFromCodeCoverage] public record AptGetInstallOptions : AptGetOptions { + /// + /// Initializes a new instance of the class + /// without specifying a package. Use this when running commands like + /// apt-get install --fix-broken that don't require a package name. + /// + public AptGetInstallOptions() + { + } + + /// + /// Initializes a new instance of the class + /// with the specified package to install. + /// + /// The name of the package to install. public AptGetInstallOptions(string package) { Package = package; @@ -15,5 +29,5 @@ public AptGetInstallOptions(string package) public virtual string CommandName { get; } = "install"; [CliArgument(Placement = ArgumentPlacement.AfterOptions)] - public virtual string Package { get; } + public virtual string? Package { get; } } \ No newline at end of file