Files
oh-my-opencode/src/shared/write-file-atomically.ts
T
YeonGyu-Kim 7accb53cbb fix(shared): handle Windows rename-over-existing in write-file-atomically (#3222)
On Windows, renameSync fails with EPERM/EACCES when the target file
already exists. Fall back to unlink + rename on Windows permission
errors while preserving atomic semantics on other platforms.

🤖 Generated with OhMyOpenCode assistance
https://github.com/code-yeongyu/oh-my-opencode
2026-04-12 02:28:05 +09:00

29 lines
805 B
TypeScript

import { closeSync, fsyncSync, openSync, renameSync, unlinkSync, writeFileSync } from "node:fs"
export function writeFileAtomically(filePath: string, content: string): void {
const tempPath = `${filePath}.tmp`
writeFileSync(tempPath, content, "utf-8")
const tempFileDescriptor = openSync(tempPath, "r")
try {
fsyncSync(tempFileDescriptor)
} finally {
closeSync(tempFileDescriptor)
}
try {
renameSync(tempPath, filePath)
} catch (error) {
const isWindows = process.platform === "win32"
const isPermissionError =
error instanceof Error &&
(error.message.includes("EPERM") || error.message.includes("EACCES"))
if (isWindows && isPermissionError) {
unlinkSync(filePath)
renameSync(tempPath, filePath)
} else {
throw error
}
}
}