@samitouri / QOSami-HFS / commits / 2fa0f48d

fix: possible EXDEV error moving a file

Massimo Melina committed Feb 6, 2024 at 22:16 UTC 2fa0f48d092fa56873a38c373e176dbc11a19f8c
1 file changed +8 -3
src/frontEndApis.ts
+8 -3
@@ -11,7 +11,7 @@ import {
11 HTTP_NOT_FOUND, HTTP_SERVER_ERROR, HTTP_UNAUTHORIZED
12 } from './const'
13 import { hasPermission, statusCodeForMissingPerm, urlToNode } from './vfs'
14 -import { mkdir, rename, rm } from 'fs/promises'
14 +import { mkdir, rename, rm, copyFile, unlink } from 'fs/promises'
15 import { basename, dirname, join } from 'path'
16 import { getUploadMeta } from './upload'
17 import { apiAssertTypes } from './misc'
@@ -127,9 +127,14 @@ export const frontEndApis: ApiHandlers = {
127 if (typeof src !== 'string') return HTTP_BAD_REQUEST
128 const srcNode = await urlToNode(src, ctx)
129 if (!srcNode) return HTTP_NOT_FOUND
130 + const s = srcNode.source!
131 + const d = join(destNode!.source!, basename(srcNode.source!))
132 return statusCodeForMissingPerm(srcNode, 'can_delete', ctx)
131 - || rename(srcNode.source!, join(destNode!.source!, basename(srcNode.source!)))
132 - .catch(e => e.code || String(e))
133 + || rename(s, d).catch(async e => {
134 + if (e.code !== 'EXDEV') throw e // exdev = different drive
135 + await copyFile(s, d)
136 + await unlink(s)
137 + }).catch(e => e.code || String(e))
138 }))
139 }
140 },