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
},