Ver código fonte

fix: remove orphaned files/blocks from db when comparing db && disk

Tienson Qin 2 anos atrás
pai
commit
ddd2cb3f0a
1 arquivos alterados com 20 adições e 10 exclusões
  1. 20 10
      src/main/frontend/fs/watcher_handler.cljs

+ 20 - 10
src/main/frontend/fs/watcher_handler.cljs

@@ -18,7 +18,8 @@
             [frontend.fs :as fs]
             [frontend.fs.capacitor-fs :as capacitor-fs]
             [frontend.util.fs :as fs-util]
-            [frontend.util :as util]))
+            [frontend.util :as util]
+            [clojure.set :as set]))
 
 ;; all IPC paths must be normalized! (via gp-util/path-normalize)
 
@@ -119,12 +120,21 @@
 (defn load-graph-files!
   [graph]
   (when graph
-    (let [dir (config/get-repo-dir graph)]
-      (p/let [files (fs/readdir dir :path-only? true)]
-        (doseq [file files]
-          (when-let [_ext (util/get-file-ext file)]
-            (->
-             (when-not (fs-util/ignored-path? dir file)
+    (let [dir (config/get-repo-dir graph)
+          db-files (->> (db/get-files graph)
+                        (map first)
+                        (filter #(string/starts-with? % (config/get-repo-dir graph))))]
+      (p/let [files (fs/readdir dir :path-only? true)
+              files (remove #(fs-util/ignored-path? dir %) files)]
+        (let [deleted-files (set/difference (set db-files) (set files))]
+          (when (seq deleted-files)
+            (let [delete-tx-data (->> (db/delete-files deleted-files)
+                                      (concat (db/delete-blocks graph files nil))
+                                      (remove nil?))]
+              (db/transact! graph delete-tx-data)))
+          (doseq [file files]
+            (when-let [_ext (util/get-file-ext file)]
+              (->
                (p/let [content (fs/read-file dir file)
                        stat (fs/stat dir file)
                        type (if (db/file-exists? graph file)
@@ -134,6 +144,6 @@
                                   {:dir dir
                                    :path file
                                    :content content
-                                   :stat stat})))
-             (p/catch (fn [error]
-                        (js/console.dir error))))))))))
+                                   :stat stat}))
+               (p/catch (fn [error]
+                          (js/console.dir error)))))))))))