From 96fc5ddfb39762aa078d70dd4b4d3754e49a159b Mon Sep 17 00:00:00 2001 From: Onur <2453968+osolmaz@users.noreply.github.com> Date: Thu, 26 Feb 2026 23:41:08 +0100 Subject: [PATCH] Infra: handle win32 unknown inode in file identity checks --- src/infra/file-identity.test.ts | 10 ++++++++++ src/infra/file-identity.ts | 11 +++++++++-- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/infra/file-identity.test.ts b/src/infra/file-identity.test.ts index 12b3029cda1..0180232d4e5 100644 --- a/src/infra/file-identity.test.ts +++ b/src/infra/file-identity.test.ts @@ -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); }); }); diff --git a/src/infra/file-identity.ts b/src/infra/file-identity.ts index 686d6dd086e..7ee589ee9c0 100644 --- a/src/infra/file-identity.ts +++ b/src/infra/file-identity.ts @@ -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)); }