From 9b725aa97b818734c477a5ada282d3537c7189a5 Mon Sep 17 00:00:00 2001 From: Dobes Vandermeer Date: Wed, 14 May 2025 14:11:23 -0700 Subject: [PATCH 1/2] Defend against missing files in the hashing logic If a file is missing while calculating file hashes, use stub values instead of exiting with an error. --- packages/hasher/src/FileHasher.ts | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/packages/hasher/src/FileHasher.ts b/packages/hasher/src/FileHasher.ts index 1f7ebc684..5ad41660b 100644 --- a/packages/hasher/src/FileHasher.ts +++ b/packages/hasher/src/FileHasher.ts @@ -94,7 +94,7 @@ export class FileHasher { const stats = stat(files, { cwd: this.options.root }) ?? {}; for (const file of files) { - const stat = stats[file]; + const stat = stats[file] || { mtime: 0n, size: 0 }; const info = this.#store[file]; if (info && stat.mtime === info.mtime && stat.size == info.size) { @@ -107,12 +107,24 @@ export class FileHasher { const updatedHashes = fastHash(updatedFiles, { cwd: this.options.root, concurrency: 4 }) ?? {}; for (const [file, hash] of Object.entries(updatedHashes)) { - const stat = fs.statSync(path.join(this.options.root, file), { bigint: true }); - this.#store[file] = { - mtime: stat.mtimeMs, - size: Number(stat.size), - hash: hash ?? "", - }; + try { + const stat = fs.statSync(path.join(this.options.root, file), { bigint: true }); + this.#store[file] = { + mtime: stat.mtimeMs, + size: Number(stat.size), + hash: hash ?? "", + }; + } catch (e: any) { + if (e.code === "ENOENT") { + this.#store[file] = { + mtime: 0n, + size: 0, + hash: hash ?? "", + }; + } else { + throw e; + } + } hashes[file] = hash ?? ""; } From f2cc661c9e60f17be45c4ade2c3d521300b4428f Mon Sep 17 00:00:00 2001 From: Elizabeth Craig Date: Thu, 9 Apr 2026 00:03:37 -0700 Subject: [PATCH 2/2] change file --- .../change-501f9623-19ff-418f-b70c-61580dd1343c.json | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 change/change-501f9623-19ff-418f-b70c-61580dd1343c.json diff --git a/change/change-501f9623-19ff-418f-b70c-61580dd1343c.json b/change/change-501f9623-19ff-418f-b70c-61580dd1343c.json new file mode 100644 index 000000000..dfea809e1 --- /dev/null +++ b/change/change-501f9623-19ff-418f-b70c-61580dd1343c.json @@ -0,0 +1,11 @@ +{ + "changes": [ + { + "type": "patch", + "comment": "Defend against missing files in the hashing logic", + "packageName": "@lage-run/hasher", + "email": "dobes@formative.com", + "dependentChangeType": "patch" + } + ] +} \ No newline at end of file