Просмотр исходного кода

Merge pull request #985 from logseq/fix/preserve-edn-order

fix: preserve config.file order when updating
Michael Wong 5 лет назад
Родитель
Сommit
ccf85e2e37

+ 2 - 0
deps.edn

@@ -12,6 +12,8 @@
   datascript-transit/datascript-transit
   {:mvn/version "0.3.0"
    :exclusions [datascript]}
+  borkdude/rewrite-edn        {:git/url "https://github.com/borkdude/rewrite-edn"
+                               :sha "edd87dc7f045f28d7afcbfc44bc0f0a2683dde62"}
   funcool/promesa             {:mvn/version "4.0.2"}
   medley/medley               {:mvn/version "1.2.0"}
   metosin/reitit-frontend     {:mvn/version "0.3.10"}

+ 1 - 1
src/main/frontend/components/settings.cljs

@@ -183,7 +183,7 @@
               (ui/toggle enable-timetracking?
                          (fn []
                            (let [value (not enable-timetracking?)]
-                             (repo-handler/set-config! :feature/enable-timetracking? value))))]]]
+                             (config-handler/set-config! :feature/enable-timetracking? value))))]]]
 
            [:hr]
 

+ 22 - 2
src/main/frontend/handler/config.cljs

@@ -1,7 +1,27 @@
 (ns frontend.handler.config
   (:require [frontend.state :as state]
-            [frontend.handler.repo :as repo-handler]))
+            [frontend.handler.repo :as repo-handler]
+            [borkdude.rewrite-edn :as rewrite]
+            [frontend.config :as config]
+            [frontend.db :as db]))
+
+(defn set-config!
+  [k v]
+  (when-let [repo (state/get-current-repo)]
+    (let [path (str config/app-name "/" config/config-file)]
+      (when-let [config (db/get-file-no-sub path)]
+        (let [config (try
+                       (rewrite/parse-string config)
+                       (catch js/Error e
+                         (println "Parsing config file failed: ")
+                         (js/console.dir e)
+                         {}))
+              ks (if (vector? k) k [k])
+              new-config (rewrite/assoc-in config ks v)]
+          (state/set-config! repo new-config)
+          (let [new-content (str new-config)]
+            (repo-handler/set-config-content! repo path new-content)))))))
 
 (defn toggle-ui-show-brackets! []
   (let [show-brackets? (state/show-brackets?)]
-    (repo-handler/set-config! :ui/show-brackets? (not show-brackets?))))
+    (set-config! :ui/show-brackets? (not show-brackets?))))

+ 3 - 21
src/main/frontend/handler/repo.cljs

@@ -21,7 +21,6 @@
             [frontend.handler.common :as common-handler]
             [frontend.handler.extract :as extract-handler]
             [frontend.ui :as ui]
-            [cljs.reader :as reader]
             [clojure.string :as string]
             [frontend.dicts :as dicts]
             [frontend.spec :as spec]))
@@ -493,26 +492,9 @@
          (show-install-error! repo-url (util/format "Failed to clone %s." repo-url)))))))
 
 (defn set-config-content!
-  [repo path new-config]
-  (let [new-content (util/pp-str new-config)]
-    (file-handler/alter-file repo path new-content {:reset? false
-                                                    :re-render-root? false})))
-
-(defn set-config!
-  [k v]
-  (when-let [repo (state/get-current-repo)]
-    (let [path (str config/app-name "/" config/config-file)]
-      (when-let [config (db/get-file-no-sub path)]
-        (let [config (try
-                       (reader/read-string config)
-                       (catch js/Error e
-                         (println "Parsing config file failed: ")
-                         (js/console.dir e)
-                         {}))
-              ks (if (vector? k) k [k])
-              new-config (assoc-in config ks v)]
-          (state/set-config! repo new-config)
-          (set-config-content! repo path new-config))))))
+  [repo path new-content]
+  (file-handler/alter-file repo path new-content {:reset? false
+                                                  :re-render-root? false}))
 
 (defn remove-repo!
   [{:keys [id url] :as repo}]