浏览代码

enhance: export command can save to file option

Also update export-edn command to have same default behavior as
export command. Printing to stdout was ok for dev but is surprising and
possibly overwhelming for most graphs
Gabriel Horner 2 月之前
父节点
当前提交
ffaccbb33e

+ 5 - 1
deps/cli/CHANGELOG.md

@@ -1,6 +1,10 @@
+## 0.2.0
+* Add export command to export graph as markdown
+* Like export command, export-edn command defaults to exporting to file
+
 ## 0.1.0
 ## 0.1.0
 
 
 * Initial release!
 * Initial release!
 * Provides commands: list, show, search, query, export-edn and help
 * Provides commands: list, show, search, query, export-edn and help
-* All commands except search work offline. search and query have options for calling HTTP Server of
+* All commands work offline. search and query have options for calling HTTP API Server of
   open desktop Logseq app
   open desktop Logseq app

+ 5 - 1
deps/cli/README.md

@@ -110,7 +110,11 @@ $ logseq query '(task DOING)' -a my-token
   :uuid "68795144-e5f6-48e8-849d-79cd6473b952"}
   :uuid "68795144-e5f6-48e8-849d-79cd6473b952"}
   ...
   ...
 
 
-# Export your DB graph as EDN
+# Export DB graph as markdown
+$ logseq export yep
+Exported 41 pages to yep_markdown_1756128259.zip
+
+# Export DB graph as EDN
 $ logseq export-edn woot -f woot.edn
 $ logseq export-edn woot -f woot.edn
 Exported 16 properties, 16 classes and 36 pages
 Exported 16 properties, 16 classes and 36 pages
 ```
 ```

+ 1 - 1
deps/cli/package.json

@@ -1,6 +1,6 @@
 {
 {
   "name": "@logseq/cli",
   "name": "@logseq/cli",
-  "version": "0.1.0",
+  "version": "0.2.0",
   "description": "Logseq CLI",
   "description": "Logseq CLI",
   "bin": {
   "bin": {
     "logseq": "cli.mjs"
     "logseq": "cli.mjs"

+ 2 - 1
deps/cli/src/logseq/cli.cljs

@@ -78,7 +78,8 @@
     :spec cli-spec/query}
     :spec cli-spec/query}
    {:cmds ["export"] :desc "Export DB graph as MD"
    {:cmds ["export"] :desc "Export DB graph as MD"
     :fn (lazy-load-fn 'logseq.cli.commands.export/export)
     :fn (lazy-load-fn 'logseq.cli.commands.export/export)
-    :args->opts [:graph] :require [:graph]}
+    :args->opts [:graph] :require [:graph]
+    :spec cli-spec/export}
    {:cmds ["export-edn"] :desc "Export DB graph as EDN"
    {:cmds ["export-edn"] :desc "Export DB graph as EDN"
     :fn (lazy-load-fn 'logseq.cli.commands.export-edn/export)
     :fn (lazy-load-fn 'logseq.cli.commands.export-edn/export)
     :args->opts [:graph] :require [:graph]
     :args->opts [:graph] :require [:graph]

+ 13 - 8
deps/cli/src/logseq/cli/commands/export.cljs

@@ -1,5 +1,5 @@
 (ns logseq.cli.commands.export
 (ns logseq.cli.commands.export
-  "Export command"
+  "Export MD command"
   (:require ["fs" :as fs]
   (:require ["fs" :as fs]
             [cljs.pprint]
             [cljs.pprint]
             [clojure.string :as string]
             [clojure.string :as string]
@@ -53,7 +53,7 @@
 
 
 (defn- export-repo-as-markdown!
 (defn- export-repo-as-markdown!
   "Modified version of handler.export.text/export-repo-as-markdown for the CLI"
   "Modified version of handler.export.text/export-repo-as-markdown for the CLI"
-  [repo db]
+  [repo db {:keys [file]}]
   (let [content-config (get-content-config db)
   (let [content-config (get-content-config db)
         files* (get-file-contents repo db content-config "md")]
         files* (get-file-contents repo db content-config "md")]
     (when (seq files*)
     (when (seq files*)
@@ -62,14 +62,19 @@
                             cli-export-common/*content-config* content-config]
                             cli-export-common/*content-config* content-config]
                     (export-files-as-markdown repo files* nil))
                     (export-files-as-markdown repo files* nil))
             repo' (string/replace repo common-config/db-version-prefix "")
             repo' (string/replace repo common-config/db-version-prefix "")
-            zip-file-name (str repo' "_markdown_" (quot (common-util/time-ms) 1000))
-            zip (cli-common-util/make-export-zip zip-file-name files)]
+            zip-file-name (if file
+                            (string/replace-first file #"(?i)\.zip$" "")
+                            (str repo' "_markdown_" (quot (common-util/time-ms) 1000)))
+            file-name (or file (str zip-file-name ".zip"))
+            zip (cli-common-util/make-export-zip zip-file-name files)
+            ;; matches behavior in make-export-zip
+            exported-files (remove #(string/blank? (second %)) files)]
         (-> (.generateNodeStream zip #js {:streamFiles true :type "nodebuffer"})
         (-> (.generateNodeStream zip #js {:streamFiles true :type "nodebuffer"})
-            (.pipe (fs/createWriteStream (str zip-file-name ".zip"))))
-        (println "Exported graph to" (str zip-file-name ".zip"))))))
+            (.pipe (fs/createWriteStream file-name)))
+        (println "Exported" (count exported-files) "pages to" file-name)))))
 
 
-(defn export [{{:keys [graph]} :opts}]
+(defn export [{{:keys [graph] :as opts} :opts}]
   (if (fs/existsSync (cli-util/get-graph-dir graph))
   (if (fs/existsSync (cli-util/get-graph-dir graph))
     (let [conn (apply sqlite-cli/open-db! (cli-util/->open-db-args graph))]
     (let [conn (apply sqlite-cli/open-db! (cli-util/->open-db-args graph))]
-      (export-repo-as-markdown! (str common-config/db-version-prefix graph) @conn))
+      (export-repo-as-markdown! (str common-config/db-version-prefix graph) @conn opts))
     (cli-util/error "Graph" (pr-str graph) "does not exist")))
     (cli-util/error "Graph" (pr-str graph) "does not exist")))

+ 12 - 13
deps/cli/src/logseq/cli/commands/export_edn.cljs

@@ -4,21 +4,20 @@
             [clojure.pprint :as pprint]
             [clojure.pprint :as pprint]
             [logseq.db.common.sqlite-cli :as sqlite-cli]
             [logseq.db.common.sqlite-cli :as sqlite-cli]
             [logseq.db.sqlite.export :as sqlite-export]
             [logseq.db.sqlite.export :as sqlite-export]
+            [logseq.common.util :as common-util]
             [logseq.cli.util :as cli-util]))
             [logseq.cli.util :as cli-util]))
 
 
 (defn export [{{:keys [graph] :as options} :opts}]
 (defn export [{{:keys [graph] :as options} :opts}]
   (if (fs/existsSync (cli-util/get-graph-dir graph))
   (if (fs/existsSync (cli-util/get-graph-dir graph))
-   (let [conn (apply sqlite-cli/open-db! (cli-util/->open-db-args graph))
-         export-map (sqlite-export/build-export @conn
-                                                (cond-> {:export-type (:export-type options)}
-                                                  (= :graph (:export-type options))
-                                                  (assoc :graph-options (dissoc options :file :export-type :graph))))]
-     (if (:file options)
-       (do
-         (println "Exported" (count (:properties export-map)) "properties,"
-                  (count (:properties export-map)) "classes and"
-                  (count (:pages-and-blocks export-map)) "pages")
-         (fs/writeFileSync (:file options)
-                           (with-out-str (pprint/pprint export-map))))
-       (pprint/pprint export-map)))
+    (let [conn (apply sqlite-cli/open-db! (cli-util/->open-db-args graph))
+          export-map (sqlite-export/build-export @conn
+                                                 (cond-> {:export-type (:export-type options)}
+                                                   (= :graph (:export-type options))
+                                                   (assoc :graph-options (dissoc options :file :export-type :graph))))
+          file (or (:file options) (str graph "_" (quot (common-util/time-ms) 1000) ".edn"))]
+      (println "Exported" (count (:properties export-map)) "properties,"
+               (count (:properties export-map)) "classes and"
+               (count (:pages-and-blocks export-map)) "pages to" file)
+      (fs/writeFileSync file
+                        (with-out-str (pprint/pprint export-map))))
     (cli-util/error "Graph" (pr-str graph) "does not exist")))
     (cli-util/error "Graph" (pr-str graph) "does not exist")))

+ 6 - 2
deps/cli/src/logseq/cli/spec.cljs

@@ -2,11 +2,15 @@
   "Babashka.cli specs for commands. Normally these would live alongside their
   "Babashka.cli specs for commands. Normally these would live alongside their
   commands but are separate because command namespaces are lazy loaded")
   commands but are separate because command namespaces are lazy loaded")
 
 
+(def export
+  {:file {:alias :f
+          :desc "File to save export"}})
+
 (def export-edn
 (def export-edn
   {:include-timestamps? {:alias :T
   {:include-timestamps? {:alias :T
                          :desc "Include timestamps in export"}
                          :desc "Include timestamps in export"}
    :file {:alias :f
    :file {:alias :f
-          :desc "Saves edn to file"}
+          :desc "File to save export"}
    :catch-validation-errors? {:alias :c
    :catch-validation-errors? {:alias :c
                               :desc "Catch validation errors for dev"}
                               :desc "Catch validation errors for dev"}
    :exclude-namespaces {:alias :e
    :exclude-namespaces {:alias :e
@@ -29,7 +33,7 @@
                          :coerce :boolean
                          :coerce :boolean
                          :desc "Make properties on entity queries show property values instead of ids"}
                          :desc "Make properties on entity queries show property values instead of ids"}
    :title-query {:alias :t
    :title-query {:alias :t
-                 :desc "Invokes local query on :block/title"}
+                 :desc "Invoke local query on :block/title"}
    :api-query-token {:alias :a
    :api-query-token {:alias :a
                      :desc "Query current graph with api server token"}})
                      :desc "Query current graph with api server token"}})
 
 

+ 1 - 1
deps/cli/src/logseq/cli/util.cljs

@@ -1,5 +1,5 @@
 (ns ^:node-only logseq.cli.util
 (ns ^:node-only logseq.cli.util
-  "Util fns"
+  "CLI only util fns"
   (:require ["path" :as node-path]
   (:require ["path" :as node-path]
             [clojure.string :as string]
             [clojure.string :as string]
             [logseq.cli.common.graph :as cli-common-graph]
             [logseq.cli.common.graph :as cli-common-graph]