From 775d8a9916d05ca5cc091df4447becb4f81e0e2c Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Thu, 17 Aug 2023 21:07:40 -0700 Subject: [PATCH] deref symlink on quartz sync --- content/features/upcoming features.md | 6 ----- quartz/bootstrap-cli.mjs | 36 +++++++++++++++++++++------ 2 files changed, 28 insertions(+), 14 deletions(-) diff --git a/content/features/upcoming features.md b/content/features/upcoming features.md index 28ee48a4..48acf605 100644 --- a/content/features/upcoming features.md +++ b/content/features/upcoming features.md @@ -1,12 +1,6 @@ --- draft: true --- - -## todo - -- dereference symlink for npx quartz sync - - prompt user as to whether to do it (it's expensive for large vaults) - ## high priority backlog - block links: https://help.obsidian.md/Linking+notes+and+files/Internal+links#Link+to+a+block+in+a+note diff --git a/quartz/bootstrap-cli.mjs b/quartz/bootstrap-cli.mjs index 8efa7b04..f7c7bee4 100755 --- a/quartz/bootstrap-cli.mjs +++ b/quartz/bootstrap-cli.mjs @@ -112,6 +112,7 @@ function exitIfCancel(val) { } async function stashContentFolder(contentFolder) { + await fs.promises.rm(contentCacheFolder, { force: true, recursive: true }) await fs.promises.cp(contentFolder, contentCacheFolder, { force: true, recursive: true, @@ -150,7 +151,7 @@ yargs(hideBin(process.argv)) message: `Choose how to initialize the content in \`${contentFolder}\``, options: [ { value: "new", label: "Empty Quartz" }, - { value: "copy", label: "Replace with an existing folder", hint: "overwrites `content`" }, + { value: "copy", label: "Copy an existing folder", hint: "overwrites `content`" }, { value: "symlink", label: "Symlink an existing folder", @@ -163,12 +164,10 @@ yargs(hideBin(process.argv)) async function rmContentFolder() { const contentStat = await fs.promises.lstat(contentFolder) - if (contentStat) { - if (contentStat.isSymbolicLink()) { - await fs.promises.unlink(contentFolder) - } else { - await rimraf(contentFolder) - } + if (contentStat.isSymbolicLink()) { + await fs.promises.unlink(contentFolder) + } else { + await rimraf(contentFolder) } } @@ -274,11 +273,32 @@ See the [documentation](https://quartz.jzhao.xyz) for how to get started. console.log("Backing up your content") if (argv.commit) { + const contentStat = await fs.promises.lstat(contentFolder) + if (contentStat.isSymbolicLink()) { + console.log(chalk.yellow("Detected symlink, trying to dereference before committing")) + + // stash symlink file + await stashContentFolder(contentFolder) + + // follow symlink and copy content + const linkTarg = await fs.promises.readlink(contentFolder) + await fs.promises.cp(linkTarg, contentFolder, { + force: true, + recursive: true, + preserveTimestamps: true, + }) + } + const currentTimestamp = new Date().toLocaleString("en-US", { dateStyle: "medium", timeStyle: "short", }) spawnSync("git", ["commit", "-am", `Quartz sync: ${currentTimestamp}`], { stdio: "inherit" }) + + if (contentStat.isSymbolicLink()) { + // put symlink back + await popContentFolder() + } } await stashContentFolder(contentFolder) @@ -466,7 +486,7 @@ See the [documentation](https://quartz.jzhao.xyz) for how to get started. rebuild(clientRefresh) }) } else { - await build(() => {}) + await build(() => { }) ctx.dispose() } })