mirror of https://github.com/logseq/logseq
Enable broken chain check for undo/redo test
parent
2296eca383
commit
26588775e9
|
@ -9,14 +9,21 @@
|
||||||
[frontend.worker.util :as worker-util]))
|
[frontend.worker.util :as worker-util]))
|
||||||
|
|
||||||
(defn- fix-parent-broken-chain
|
(defn- fix-parent-broken-chain
|
||||||
[db parent-id]
|
[db parent-id tx-report]
|
||||||
(let [parent (d/entity db parent-id)
|
(let [parent (d/entity db parent-id)
|
||||||
parent-id (:db/id parent)
|
parent-id (:db/id parent)
|
||||||
blocks (:block/_parent parent)]
|
blocks (:block/_parent parent)]
|
||||||
(when (seq blocks)
|
(when (seq blocks)
|
||||||
(let [children-ids (set (map :db/id blocks))
|
(let [children-ids (set (map :db/id blocks))
|
||||||
sorted (ldb/sort-by-left blocks parent)
|
sorted (ldb/sort-by-left blocks parent)
|
||||||
broken-chain? (not= (count sorted) (count blocks))]
|
valid-left-ids (set (cons (:db/id parent) (map :db/id blocks)))
|
||||||
|
broken-chain? (or (not= (count sorted) (count blocks))
|
||||||
|
;; :block/left points to other blocks that're not current parent or its children
|
||||||
|
(not (every? (fn [b] (contains? valid-left-ids (:db/id (:block/left b)))) blocks)))]
|
||||||
|
(when (and (exists? js/process) broken-chain?)
|
||||||
|
(throw (ex-info "outliner broken chain" {:tx-meta (:tx-meta tx-report)
|
||||||
|
:tx-data (:tx-data tx-report)
|
||||||
|
:db-before (:db-before tx-report)})))
|
||||||
(when broken-chain?
|
(when broken-chain?
|
||||||
(let [error-data {:parent {:db/id parent-id
|
(let [error-data {:parent {:db/id parent-id
|
||||||
:block/uuid (:block/uuid parent)
|
:block/uuid (:block/uuid parent)
|
||||||
|
@ -92,9 +99,9 @@
|
||||||
(apply concat))))))))
|
(apply concat))))))))
|
||||||
|
|
||||||
(defn- fix-broken-chain
|
(defn- fix-broken-chain
|
||||||
[db parent-left->es]
|
[db parent-left->es tx-report]
|
||||||
(let [parents (distinct (map first (keys parent-left->es)))]
|
(let [parents (distinct (map first (keys parent-left->es)))]
|
||||||
(mapcat #(fix-parent-broken-chain db %) parents)))
|
(mapcat #(fix-parent-broken-chain db % tx-report) parents)))
|
||||||
|
|
||||||
(defn- build-parent-left->es
|
(defn- build-parent-left->es
|
||||||
[db page-id]
|
[db page-id]
|
||||||
|
@ -142,6 +149,8 @@
|
||||||
[conn page-id transact-opts *fix-tx-data]
|
[conn page-id transact-opts *fix-tx-data]
|
||||||
(let [db @conn
|
(let [db @conn
|
||||||
conflicts (get-conflicts db page-id)
|
conflicts (get-conflicts db page-id)
|
||||||
|
_ (when (and (exists? js/process) (seq conflicts))
|
||||||
|
(throw (ex-info "outliner core conflicts" {:conflicts conflicts})))
|
||||||
fix-conflicts-tx (when (seq conflicts)
|
fix-conflicts-tx (when (seq conflicts)
|
||||||
(fix-parent-left-conflicts db conflicts page-id))]
|
(fix-parent-left-conflicts db conflicts page-id))]
|
||||||
(when (seq fix-conflicts-tx)
|
(when (seq fix-conflicts-tx)
|
||||||
|
@ -154,7 +163,7 @@
|
||||||
|
|
||||||
(defn fix-page-if-broken!
|
(defn fix-page-if-broken!
|
||||||
"Fix the page if it has either parent-left conflicts or broken chains."
|
"Fix the page if it has either parent-left conflicts or broken chains."
|
||||||
[conn page-id {:keys [fix-parent-left? fix-broken-chain? replace-tx?]
|
[conn page-id {:keys [fix-parent-left? fix-broken-chain? replace-tx? tx-report]
|
||||||
:or {fix-parent-left? true
|
:or {fix-parent-left? true
|
||||||
fix-broken-chain? true
|
fix-broken-chain? true
|
||||||
replace-tx? false}
|
replace-tx? false}
|
||||||
|
@ -170,7 +179,7 @@
|
||||||
(when fix-broken-chain?
|
(when fix-broken-chain?
|
||||||
(let [db' @conn
|
(let [db' @conn
|
||||||
parent-left->es' (build-parent-left->es db page-id)
|
parent-left->es' (build-parent-left->es db page-id)
|
||||||
fix-broken-chain-tx (fix-broken-chain db' parent-left->es')]
|
fix-broken-chain-tx (fix-broken-chain db' parent-left->es' tx-report)]
|
||||||
(when (seq fix-broken-chain-tx)
|
(when (seq fix-broken-chain-tx)
|
||||||
(let [tx-data (:tx-data (ldb/transact! conn fix-broken-chain-tx transact-opts))]
|
(let [tx-data (:tx-data (ldb/transact! conn fix-broken-chain-tx transact-opts))]
|
||||||
(swap! *fix-tx-data (fn [old-data] (concat old-data tx-data)))))))
|
(swap! *fix-tx-data (fn [old-data] (concat old-data tx-data)))))))
|
||||||
|
|
|
@ -49,7 +49,7 @@
|
||||||
(remove nil?)))))
|
(remove nil?)))))
|
||||||
|
|
||||||
(defn fix-db!
|
(defn fix-db!
|
||||||
[conn {:keys [db-before db-after tx-data]}]
|
[conn {:keys [db-before db-after tx-data] :as tx-report}]
|
||||||
(let [changed-pages (->> (filter (fn [d] (contains? #{:block/left :block/parent} (:a d))) tx-data)
|
(let [changed-pages (->> (filter (fn [d] (contains? #{:block/left :block/parent} (:a d))) tx-data)
|
||||||
(map :e)
|
(map :e)
|
||||||
distinct
|
distinct
|
||||||
|
@ -61,7 +61,7 @@
|
||||||
(remove nil?)
|
(remove nil?)
|
||||||
(distinct))]
|
(distinct))]
|
||||||
(doseq [changed-page-id changed-pages]
|
(doseq [changed-page-id changed-pages]
|
||||||
(db-fix/fix-page-if-broken! conn changed-page-id {}))))
|
(db-fix/fix-page-if-broken! conn changed-page-id {:tx-report tx-report}))))
|
||||||
|
|
||||||
(defn validate-and-fix-db!
|
(defn validate-and-fix-db!
|
||||||
[repo conn tx-report context]
|
[repo conn tx-report context]
|
||||||
|
@ -70,8 +70,8 @@
|
||||||
(when (and (get-in context [:validate-db-options :fail-invalid?]) (not valid?))
|
(when (and (get-in context [:validate-db-options :fail-invalid?]) (not valid?))
|
||||||
(worker-util/post-message :notification
|
(worker-util/post-message :notification
|
||||||
[["Invalid DB!"] :error]))))
|
[["Invalid DB!"] :error]))))
|
||||||
(when (and (:dev? context)
|
(when (or (:dev? context)
|
||||||
(not (:node-test? context)))
|
(exists? js/process))
|
||||||
(fix-db! conn tx-report)))
|
(fix-db! conn tx-report)))
|
||||||
|
|
||||||
(defn invoke-hooks
|
(defn invoke-hooks
|
||||||
|
|
|
@ -12,7 +12,7 @@
|
||||||
(assert (some? test-db-conn))
|
(assert (some? test-db-conn))
|
||||||
(worker-undo-redo/clear-undo-redo-stack)
|
(worker-undo-redo/clear-undo-redo-stack)
|
||||||
(worker-db-listener/listen-db-changes! test-helper/test-db-name-db-version test-db-conn
|
(worker-db-listener/listen-db-changes! test-helper/test-db-name-db-version test-db-conn
|
||||||
{:handler-keys [:gen-undo-ops]})
|
{:handler-keys [:gen-undo-ops :sync-db-to-main-thread]})
|
||||||
|
|
||||||
(f)
|
(f)
|
||||||
(d/unlisten! test-db-conn :frontend.worker.db-listener/listen-db-changes!)))
|
(d/unlisten! test-db-conn :frontend.worker.db-listener/listen-db-changes!)))
|
||||||
|
|
|
@ -275,7 +275,7 @@
|
||||||
(catch :default e
|
(catch :default e
|
||||||
(let [data (ex-data e)]
|
(let [data (ex-data e)]
|
||||||
(fs-node/writeFileSync "debug.json" (sqlite-util/write-transit-str data))
|
(fs-node/writeFileSync "debug.json" (sqlite-util/write-transit-str data))
|
||||||
(throw (ex-info "stop now" {}))))))
|
(throw e)))))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue