|
|
@@ -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
|