


























@@ -19,6 +19,7 @@ import { resolveGatewayInstallEntrypoint } from "../../daemon/gateway-entrypoint
1919import { resolveGatewayRestartLogPath } from "../../daemon/restart-logs.js";
2020import { resolveGatewayService } from "../../daemon/service.js";
2121import { createLowDiskSpaceWarning } from "../../infra/disk-space.js";
22+import { runGlobalPackageUpdateSteps } from "../../infra/package-update-steps.js";
2223import { nodeVersionSatisfiesEngine } from "../../infra/runtime-guard.js";
2324import {
2425channelToNpmTag,
@@ -33,13 +34,10 @@ import {
3334checkUpdateStatus,
3435} from "../../infra/update-check.js";
3536import {
36-collectInstalledGlobalPackageErrors,
3737canResolveRegistryVersionForPackageTarget,
3838createGlobalInstallEnv,
3939cleanupGlobalRenameDirs,
40-globalInstallFallbackArgs,
4140globalInstallArgs,
42-resolveExpectedInstalledVersionFromSpec,
4341resolveGlobalInstallTarget,
4442resolveGlobalInstallSpec,
4543} from "../../infra/update-global.js";
@@ -399,86 +397,45 @@ async function runPackageInstallUpdate(params: {
399397}
400398}
401399402-const updateStep = await runUpdateStep({
403-name: "global update",
404-argv: globalInstallArgs(installTarget, installSpec),
405-env: installEnv,
400+const packageUpdate = await runGlobalPackageUpdateSteps({
401+ installTarget,
402+ installSpec,
403+ packageName,
404+packageRoot: pkgRoot,
405+ runCommand,
406406timeoutMs: params.timeoutMs,
407-progress: params.progress,
408-});
409-410-const steps = [updateStep];
411-let finalInstallStep = updateStep;
412-if (updateStep.exitCode !== 0) {
413-const fallbackArgv = globalInstallFallbackArgs(installTarget, installSpec);
414-if (fallbackArgv) {
415-const fallbackStep = await runUpdateStep({
416-name: "global update (omit optional)",
417-argv: fallbackArgv,
418-env: installEnv,
419-timeoutMs: params.timeoutMs,
420-progress: params.progress,
421-});
422-steps.push(fallbackStep);
423-finalInstallStep = fallbackStep;
424-}
425-}
426-let afterVersion = beforeVersion;
427-428-const verifiedPackageRoot =
429-(
430-await resolveGlobalInstallTarget({
431-manager: installTarget,
432- runCommand,
433-timeoutMs: params.timeoutMs,
434-})
435-).packageRoot ?? pkgRoot;
436-if (verifiedPackageRoot) {
437-afterVersion = await readPackageVersion(verifiedPackageRoot);
438-const expectedVersion = resolveExpectedInstalledVersionFromSpec(packageName, installSpec);
439-const verificationErrors = await collectInstalledGlobalPackageErrors({
440-packageRoot: verifiedPackageRoot,
441- expectedVersion,
442-});
443-if (verificationErrors.length > 0) {
444-steps.push({
445-name: "global install verify",
446-command: `verify ${verifiedPackageRoot}`,
447-cwd: verifiedPackageRoot,
448-durationMs: 0,
449-exitCode: 1,
450-stderrTail: verificationErrors.join("\n"),
451-stdoutTail: null,
452-});
453-}
454-const entryPath = await resolveGatewayInstallEntrypoint(verifiedPackageRoot);
455-if (entryPath) {
456-const doctorStep = await runUpdateStep({
457-name: `${CLI_NAME} doctor`,
458-argv: [resolveNodeRunner(), entryPath, "doctor", "--non-interactive", "--fix"],
459-env: {
460- ...process.env,
461-OPENCLAW_UPDATE_IN_PROGRESS: "1",
462-},
463-timeoutMs: params.timeoutMs,
407+ ...(installEnv === undefined ? {} : { env: installEnv }),
408+runStep: (stepParams) =>
409+runUpdateStep({
410+ ...stepParams,
464411progress: params.progress,
465-});
466-steps.push(doctorStep);
467-}
468-}
412+}),
413+postVerifyStep: async (verifiedPackageRoot) => {
414+const entryPath = await resolveGatewayInstallEntrypoint(verifiedPackageRoot);
415+if (entryPath) {
416+return await runUpdateStep({
417+name: `${CLI_NAME} doctor`,
418+argv: [resolveNodeRunner(), entryPath, "doctor", "--non-interactive", "--fix"],
419+env: {
420+ ...process.env,
421+OPENCLAW_UPDATE_IN_PROGRESS: "1",
422+},
423+timeoutMs: params.timeoutMs,
424+progress: params.progress,
425+});
426+}
427+return null;
428+},
429+});
469430470-const failedStep =
471-finalInstallStep.exitCode !== 0
472- ? finalInstallStep
473- : (steps.find((step) => step !== updateStep && step.exitCode !== 0) ?? null);
474431return {
475-status: failedStep ? "error" : "ok",
432+status: packageUpdate.failedStep ? "error" : "ok",
476433mode: manager,
477-root: verifiedPackageRoot ?? params.root,
478-reason: failedStep ? failedStep.name : undefined,
434+root: packageUpdate.verifiedPackageRoot ?? params.root,
435+reason: packageUpdate.failedStep ? packageUpdate.failedStep.name : undefined,
479436before: { version: beforeVersion },
480-after: { version: afterVersion },
481- steps,
437+after: { version: packageUpdate.afterVersion ?? beforeVersion },
438+steps: packageUpdate.steps,
482439durationMs: Date.now() - params.startedAt,
483440};
484441}
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。