db_import.cljs 3.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. (ns db-import
  2. "Imports given file(s) to a db graph. This script is primarily for
  3. developing the import feature and for engineers who want to customize
  4. the import process"
  5. (:require [clojure.string :as string]
  6. [datascript.core :as d]
  7. ["path" :as node-path]
  8. ["os" :as os]
  9. ["fs/promises" :as fsp]
  10. [nbb.core :as nbb]
  11. [babashka.cli :as cli]
  12. [logseq.graph-parser.exporter :as gp-exporter]
  13. [logseq.common.graph :as common-graph]
  14. [logseq.common.config :as common-config]
  15. [logseq.tasks.db-graph.create-graph :as create-graph]
  16. [promesa.core :as p]))
  17. (defn- remove-hidden-files [dir config files]
  18. (if (seq (:hidden config))
  19. (->> files
  20. (map #(assoc % ::rel-path (node-path/relative dir (:rpath %))))
  21. ((fn [files] (common-config/remove-hidden-files files config ::rel-path)))
  22. (map #(dissoc % ::rel-path)))
  23. files))
  24. (defn- build-graph-files
  25. "Given a graph directory, return absolute, allowed file paths and their contents in preparation
  26. for parsing"
  27. [dir*]
  28. (let [dir (node-path/resolve dir*)]
  29. (->> (common-graph/get-files dir)
  30. (mapv #(hash-map :rpath %)))))
  31. (defn- import-file-graph-to-db [file-graph-dir conn user-options]
  32. (p/let [*files (build-graph-files file-graph-dir)
  33. config-file (first (filter #(string/ends-with? (:rpath %) "logseq/config.edn") *files))
  34. _ (assert config-file "No 'logseq/config.edn' found for file graph dir")
  35. <read-file #(p/let [s (fsp/readFile (:rpath %))] (str s))
  36. ;; TODO: Add :default-config option
  37. config (gp-exporter/import-config-file! conn config-file <read-file {:notify-user prn})
  38. files (remove-hidden-files file-graph-dir config *files)
  39. import-options (gp-exporter/setup-import-options
  40. @conn
  41. config
  42. user-options
  43. {:notify-user prn})
  44. logseq-file? #(string/includes? (:rpath %) "logseq/")
  45. doc-files (remove logseq-file? files)
  46. logseq-files (filter logseq-file? files)]
  47. ;; (prn :files (count files) files)
  48. (p/do!
  49. (gp-exporter/import-logseq-files conn logseq-files <read-file {:notify-user prn})
  50. (gp-exporter/import-from-doc-files! conn doc-files <read-file import-options))))
  51. (def spec
  52. "Options spec"
  53. {:help {:alias :h
  54. :desc "Print help"}
  55. :verbose {:alias :v
  56. :desc "Verbose mode"}
  57. :tag-classes {:alias :t
  58. :coerce []
  59. :desc "List of tags to convert to classes"}
  60. :property-classes {:alias :p
  61. :coerce []
  62. :desc "List of properties whose values convert to classes"}})
  63. (defn -main [args]
  64. (let [[file-graph db-graph-dir] args
  65. options (cli/parse-opts args {:spec spec})
  66. _ (when (or (< (count args) 2) (:help options))
  67. (println (str "Usage: $0 FILE-GRAPH DB-GRAPH [OPTIONS]\nOptions:\n"
  68. (cli/format-opts {:spec spec})))
  69. (js/process.exit 1))
  70. [dir db-name] (if (string/includes? db-graph-dir "/")
  71. (let [graph-dir'
  72. (node-path/join (or js/process.env.ORIGINAL_PWD ".") db-graph-dir)]
  73. ((juxt node-path/dirname node-path/basename) graph-dir'))
  74. [(node-path/join (os/homedir) "logseq" "graphs") db-graph-dir])
  75. file-graph' (node-path/join (or js/process.env.ORIGINAL_PWD ".") file-graph)
  76. conn (create-graph/init-conn dir db-name)]
  77. (p/do!
  78. (import-file-graph-to-db file-graph' conn (merge options {:graph-name db-name}))
  79. (when (:verbose options) (println "Transacted" (count (d/datoms @conn :eavt)) "datoms"))
  80. (println "Created graph" (str db-name "!")))))
  81. (when (= nbb/*file* (:file (meta #'-main)))
  82. (-main *command-line-args*))