




















@@ -1,4 +1,6 @@
11import fs from "node:fs/promises";
2+import { withProgress } from "../../cli/progress.js";
3+import type { ProgressReporter } from "../../cli/progress.js";
24import { resolveStateDir } from "../../config/paths.js";
35import type { MigrationApplyResult, MigrationProviderPlugin } from "../../plugins/types.js";
46import type { RuntimeEnv } from "../../runtime.js";
@@ -49,45 +51,74 @@ export async function runMigrationApply(params: {
4951providerId: string;
5052provider: MigrationProviderPlugin;
5153}): Promise<MigrationApplyResult> {
52-const preflightPlan =
53-params.opts.preflightPlan ??
54-(await params.provider.plan(
55-buildMigrationContext({
56-source: params.opts.source,
57-includeSecrets: params.opts.includeSecrets,
58-overwrite: params.opts.overwrite,
59-providerOptions: buildMigrationProviderOptions(params.opts),
60-runtime: params.runtime,
61-json: params.opts.json,
62-}),
63-));
64-const selectedPlan = applyMigrationPluginSelection(
65-applyMigrationSkillSelection(preflightPlan, params.opts.skills),
66-params.opts.plugins,
67-);
68-assertConflictFreePlan(selectedPlan, params.providerId);
69-const stateDir = resolveStateDir();
70-const reportDir = buildMigrationReportDir(params.providerId, stateDir);
71-const backupPath = params.opts.noBackup
72- ? undefined
73- : await createPreMigrationBackup({ output: params.opts.backupOutput });
74-await fs.mkdir(reportDir, { recursive: true });
75-const ctx = buildMigrationContext({
76-source: params.opts.source,
77-includeSecrets: params.opts.includeSecrets,
78-overwrite: params.opts.overwrite,
79-providerOptions: buildMigrationProviderOptions(params.opts),
80-runtime: params.runtime,
81- backupPath,
82- reportDir,
83-json: params.opts.json,
84-});
85-const result = await params.provider.apply(ctx, selectedPlan);
86-const withBackup = {
87- ...result,
88-backupPath: result.backupPath ?? backupPath,
89-reportDir: result.reportDir ?? reportDir,
54+const applyMigration = async (progress?: ProgressReporter) => {
55+const total = (params.opts.preflightPlan ? 0 : 1) + (params.opts.noBackup ? 0 : 1) + 1;
56+let completed = 0;
57+const tick = () => {
58+completed += 1;
59+progress?.setPercent((completed / total) * 100);
60+};
61+if (!params.opts.preflightPlan) {
62+progress?.setLabel("Preparing migration plan…");
63+}
64+const preflightPlan =
65+params.opts.preflightPlan ??
66+(await params.provider.plan(
67+buildMigrationContext({
68+source: params.opts.source,
69+includeSecrets: params.opts.includeSecrets,
70+overwrite: params.opts.overwrite,
71+providerOptions: buildMigrationProviderOptions(params.opts),
72+runtime: params.runtime,
73+json: params.opts.json,
74+}),
75+));
76+if (!params.opts.preflightPlan) {
77+tick();
78+}
79+const selectedPlan = applyMigrationPluginSelection(
80+applyMigrationSkillSelection(preflightPlan, params.opts.skills),
81+params.opts.plugins,
82+);
83+assertConflictFreePlan(selectedPlan, params.providerId);
84+const stateDir = resolveStateDir();
85+const reportDir = buildMigrationReportDir(params.providerId, stateDir);
86+if (!params.opts.noBackup) {
87+progress?.setLabel("Preparing migration backup…");
88+}
89+const backupPath = params.opts.noBackup
90+ ? undefined
91+ : await createPreMigrationBackup({ output: params.opts.backupOutput });
92+if (!params.opts.noBackup) {
93+tick();
94+}
95+await fs.mkdir(reportDir, { recursive: true });
96+const ctx = buildMigrationContext({
97+source: params.opts.source,
98+includeSecrets: params.opts.includeSecrets,
99+overwrite: params.opts.overwrite,
100+providerOptions: buildMigrationProviderOptions(params.opts),
101+runtime: params.runtime,
102+ backupPath,
103+ reportDir,
104+json: params.opts.json,
105+});
106+progress?.setLabel("Applying migration…");
107+const result = await params.provider.apply(ctx, selectedPlan);
108+tick();
109+const withBackup = {
110+ ...result,
111+backupPath: result.backupPath ?? backupPath,
112+reportDir: result.reportDir ?? reportDir,
113+};
114+return withBackup;
90115};
116+const withBackup = params.opts.json
117+ ? await applyMigration()
118+ : await withProgress(
119+{ label: `Applying ${params.providerId} migration…` },
120+async (progress) => await applyMigration(progress),
121+);
91122writeApplyResult(params.runtime, params.opts, withBackup);
92123assertApplySucceeded(withBackup);
93124return withBackup;
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。