()
| 625 | * 7. 留 MOVED.txt 说明文件 |
| 626 | */ |
| 627 | export function migrateToUnifiedDirs(): { success: boolean; error?: string } { |
| 628 | const oldDataDir = resolveOldElectronDataDir() |
| 629 | const systemDir = getSystemDataDir() |
| 630 | |
| 631 | console.log(`[Migration] Starting unified dir migration: ${oldDataDir} → ${systemDir}`) |
| 632 | |
| 633 | try { |
| 634 | // Step 1: 创建系统目录 |
| 635 | ensureDir(systemDir) |
| 636 | |
| 637 | // Step 2: 如果当前 user_data_dir 指向了别处(如 CLI 写入的默认路径), |
| 638 | // 且那里有数据库,先合并到旧 Electron 路径 |
| 639 | const config = loadConfig() |
| 640 | const prevUserDataDir = config.data.user_data_dir |
| 641 | if (prevUserDataDir && path.resolve(prevUserDataDir) !== path.resolve(oldDataDir)) { |
| 642 | const prevDbDir = path.join(prevUserDataDir, 'databases') |
| 643 | const oldDbDir = path.join(oldDataDir, 'databases') |
| 644 | if (fs.existsSync(prevDbDir)) { |
| 645 | const dbFiles = fs.readdirSync(prevDbDir).filter((f) => f.endsWith('.db')) |
| 646 | if (dbFiles.length > 0) { |
| 647 | ensureDir(oldDbDir) |
| 648 | const result = copyDirMerge(prevDbDir, oldDbDir, ensureDir) |
| 649 | console.log( |
| 650 | `[Migration] Merged ${result.copied} databases from ${prevDbDir} to ${oldDbDir} (skipped ${result.skipped})` |
| 651 | ) |
| 652 | } |
| 653 | } |
| 654 | } |
| 655 | |
| 656 | // Step 3: 写入 config.toml(数据库保留在旧 Electron 路径) |
| 657 | writeConfigField('data', 'user_data_dir', oldDataDir) |
| 658 | _userDataDir = oldDataDir |
| 659 | |
| 660 | // 如果 storage.json 有自定义 dataDir,也记录日志 |
| 661 | const storageConfig = readStorageConfig() |
| 662 | if (storageConfig.dataDir) { |
| 663 | console.log(`[Migration] Migrated storage.json custom path: ${storageConfig.dataDir}`) |
| 664 | } |
| 665 | |
| 666 | // Step 4: 复制系统数据(合并,不覆盖 ~/.chatlab/ 下已有的文件) |
| 667 | const movedDirs: string[] = [] |
| 668 | const failedDirs: string[] = [] |
| 669 | |
| 670 | for (const subDir of SYSTEM_SUBDIRS) { |
| 671 | const srcDir = path.join(oldDataDir, subDir) |
| 672 | const destDir = path.join(systemDir, subDir) |
| 673 | |
| 674 | if (!fs.existsSync(srcDir)) continue |
| 675 | |
| 676 | try { |
| 677 | ensureDir(destDir) |
| 678 | const mergeResult = copyDirMerge(srcDir, destDir, ensureDir) |
| 679 | |
| 680 | if (mergeResult.copied > 0 || mergeResult.skipped > 0) { |
| 681 | movedDirs.push(subDir) |
| 682 | console.log(`[Migration] ${subDir}: copied ${mergeResult.copied}, skipped ${mergeResult.skipped}`) |
| 683 | } |
| 684 | } catch (err) { |
no test coverage detected