From 569beb410b967b8511a5d18cdee74280df681d15 Mon Sep 17 00:00:00 2001
From: Jacky Zhao <j.zhao2k19@gmail.com>
Date: Fri, 18 Aug 2023 04:49:58 +0000
Subject: [PATCH] ensure sync includes untracked files

---
 quartz/bootstrap-cli.mjs |   47 ++++++++++++++++++++++++++++++++++++++---------
 1 files changed, 38 insertions(+), 9 deletions(-)

diff --git a/quartz/bootstrap-cli.mjs b/quartz/bootstrap-cli.mjs
index 8efa7b0..a39e291 100755
--- a/quartz/bootstrap-cli.mjs
+++ b/quartz/bootstrap-cli.mjs
@@ -112,6 +112,7 @@
 }
 
 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 @@
         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 @@
 
     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)
       }
     }
 
@@ -193,7 +192,7 @@
 
       await rmContentFolder()
       if (setupStrategy === "copy") {
-        await fs.promises.cp(originalFolder, contentFolder, { recursive: true })
+        await fs.promises.cp(originalFolder, contentFolder, { recursive: true, preserveTimestamps: true })
       } else if (setupStrategy === "symlink") {
         await fs.promises.symlink(originalFolder, contentFolder, "dir")
       }
@@ -268,17 +267,47 @@
     spawnSync("npm", ["i"], { stdio: "inherit" })
     console.log(chalk.green("Done!"))
   })
+  .command(
+    "restore",
+    "Try to restore your content folder from the cache",
+    CommonArgv,
+    async (argv) => {
+      const contentFolder = path.join(cwd, argv.directory)
+      await popContentFolder(contentFolder)
+    },
+  )
   .command("sync", "Sync your Quartz to and from GitHub.", SyncArgv, async (argv) => {
     const contentFolder = path.join(cwd, argv.directory)
     console.log(chalk.bgGreen.black(`\n Quartz v${version} \n`))
     console.log("Backing up your content")
 
     if (argv.commit) {
+      const contentStat = await fs.promises.lstat(contentFolder)
+      if (contentStat.isSymbolicLink()) {
+        const linkTarg = await fs.promises.readlink(contentFolder)
+        console.log(chalk.yellow("Detected symlink, trying to dereference before committing"))
+
+        // stash symlink file
+        await stashContentFolder(contentFolder)
+
+        // follow symlink and copy content
+        await fs.promises.cp(linkTarg, contentFolder, {
+          recursive: true,
+          preserveTimestamps: true,
+        })
+      }
+
       const currentTimestamp = new Date().toLocaleString("en-US", {
         dateStyle: "medium",
         timeStyle: "short",
       })
-      spawnSync("git", ["commit", "-am", `Quartz sync: ${currentTimestamp}`], { stdio: "inherit" })
+      spawnSync("git", ["add", "."], { stdio: "inherit" })
+      spawnSync("git", ["commit", "-m", `Quartz sync: ${currentTimestamp}`], { stdio: "inherit" })
+
+      if (contentStat.isSymbolicLink()) {
+        // put symlink back
+        await popContentFolder(contentFolder)
+      }
     }
 
     await stashContentFolder(contentFolder)

--
Gitblit v1.10.0