mirror of
https://github.com/org-roam/org-roam
synced 2025-08-01 12:17:21 -05:00
(fix)org-id: condition-case instead of unwind-protect the error handler
unwind-protect will still propagate the initial error, which isn't desirable and can confuse both, the end-user and us when resolving issues. To keep the backtrace clean (in case of other errors), just automatically detatch the advice once it ran in the error handling branch. If the user change the file at the runtime, org-id shouldn't fail with the error as long as it was handled at least once, and it still will be handled by us during the next session. At the end of the day it's a very niche edge case, which most of the users shouldn't ever see. Fixes #1805.
This commit is contained in:
@ -99,22 +99,20 @@ recursion."
|
|||||||
(advice-add #'org-id-add-location :around #'org-roam--handle-absent-org-id-locations-file-a)
|
(advice-add #'org-id-add-location :around #'org-roam--handle-absent-org-id-locations-file-a)
|
||||||
(defun org-roam--handle-absent-org-id-locations-file-a (fn &rest args)
|
(defun org-roam--handle-absent-org-id-locations-file-a (fn &rest args)
|
||||||
"Gracefully handle errors related to absence of `org-id-locations-file'.
|
"Gracefully handle errors related to absence of `org-id-locations-file'.
|
||||||
FN is `org-id-locations-file' that comes from advice and ARGS are
|
FN is `org-id-add-location' that comes from advice and ARGS are
|
||||||
passed to it."
|
passed to it."
|
||||||
(let (result)
|
(condition-case err
|
||||||
;; Use `unwind-protect' over `condition-case' because `org-id' can produce various other errors, but all
|
(apply fn args)
|
||||||
;; of its errors are generic ones, so trapping all of them isn't a good idea and preserving the correct
|
|
||||||
;; backtrace is valuable.
|
|
||||||
(unwind-protect (setq result (apply fn args))
|
|
||||||
(unless result
|
|
||||||
(unless org-id-locations
|
|
||||||
;; Pre-allocate the hash table to avoid weird access related errors during the regeneration.
|
|
||||||
(setq org-id-locations (make-hash-table :test 'equal)))
|
|
||||||
;; `org-id' makes the assumption that `org-id-locations-file' will be stored in `user-emacs-directory'
|
;; `org-id' makes the assumption that `org-id-locations-file' will be stored in `user-emacs-directory'
|
||||||
;; which always exist if you have Emacs, so it uses `with-temp-file' to write to the file. However,
|
;; which always exist if you have Emacs, so it uses `with-temp-file' to write to the file. However, the
|
||||||
;; the users *do* change the path to this file and `with-temp-file' unable to create the file, if the
|
;; users *do* change the path to this file and `with-temp-file' unable to create the file, if the path to
|
||||||
;; path to it consists of directories that don't exist. We'll have to handle this ourselves.
|
;; it consists of directories that don't exist. We'll have to handle this ourselves.
|
||||||
(unless (file-exists-p (file-truename org-id-locations-file))
|
(error
|
||||||
|
(advice-remove 'org-id-add-location #'org-roam--handle-absent-org-id-locations-file-a)
|
||||||
|
(if (file-exists-p (file-truename org-id-locations-file))
|
||||||
|
(signal (car err) (cdr err))
|
||||||
|
;; Pre-allocate the hash table to avoid weird access related errors during the regeneration.
|
||||||
|
(or org-id-locations (setq org-id-locations (make-hash-table :test 'equal)))
|
||||||
;; If permissions allow that, try to create the user specified directory path to
|
;; If permissions allow that, try to create the user specified directory path to
|
||||||
;; `org-id-locations-file' ourselves.
|
;; `org-id-locations-file' ourselves.
|
||||||
(condition-case _err
|
(condition-case _err
|
||||||
@ -153,8 +151,7 @@ identification (e.g. with \"ROAM_EXCLUDE\" property) as Org-roam
|
|||||||
nodes." org-id-locations-file)
|
nodes." org-id-locations-file)
|
||||||
(setq org-id-locations-file
|
(setq org-id-locations-file
|
||||||
(expand-file-name ".orgids" (file-truename org-roam-directory)))
|
(expand-file-name ".orgids" (file-truename org-roam-directory)))
|
||||||
(apply fn args)))))
|
(apply fn args)))))))
|
||||||
result)))
|
|
||||||
|
|
||||||
;;; Obsolete aliases (remove after next major release)
|
;;; Obsolete aliases (remove after next major release)
|
||||||
(define-obsolete-function-alias
|
(define-obsolete-function-alias
|
||||||
|
Reference in New Issue
Block a user