From e65ea48fae5a279ad4e50594b03621904f84e477 Mon Sep 17 00:00:00 2001
From: Jacky Zhao <j.zhao2k19@gmail.com>
Date: Sun, 20 Aug 2023 21:27:44 +0000
Subject: [PATCH] fix: add async-mutex to builds on large vaults

---
 quartz/build.ts |   12 ++++++++----
 1 files changed, 8 insertions(+), 4 deletions(-)

diff --git a/quartz/build.ts b/quartz/build.ts
index b5b1f9e..78437f8 100644
--- a/quartz/build.ts
+++ b/quartz/build.ts
@@ -16,6 +16,7 @@
 import { glob, toPosixPath } from "./util/glob"
 import { trace } from "./util/trace"
 import { options } from "./util/sourcemap"
+import { Mutex } from "async-mutex"
 
 async function buildQuartz(argv: Argv, clientRefresh: () => void) {
   const ctx: BuildCtx = {
@@ -77,10 +78,11 @@
   }
 
   const initialSlugs = ctx.allSlugs
-  let timeoutIds: Set<ReturnType<typeof setTimeout>> = new Set()
-  let toRebuild: Set<FilePath> = new Set()
-  let toRemove: Set<FilePath> = new Set()
-  let trackedAssets: Set<FilePath> = new Set()
+  const buildMutex = new Mutex()
+  const timeoutIds: Set<ReturnType<typeof setTimeout>> = new Set()
+  const toRebuild: Set<FilePath> = new Set()
+  const toRemove: Set<FilePath> = new Set()
+  const trackedAssets: Set<FilePath> = new Set()
   async function rebuild(fp: string, action: "add" | "change" | "delete") {
     // don't do anything for gitignored files
     if (ignored(fp)) {
@@ -111,6 +113,7 @@
     // debounce rebuilds every 250ms
     timeoutIds.add(
       setTimeout(async () => {
+        await buildMutex.acquire()
         const perf = new PerfTimer()
         console.log(chalk.yellow("Detected change, rebuilding..."))
         try {
@@ -143,6 +146,7 @@
         clientRefresh()
         toRebuild.clear()
         toRemove.clear()
+        buildMutex.release()
       }, 250),
     )
   }

--
Gitblit v1.10.0