e71c34acb2
Previously returned archivedLegacyConfig which was false when archive rename failed, even though the canonical file was successfully written. Archive failure is secondary cleanup and should not be reported as migration failure. 🤖 Generated with OhMyOpenCode assistance https://github.com/code-yeongyu/oh-my-opencode
67 lines
2.2 KiB
TypeScript
67 lines
2.2 KiB
TypeScript
import { existsSync, readFileSync, renameSync, rmSync } from "node:fs"
|
|
import { join, dirname, basename } from "node:path"
|
|
|
|
import { log } from "./logger"
|
|
import { CONFIG_BASENAME, LEGACY_CONFIG_BASENAME } from "./plugin-identity"
|
|
import { writeFileAtomically } from "./write-file-atomically"
|
|
|
|
function buildCanonicalPath(legacyPath: string): string {
|
|
const dir = dirname(legacyPath)
|
|
const ext = basename(legacyPath).includes(".jsonc") ? ".jsonc" : ".json"
|
|
return join(dir, `${CONFIG_BASENAME}${ext}`)
|
|
}
|
|
|
|
function archiveLegacyConfigFile(legacyPath: string): boolean {
|
|
const backupPath = `${legacyPath}.bak`
|
|
|
|
try {
|
|
renameSync(legacyPath, backupPath)
|
|
log("[migrateLegacyConfigFile] Legacy config was migrated and renamed to backup. Update the canonical file only.", {
|
|
legacyPath,
|
|
backupPath,
|
|
})
|
|
return true
|
|
} catch (renameError) {
|
|
try {
|
|
rmSync(legacyPath)
|
|
log("[migrateLegacyConfigFile] Legacy config was migrated and removed after backup rename failed. Update the canonical file only.", {
|
|
legacyPath,
|
|
backupPath,
|
|
renameError,
|
|
})
|
|
return true
|
|
} catch (removeError) {
|
|
log("[migrateLegacyConfigFile] WARNING: canonical config was written but the legacy file still exists and will be ignored. Remove or rename it manually.", {
|
|
legacyPath,
|
|
backupPath,
|
|
renameError,
|
|
removeError,
|
|
})
|
|
return false
|
|
}
|
|
}
|
|
}
|
|
|
|
export function migrateLegacyConfigFile(legacyPath: string): boolean {
|
|
if (!existsSync(legacyPath)) return false
|
|
if (!basename(legacyPath).startsWith(LEGACY_CONFIG_BASENAME)) return false
|
|
|
|
const canonicalPath = buildCanonicalPath(legacyPath)
|
|
if (existsSync(canonicalPath)) return false
|
|
|
|
try {
|
|
const content = readFileSync(legacyPath, "utf-8")
|
|
writeFileAtomically(canonicalPath, content)
|
|
const archivedLegacyConfig = archiveLegacyConfigFile(legacyPath)
|
|
log("[migrateLegacyConfigFile] Migrated legacy config to canonical path", {
|
|
from: legacyPath,
|
|
to: canonicalPath,
|
|
archivedLegacyConfig,
|
|
})
|
|
return true
|
|
} catch (error) {
|
|
log("[migrateLegacyConfigFile] Failed to migrate legacy config file", { legacyPath, error })
|
|
return false
|
|
}
|
|
}
|