1
0
Эх сурвалжийг харах

Add test version of alter-file

Tienson Qin 5 сар өмнө
parent
commit
2a74fc3d7e

+ 59 - 1
src/main/frontend/handler/file_based/file.cljs

@@ -14,6 +14,7 @@
             [frontend.schema.handler.repo-config :as repo-config-schema]
             [frontend.state :as state]
             [frontend.util :as util]
+            [frontend.worker.file.reset :as file-reset]
             [lambdaisland.glogi :as log]
             [logseq.common.config :as common-config]
             [logseq.common.path :as path]
@@ -160,7 +161,7 @@
                                               [[:db/retract page-id :block/alias]
                                                [:db/retract page-id :block/tags]]
                                               opts))
-                              (reset-file!
+                              (file-reset/reset-file!
                                repo path content (merge opts
                                                          ;; To avoid skipping the `:or` bounds for keyword destructuring
                                                         (when (some? verbose) {:verbose verbose}))))
@@ -189,6 +190,63 @@
                                   {:error error
                                    :payload {:type :write-file/failed-for-alter-file}}]))))))))
 
+(defn alter-file-test-version
+  "Write any in-DB file, e.g. repo config, page, whiteboard, etc."
+  [repo path content {:keys [reset? re-render-root? from-disk? skip-compare? new-graph? verbose
+                             ctime mtime]
+                      :fs/keys [event]
+                      :or {reset? true
+                           re-render-root? false
+                           from-disk? false
+                           skip-compare? false}}]
+  (let [path (common-util/path-normalize path)
+        config-file? (= path "logseq/config.edn")
+        _ (when config-file?
+            (detect-deprecations path content))
+        config-valid? (and config-file? (validate-file path content))]
+    (when (or config-valid? (not config-file?)) ; non-config file or valid config
+      (let [opts {:new-graph? new-graph?
+                  :from-disk? from-disk?
+                  :fs/event event
+                  :ctime ctime
+                  :mtime mtime}
+            result (if reset?
+                     (p/do!
+                      (when-let [page-id (file-model/get-file-page-id path)]
+                        (db/transact! repo
+                                      [[:db/retract page-id :block/alias]
+                                       [:db/retract page-id :block/tags]]
+                                      opts))
+                      (reset-file!
+                       repo path content (merge opts
+                                                         ;; To avoid skipping the `:or` bounds for keyword destructuring
+                                                (when (some? verbose) {:verbose verbose}))))
+                     (db/set-file-content! repo path content opts))]
+        (-> (p/let [_ (when-not from-disk?
+                        (write-file-aux! repo path content {:skip-compare? skip-compare?}))]
+              (when re-render-root? (ui-handler/re-render-root!))
+
+              (cond
+                (= path "logseq/custom.css")
+                (do
+                  ;; ui-handler will load css from db and config
+                  (db/set-file-content! repo path content)
+                  (ui-handler/add-style-if-exists!))
+
+                (= path "logseq/config.edn")
+                (p/let [_ (repo-config-handler/restore-repo-config! repo content)]
+                  (state/pub-event! [:shortcut/refresh])))
+
+              result)
+            (p/catch
+             (fn [error]
+               (println "Write file failed, path: " path ", content: " content)
+               (log/error :write/failed error)
+               (state/pub-event! [:capture-error
+                                  {:error error
+                                   :payload {:type :write-file/failed-for-alter-file}}]))))
+        result))))
+
 (defn set-file-content!
   [repo path new-content]
   (alter-file repo path new-content {:reset? false

+ 27 - 3
src/main/frontend/handler/file_based/repo.cljs

@@ -113,6 +113,31 @@
                                           (update m :finished inc)))
               nil))))
 
+(defn- parse-and-load-file-test-version!
+  "Accept: .md, .org, .edn, .css"
+  [repo-url file {:keys [new-graph? verbose]}]
+  (try
+    (let [result (file-handler/alter-file-test-version
+                  repo-url
+                  (:file/path file)
+                  (:file/content file)
+                  (merge (:stat file)
+                         {:new-graph? new-graph?
+                          :re-render-root? false
+                          :from-disk? true}
+                                                  ;; To avoid skipping the `:or` bounds for keyword destructuring
+                         (when (some? verbose) {:verbose verbose})))]
+      (state/set-parsing-state! (fn [m]
+                                  (update m :finished inc)))
+      result)
+    (catch :default e
+      (println "Parse and load file failed: " (str (:file/path file)))
+      (js/console.error e)
+      (state/set-parsing-state! (fn [m]
+                                  (update m :failed-parsing-files conj [(:file/path file) e])))
+      (state/set-parsing-state! (fn [m]
+                                  (update m :finished inc))))))
+
 (defn- after-parse
   [repo-url re-render? re-render-opts opts graph-added-chan]
   (when (or (:new-graph? opts) (not (:refresh? opts)))
@@ -149,7 +174,7 @@
           (state/set-parsing-state! (fn [m]
                                       (assoc m
                                              :current-parsing-file (:file/path file))))
-          (parse-and-load-file! repo-url file (select-keys opts [:new-graph? :verbose])))
+          (parse-and-load-file-test-version! repo-url file (select-keys opts [:new-graph? :verbose])))
         (after-parse repo-url re-render? re-render-opts opts graph-added-chan))
       (async/go-loop []
         (if-let [item (async/<! chan)]
@@ -186,8 +211,7 @@
                       (swap! *page-names conj page-name)
                       (swap! *page-name->path assoc page-name (:file/path file)))]
               (recur)))
-          (p/do!
-           (after-parse repo-url re-render? re-render-opts opts graph-added-chan)))))
+          (after-parse repo-url re-render? re-render-opts opts graph-added-chan))))
     graph-added-chan))
 
 (defn- parse-files-and-create-default-files!