From 67c613788fdaecbe5200ee23c4e5c2c6b9d57f87 Mon Sep 17 00:00:00 2001 From: augushong Date: Mon, 25 May 2026 22:44:34 +0800 Subject: [PATCH] =?UTF-8?q?feat(update):=20=E5=86=B2=E7=AA=81=E7=AD=96?= =?UTF-8?q?=E7=95=A5=E5=8F=82=E6=95=B0=E6=9B=BF=E4=BB=A3=E4=BA=A4=E4=BA=92?= =?UTF-8?q?=E7=A1=AE=E8=AE=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/service/AdminUpdateServiceBase.php | 47 ++++++++++++++++++- 1 file changed, 45 insertions(+), 2 deletions(-) diff --git a/extend/base/admin/service/AdminUpdateServiceBase.php b/extend/base/admin/service/AdminUpdateServiceBase.php index 3b76f10..c6a37a1 100644 --- a/extend/base/admin/service/AdminUpdateServiceBase.php +++ b/extend/base/admin/service/AdminUpdateServiceBase.php @@ -268,9 +268,32 @@ class AdminUpdateServiceBase } if (!empty($optional_update_waring_files)) { + $strategy = $this->optionalConflict ?: null; // empty string → null if ($this->dryRun) { - $need_process_files = array_merge($need_process_files, $optional_update_waring_files); + if ($strategy === null) { + // 未传参数:保持现有 dry-run 行为(合并所有冲突文件) + $need_process_files = array_merge($need_process_files, $optional_update_waring_files); + } else { + // 显式传了策略:按策略决定 + $effective = ($strategy === 'ask') ? 'skip' : $strategy; + if ($effective === 'overwrite') { + $need_process_files = array_merge($need_process_files, $optional_update_waring_files); + } else { + // skip: 记录被跳过的文件(供输出增强使用) + $this->skippedConflictFiles = array_merge( + $this->skippedConflictFiles, + array_map(fn($t) => ['type' => $t, 'category' => 'optional'], $optional_update_waring_files) + ); + } + } + } elseif ($strategy !== null && $strategy !== 'ask') { + // 显式指定了非 ask 策略,静默处理 + if ($strategy === 'overwrite') { + $need_process_files = array_merge($need_process_files, $optional_update_waring_files); + } + // skip: 不加入 } else { + // null 或 ask: 走原有交互确认(完全保持现有行为) foreach ($optional_update_waring_files as $file_path => $type) { $output->writeln($file_path . ' ' . $type); } @@ -287,9 +310,29 @@ class AdminUpdateServiceBase } if (!empty($force_update_waring_files)) { + $strategy = $this->forceConflict ?: null; // empty string → null if ($this->dryRun) { - $need_process_files = array_merge($need_process_files, $force_update_waring_files); + if ($strategy === null) { + // 未传参数:保持现有 dry-run 行为(合并所有冲突文件) + $need_process_files = array_merge($need_process_files, $force_update_waring_files); + } else { + $effective = ($strategy === 'ask') ? 'overwrite' : $strategy; + if ($effective === 'overwrite') { + $need_process_files = array_merge($need_process_files, $force_update_waring_files); + } else { + // skip: 记录被跳过的文件 + $this->skippedConflictFiles = array_merge( + $this->skippedConflictFiles, + array_map(fn($t) => ['type' => $t, 'category' => 'force'], $force_update_waring_files) + ); + } + } + } elseif ($strategy !== null && $strategy !== 'ask') { + if ($strategy === 'overwrite') { + $need_process_files = array_merge($need_process_files, $force_update_waring_files); + } } else { + // null 或 ask: 走原有交互确认 foreach ($force_update_waring_files as $file_path => $type) { $output->writeln($file_path . ' ' . $type); }