0
0
Fork 1
mirror of https://git.savannah.gnu.org/git/emacs/org-mode.git synced 2024-09-19 20:09:54 +00:00

org-element-cache: Catch problems with persistent cache and abort loading

* lisp/org-element.el (org-element--cache-persist-after-read): When
the persistent cache has elements without parent, do not use such
cache and report a warning to user.
This commit is contained in:
Ihor Radchenko 2023-09-16 11:52:27 +03:00
parent aee3f2227f
commit 2e5db7a591
No known key found for this signature in database
GPG key ID: 6470762A7DA11D8B

View file

@ -7389,22 +7389,29 @@ The element is: %S\n The real element is: %S\n Cache around :begin:\n%S\n%S\n%S"
(get-file-buffer (plist-get associated :file)))
(with-current-buffer (get-file-buffer (plist-get associated :file))
(when (and org-element-use-cache org-element-cache-persistent)
(when (and (equal container '(elisp org-element--cache)) org-element--cache)
;; Restore `:buffer' property.
(avl-tree-mapc
(lambda (el)
(org-element-map el t
(lambda (el2)
(unless (org-element-type-p el2 'plain-text)
(org-element-put-property el2 :buffer (current-buffer))))
nil nil nil 'with-affiliated 'no-undefer)
(org-element--cache-log-message
"Recovering persistent cached element: %S"
(org-element--format-element el)))
org-element--cache)
(setq-local org-element--cache-size (avl-tree-size org-element--cache)))
(when (and (equal container '(elisp org-element--headline-cache)) org-element--headline-cache)
(setq-local org-element--headline-cache-size (avl-tree-size org-element--headline-cache)))))))
(catch 'abort
(when (and (equal container '(elisp org-element--cache)) org-element--cache)
;; Restore `:buffer' property.
(avl-tree-mapc
(lambda (el)
(org-element-map el t
(lambda (el2)
(unless (org-element-type-p el2 'plain-text)
(org-element-put-property el2 :buffer (current-buffer))))
nil nil nil 'with-affiliated 'no-undefer)
(org-element--cache-log-message
"Recovering persistent cached element: %S"
(org-element--format-element el))
(when (and (not (org-element-parent el)) (not (org-element-type-p el 'org-data)))
(org-element--cache-warn
"Got element without parent when loading cache from disk. Not using this persistent cache.
Please report it to Org mode mailing list (M-x org-submit-bug-report).\n%S" el)
(org-element-cache-reset)
(throw 'abort t)))
org-element--cache)
(setq-local org-element--cache-size (avl-tree-size org-element--cache)))
(when (and (equal container '(elisp org-element--headline-cache)) org-element--headline-cache)
(setq-local org-element--headline-cache-size (avl-tree-size org-element--headline-cache))))))))
(add-hook 'org-persist-before-write-hook #'org-element--cache-persist-before-write)
(add-hook 'org-persist-before-read-hook #'org-element--cache-persist-before-read)