fix id retrieval resulting in infinite loop

Use custom `org-roam-up-heading-or-point-min` to prevent infinite
looping during ID retrieval. Fixes #1452.
This commit is contained in:
Jethro Kuan
2021-03-24 13:53:57 +08:00
parent e238c6d766
commit 2f77ae709d
3 changed files with 28 additions and 11 deletions

View File

@ -47,6 +47,7 @@
(defvar org-roam-verbose)
(defvar org-agenda-files)
(declare-function org-roam-id-at-point "org-roam")
(declare-function org-roam--org-roam-file-p "org-roam")
(declare-function org-roam--list-all-files "org-roam")
(declare-function org-roam-node-at-point "org-roam-node")
@ -235,6 +236,17 @@ If UPDATE-P is non-nil, first remove the file in the database."
:values $v1]
(list (vector file hash)))))
(defun org-roam-id-at-point ()
"Return the ID at point, if any.
Recursively traverses up the headline tree to find the
first encapsulating ID."
(let (source)
(org-with-wide-buffer
(while (and (not (setq source (org-id-get)))
(not (bobp)))
(org-roam-up-heading-or-point-min)))
source))
(defun org-roam-db-get-scheduled-time ()
"Return the scheduled time at point in ISO8601 format."
(when-let ((time (org-get-scheduled-time (point))))
@ -376,11 +388,7 @@ If UPDATE-P is non-nil, first remove the file in the database."
(type (org-element-property :type link))
(dest (org-element-property :path link))
(properties (list :outline (org-get-outline-path)))
source)
(save-excursion
(while (and (not (setq source (org-id-get)))
(not (bobp)))
(org-up-heading-or-point-min)))
(source (org-roam-id-at-point)))
(when source
(org-roam-db-query
[:insert :into links

View File

@ -37,6 +37,7 @@
(eval-when-compile
(require 'org-roam-macs))
(declare-function org-roam-id-at-point "org-roam")
(defvar org-roam-mode-sections)
;;; Section
@ -117,12 +118,8 @@ nodes."
If ASSERT, throw an error."
(if-let ((node (magit-section-case
(org-roam-node-section (oref it node))
(t (let (id)
(org-with-wide-buffer
(while (and (not (setq id (org-id-get)))
(not (bobp)))
(org-up-heading-or-point-min))
(org-roam-populate (org-roam-node-create :id id))))))))
(t (when-let ((id (org-roam-id-at-point)))
(org-roam-populate (org-roam-node-create :id id)))))))
node
(when assert
(user-error "No node at point"))))

View File

@ -161,6 +161,18 @@ This face is used on the region target by `org-roam-insertion'
during an `org-roam-capture'."
:group 'org-roam-faces)
;;;; ID Utilities
(defun org-roam-id-at-point ()
"Return the ID at point, if any.
Recursively traverses up the headline tree to find the
first encapsulating ID."
(let (source)
(org-with-wide-buffer
(while (and (not (setq source (org-id-get)))
(not (bobp)))
(org-roam-up-heading-or-point-min)))
source))
;;;; File functions and predicates
(defun org-roam--file-name-extension (filename)
"Return file name extension for FILENAME.