Infra: handle win32 unknown inode in file identity checks

This commit is contained in:
Onur
2026-02-26 23:41:08 +01:00
parent 7853c4fb7f
commit 96fc5ddfb3
2 changed files with 19 additions and 2 deletions

View File

@@ -27,7 +27,17 @@ describe("sameFileIdentity", () => {
expect(sameFileIdentity(stat(7, 11), stat(8, 11), "win32")).toBe(false);
});
it("accepts win32 inode mismatch when either side is 0", () => {
expect(sameFileIdentity(stat(7, 0), stat(7, 11), "win32")).toBe(true);
expect(sameFileIdentity(stat(7, 12), stat(7, 0), "win32")).toBe(true);
});
it("keeps inode strictness on non-windows", () => {
expect(sameFileIdentity(stat(7, 0), stat(7, 11), "linux")).toBe(false);
});
it("handles bigint stats", () => {
expect(sameFileIdentity(stat(0n, 11n), stat(8n, 11n), "win32")).toBe(true);
expect(sameFileIdentity(stat(7n, 0n), stat(7n, 11n), "win32")).toBe(true);
});
});

View File

@@ -7,12 +7,19 @@ function isZero(value: number | bigint): boolean {
return value === 0 || value === 0n;
}
function isUnknownIdentity(value: number | bigint): boolean {
return isZero(value);
}
export function sameFileIdentity(
left: FileIdentityStat,
right: FileIdentityStat,
platform: NodeJS.Platform = process.platform,
): boolean {
if (left.ino !== right.ino) {
const inodeMatches =
left.ino === right.ino ||
(platform === "win32" && (isUnknownIdentity(left.ino) || isUnknownIdentity(right.ino)));
if (!inodeMatches) {
return false;
}
@@ -21,5 +28,5 @@ export function sameFileIdentity(
if (left.dev === right.dev) {
return true;
}
return platform === "win32" && (isZero(left.dev) || isZero(right.dev));
return platform === "win32" && (isUnknownIdentity(left.dev) || isUnknownIdentity(right.dev));
}