From 9c8fec06d2b58e4e3bbe280ddc665a99fcc4878c Mon Sep 17 00:00:00 2001
From: Jacky Zhao <j.zhao2k19@gmail.com>
Date: Sun, 09 Mar 2025 22:33:15 +0000
Subject: [PATCH] feat: support non-singleton search
---
quartz/build.ts | 45 +++++++++++++++++++++++++++++----------------
1 files changed, 29 insertions(+), 16 deletions(-)
diff --git a/quartz/build.ts b/quartz/build.ts
index d72b8dd..64c462b 100644
--- a/quartz/build.ts
+++ b/quartz/build.ts
@@ -38,8 +38,13 @@
type FileEvent = "add" | "change" | "delete"
+function newBuildId() {
+ return Math.random().toString(36).substring(2, 8)
+}
+
async function buildQuartz(argv: Argv, mut: Mutex, clientRefresh: () => void) {
const ctx: BuildCtx = {
+ buildId: newBuildId(),
argv,
cfg,
allSlugs: [],
@@ -134,9 +139,9 @@
const buildFromEntry = argv.fastRebuild ? partialRebuildFromEntrypoint : rebuildFromEntrypoint
watcher
- .on("add", (fp) => buildFromEntry(fp, "add", clientRefresh, buildData))
- .on("change", (fp) => buildFromEntry(fp, "change", clientRefresh, buildData))
- .on("unlink", (fp) => buildFromEntry(fp, "delete", clientRefresh, buildData))
+ .on("add", (fp) => buildFromEntry(fp as string, "add", clientRefresh, buildData))
+ .on("change", (fp) => buildFromEntry(fp as string, "change", clientRefresh, buildData))
+ .on("unlink", (fp) => buildFromEntry(fp as string, "delete", clientRefresh, buildData))
return async () => {
await watcher.close()
@@ -157,10 +162,13 @@
return
}
- const buildStart = new Date().getTime()
- buildData.lastBuildMs = buildStart
+ const buildId = newBuildId()
+ ctx.buildId = buildId
+ buildData.lastBuildMs = new Date().getTime()
const release = await mut.acquire()
- if (buildData.lastBuildMs > buildStart) {
+
+ // if there's another build after us, release and let them do it
+ if (ctx.buildId !== buildId) {
release()
return
}
@@ -309,6 +317,8 @@
}
await rimraf([...destinationsToDelete])
+ console.log(chalk.green(`Done rebuilding in ${perf.timeSince()}`))
+
toRemove.clear()
release()
clientRefresh()
@@ -349,26 +359,22 @@
toRemove.add(filePath)
}
- const buildStart = new Date().getTime()
- buildData.lastBuildMs = buildStart
+ const buildId = newBuildId()
+ ctx.buildId = buildId
+ buildData.lastBuildMs = new Date().getTime()
const release = await mut.acquire()
// there's another build after us, release and let them do it
- if (buildData.lastBuildMs > buildStart) {
+ if (ctx.buildId !== buildId) {
release()
return
}
const perf = new PerfTimer()
console.log(chalk.yellow("Detected change, rebuilding..."))
+
try {
const filesToRebuild = [...toRebuild].filter((fp) => !toRemove.has(fp))
-
- const trackedSlugs = [...new Set([...contentMap.keys(), ...toRebuild, ...trackedAssets])]
- .filter((fp) => !toRemove.has(fp))
- .map((fp) => slugifyFilePath(path.posix.relative(argv.directory, fp) as FilePath))
-
- ctx.allSlugs = [...new Set([...initialSlugs, ...trackedSlugs])]
const parsedContent = await parseMarkdown(ctx, filesToRebuild)
for (const content of parsedContent) {
const [_tree, vfile] = content
@@ -382,6 +388,13 @@
const parsedFiles = [...contentMap.values()]
const filteredContent = filterContent(ctx, parsedFiles)
+ // re-update slugs
+ const trackedSlugs = [...new Set([...contentMap.keys(), ...toRebuild, ...trackedAssets])]
+ .filter((fp) => !toRemove.has(fp))
+ .map((fp) => slugifyFilePath(path.posix.relative(argv.directory, fp) as FilePath))
+
+ ctx.allSlugs = [...new Set([...initialSlugs, ...trackedSlugs])]
+
// TODO: we can probably traverse the link graph to figure out what's safe to delete here
// instead of just deleting everything
await rimraf(path.join(argv.output, ".*"), { glob: true })
@@ -394,10 +407,10 @@
}
}
- release()
clientRefresh()
toRebuild.clear()
toRemove.clear()
+ release()
}
export default async (argv: Argv, mut: Mutex, clientRefresh: () => void) => {
--
Gitblit v1.10.0