From 13439ed6996e0a214e53bc5651258fce5556125c Mon Sep 17 00:00:00 2001 From: Gabriel Horner Date: Tue, 27 Feb 2024 12:07:02 -0500 Subject: [PATCH] enhance: port two more import steps to be script compatible also fix save-file! not waiting on async transact before post-save --- deps/graph-parser/script/db_import.cljs | 43 ++++++------ .../src/logseq/graph_parser/exporter.cljs | 43 +++++++++++- src/main/frontend/components/imports.cljs | 67 ++++++++----------- .../frontend/handler/db_based/editor.cljs | 17 ++--- 4 files changed, 96 insertions(+), 74 deletions(-) diff --git a/deps/graph-parser/script/db_import.cljs b/deps/graph-parser/script/db_import.cljs index 8128976a6..8aa0383d9 100644 --- a/deps/graph-parser/script/db_import.cljs +++ b/deps/graph-parser/script/db_import.cljs @@ -3,11 +3,9 @@ developing the import feature and for engineers who want to customize the import process" (:require [clojure.string :as string] - [clojure.edn :as edn] [datascript.core :as d] ["path" :as node-path] ["os" :as os] - ["fs" :as fs] ["fs/promises" :as fsp] [nbb.core :as nbb] [babashka.cli :as cli] @@ -28,32 +26,31 @@ (defn- build-graph-files "Given a graph directory, return absolute, allowed file paths and their contents in preparation for parsing" - [dir* config] + [dir*] (let [dir (node-path/resolve dir*)] (->> (common-graph/get-files dir) - (mapv #(hash-map :rpath %)) - (remove-hidden-files dir config)))) - -(defn- read-config - "Reads repo-specific config from logseq/config.edn" - [dir] - (let [config-file (str dir "/" common-config/app-name "/config.edn")] - (if (fs/existsSync config-file) - (-> config-file fs/readFileSync str edn/read-string) - {}))) + (mapv #(hash-map :rpath %))))) (defn- import-file-graph-to-db [file-graph-dir conn user-options] - (let [config (read-config file-graph-dir) - import-options (gp-exporter/setup-import-options - @conn - config - user-options - {:notify-user prn}) - ;; TODO: Remove logseq/ filter when higher-level import fn is available - files (remove #(re-find #"logseq/" (:rpath %)) (build-graph-files file-graph-dir config))] + (p/let [*files (build-graph-files file-graph-dir) + config-file (first (filter #(string/ends-with? (:rpath %) "logseq/config.edn") *files)) + _ (assert config-file "No 'logseq/config.edn' found for file graph dir") + (p/loop [_file-map (import-doc-file (get doc-files 0) conn (p/do! + (when custom-css + (-> ( ( ( (:file-object custom-css) - (.text) - (p/then #(db-editor-handler/save-file! "logseq/custom.css" %))) - (some-> (:file-object custom-js) - (.text) - (p/then #(db-editor-handler/save-file! "logseq/custom.js" %)))))) - -(defn- import-config-file! - [{:keys [file-object]}] - (-> (.text file-object) - (p/then (fn [content] - (let [migrated-content (repo-handler/migrate-db-config content)] - (p/do! - (db-editor-handler/save-file! "logseq/config.edn" migrated-content)) - ;; Return original config as import process depends on original config e.g. :hidden - (edn/read-string content)))) - (p/catch (fn [err] - (log/error :import-config-file err) - (notification/show! "Import may have mistakes due to an invalid config.edn. Recommend re-importing with a valid config.edn" - :warning - false) - (edn/read-string config/config-default-content))))) - (defn- build-hidden-favorites-page-blocks [page-block-uuid-coll] (map @@ -357,6 +329,15 @@ :warning false)) (log/info :import-valid {:msg "Valid import!" :counts (assoc (counts-from-entities entities) :datoms datom-count)})))) + +(defn- show-notification [{:keys [msg level ex-data]}] + (if (= :error level) + (do + (notification/show! msg :error) + (when ex-data + (log/error :import-error ex-data))) + (notification/show! msg :warning false))) + (defn- import-file-graph [*files {:keys [graph-name tag-classes property-classes]} config-file] (state/set-state! :graph/importing :file-graph) @@ -366,7 +347,14 @@ _ (async/c (repo-handler/new-db! graph-name {:file-graph-import? true}))) repo (state/get-current-repo) db-conn (db/get-db repo false) - config (async/c (import-config-file! config-file))) + c (gp-exporter/import-config-file! + repo config-file > files @@ -379,21 +367,20 @@ config {:tag-classes (set (string/split tag-classes #",\s*")) :property-classes (set (string/split property-classes #",\s*"))} - {:macros (state/get-macros) - :notify-user #(if (= :error (:level %)) - (do - (notification/show! (:msg %) :error) - (when (:ex-data %) - (log/error :import-error (:ex-data %)))) - (notification/show! (:msg %) :warning false))}) + {:macros (:macros config) + :notify-user show-notification}) {:set-ui-state state/set-state! ;; Write to frontend first as writing to worker first is poor ux with slow streaming changes :import-file (fn import-file [conn m opts] (let [tx-report - (gp-exporter/add-file-to-db-graph conn (:file/path m) (:file/content m) opts)] - (db-browser/transact! @db-browser/*worker repo (:tx-data tx-report) (:tx-meta tx-report))))}) - c (import-logseq-files (filter logseq-file? files)))) + (gp-exporter/add-file-to-db-graph conn (:file/path m) (:file/content m) opts)] + (db-browser/transact! @db-browser/*worker repo (:tx-data tx-report) (:tx-meta tx-report))))})] + (async/c (gp-exporter/import-logseq-files (state/get-current-repo) + (filter logseq-file? files) + c (gp-exporter/import-from-doc-files! db-conn doc-files c (import-favorites-from-config-edn! db-conn repo config-file))) diff --git a/src/main/frontend/handler/db_based/editor.cljs b/src/main/frontend/handler/db_based/editor.cljs index d2e5a8aee..24b304d53 100644 --- a/src/main/frontend/handler/db_based/editor.cljs +++ b/src/main/frontend/handler/db_based/editor.cljs @@ -110,15 +110,16 @@ true)] (when file-valid? - (db/transact! [{:file/path path - :file/content content - :file/last-modified-at (js/Date.)}]) + (p/do! + (db/transact! [{:file/path path + :file/content content + :file/last-modified-at (js/Date.)}]) ;; Post save - (cond (= path "logseq/config.edn") - (p/let [_ (repo-config-handler/restore-repo-config! (state/get-current-repo) content)] - (state/pub-event! [:shortcut/refresh])) - (= path "logseq/custom.css") - (ui-handler/add-style-if-exists!))))) + (cond (= path "logseq/config.edn") + (p/let [_ (repo-config-handler/restore-repo-config! (state/get-current-repo) content)] + (state/pub-event! [:shortcut/refresh])) + (= path "logseq/custom.css") + (ui-handler/add-style-if-exists!)))))) (defn- set-heading-aux! [block-id heading]