Skip to content

Commit 6275765

Browse files
feat: handle cross-device rename error in rotateModulesDirectory function
1 parent 2b5cc94 commit 6275765

File tree

1 file changed

+29
-2
lines changed

1 file changed

+29
-2
lines changed

scripts/get-modules.ts

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
// @ts-nocheck
22
import path from "node:path";
3-
import { rename, rm } from "node:fs/promises";
3+
import { cp, rename, rm } from "node:fs/promises";
44
import process from "node:process";
55
import { fileURLToPath } from "node:url";
66

@@ -167,12 +167,39 @@ const rateLimiter =
167167
: null;
168168
const httpClient = createHttpClient(rateLimiter ? { rateLimiter } : {});
169169

170+
function isCrossDeviceRenameError(error: unknown) {
171+
if (!error || typeof error !== "object") {
172+
return false;
173+
}
174+
175+
const candidate = error as { code?: unknown; message?: unknown };
176+
if (candidate.code === "EXDEV") {
177+
return true;
178+
}
179+
180+
if (typeof candidate.message === "string" && candidate.message.includes("EXDEV")) {
181+
return true;
182+
}
183+
184+
return false;
185+
}
186+
170187
async function rotateModulesDirectory() {
171188
const modulesExists = await fileExists(MODULES_DIR);
172189

173190
if (modulesExists) {
174191
await rm(MODULES_TEMP_DIR, { recursive: true, force: true });
175-
await rename(MODULES_DIR, MODULES_TEMP_DIR);
192+
try {
193+
await rename(MODULES_DIR, MODULES_TEMP_DIR);
194+
} catch (error) {
195+
if (isCrossDeviceRenameError(error)) {
196+
logger.warn("Unable to rename modules directory due to cross-device link; falling back to copy/delete.");
197+
await cp(MODULES_DIR, MODULES_TEMP_DIR, { recursive: true });
198+
await rm(MODULES_DIR, { recursive: true, force: true });
199+
} else {
200+
throw error;
201+
}
202+
}
176203
} else {
177204
await ensureDirectory(MODULES_TEMP_DIR);
178205
}

0 commit comments

Comments
 (0)