From a75c3adc4fec0f1e72fa737ea00fcb8a558b9ff6 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Sun, 26 Apr 2026 11:11:46 +0100 Subject: [PATCH] refactor: centralize plugin update outcome logging --- src/cli/plugins-update-command.ts | 33 ++++++------------------------ src/cli/plugins-update-outcomes.ts | 26 +++++++++++++++++++++++ 2 files changed, 32 insertions(+), 27 deletions(-) create mode 100644 src/cli/plugins-update-outcomes.ts diff --git a/src/cli/plugins-update-command.ts b/src/cli/plugins-update-command.ts index c288a8129f2..0b55d313f64 100644 --- a/src/cli/plugins-update-command.ts +++ b/src/cli/plugins-update-command.ts @@ -10,6 +10,7 @@ import { defaultRuntime } from "../runtime.js"; import { theme } from "../terminal/theme.js"; import { commitPluginInstallRecordsWithConfig } from "./plugins-install-record-commit.js"; import { refreshPluginRegistryAfterConfigMutation } from "./plugins-registry-refresh.js"; +import { logPluginUpdateOutcomes } from "./plugins-update-outcomes.js"; import { resolveHookPackUpdateSelection, resolvePluginUpdateSelection, @@ -92,29 +93,10 @@ export async function runPluginUpdateCommand(params: { }, }); - for (const outcome of pluginResult.outcomes) { - if (outcome.status === "error") { - defaultRuntime.log(theme.error(outcome.message)); - continue; - } - if (outcome.status === "skipped") { - defaultRuntime.log(theme.warn(outcome.message)); - continue; - } - defaultRuntime.log(outcome.message); - } - - for (const outcome of hookResult.outcomes) { - if (outcome.status === "error") { - defaultRuntime.log(theme.error(outcome.message)); - continue; - } - if (outcome.status === "skipped") { - defaultRuntime.log(theme.warn(outcome.message)); - continue; - } - defaultRuntime.log(outcome.message); - } + const outcomeSummary = logPluginUpdateOutcomes({ + outcomes: [...pluginResult.outcomes, ...hookResult.outcomes], + log: (message) => defaultRuntime.log(message), + }); if (!params.opts.dryRun && (pluginResult.changed || hookResult.changed)) { const nextPluginInstallRecords = pluginResult.config.plugins?.installs ?? {}; @@ -147,10 +129,7 @@ export async function runPluginUpdateCommand(params: { defaultRuntime.log("Restart the gateway to load plugins and hooks."); } - if ( - pluginResult.outcomes.some((outcome) => outcome.status === "error") || - hookResult.outcomes.some((outcome) => outcome.status === "error") - ) { + if (outcomeSummary.hasErrors) { defaultRuntime.exit(1); } } diff --git a/src/cli/plugins-update-outcomes.ts b/src/cli/plugins-update-outcomes.ts new file mode 100644 index 00000000000..699fbf4e51c --- /dev/null +++ b/src/cli/plugins-update-outcomes.ts @@ -0,0 +1,26 @@ +import { theme } from "../terminal/theme.js"; + +export type PluginUpdateCliOutcome = { + status: string; + message: string; +}; + +export function logPluginUpdateOutcomes(params: { + outcomes: readonly PluginUpdateCliOutcome[]; + log: (message: string) => void; +}): { hasErrors: boolean } { + let hasErrors = false; + for (const outcome of params.outcomes) { + if (outcome.status === "error") { + hasErrors = true; + params.log(theme.error(outcome.message)); + continue; + } + if (outcome.status === "skipped") { + params.log(theme.warn(outcome.message)); + continue; + } + params.log(outcome.message); + } + return { hasErrors }; +}