There is an edge case triggering infinite loop in oc-basic. It is caused by bibtex-map-entries (used in org-cite-basic--parse-bibtex) when ran on a malformed bibtex buffer [1].
The proposed patch validates the bibtex buffer before processing and throws an error if issues are found. `bibtex-validate` also conveniently displays a list of errors with clickable links to problematic lines. I believe that it is useful for the users to see such issues instead of, say, failing silently on malformed bibliographies. WDYT? Best, Ihor [1] https://debbugs.gnu.org/cgi/bugreport.cgi?bug=55036 * lisp/oc-basic.el (org-cite-basic--parse-bibtex): Validate the bibliography before parsing. Display list of issues if any (via `bibtex-validate`). (org-cite-basic--parse-bibliography): Set buffer file name needed by `bibtex-validate`. Empty the cache in case of error. --- lisp/oc-basic.el | 38 ++++++++++++++++++++++++-------------- 1 file changed, 24 insertions(+), 14 deletions(-) diff --git a/lisp/oc-basic.el b/lisp/oc-basic.el index 873986d07..79f7a4844 100644 --- a/lisp/oc-basic.el +++ b/lisp/oc-basic.el @@ -214,6 +214,10 @@ (defun org-cite-basic--parse-bibtex (dialect) (let ((entries (make-hash-table :test #'equal)) (bibtex-sort-ignore-string-entries t)) (bibtex-set-dialect dialect t) + ;; Throw an error if bibliography is malformed. + (unless (bibtex-validate) + (user-error "Malformed bibliography at %S" + (or (buffer-file-name) (current-buffer)))) (bibtex-map-entries (lambda (key &rest _) ;; Normalize entries: field names are turned into symbols @@ -258,21 +262,27 @@ (defun org-cite-basic--parse-bibliography (&optional info) (when (or (org-file-has-changed-p file) (not (gethash file org-cite-basic--file-id-cache))) (insert-file-contents file) + (setf (buffer-file-name) file) (puthash file (org-buffer-hash) org-cite-basic--file-id-cache)) - (let* ((file-id (cons file (gethash file org-cite-basic--file-id-cache))) - (entries - (or (cdr (assoc file-id org-cite-basic--bibliography-cache)) - (let ((table - (pcase (file-name-extension file) - ("json" (org-cite-basic--parse-json)) - ("bib" (org-cite-basic--parse-bibtex 'biblatex)) - ("bibtex" (org-cite-basic--parse-bibtex 'BibTeX)) - (ext - (user-error "Unknown bibliography extension: %S" - ext))))) - (push (cons file-id table) org-cite-basic--bibliography-cache) - table)))) - (push (cons file entries) results))))) + (unwind-protect + (condition-case nil + (unwind-protect + (let* ((file-id (cons file (gethash file org-cite-basic--file-id-cache))) + (entries + (or (cdr (assoc file-id org-cite-basic--bibliography-cache)) + (let ((table + (pcase (file-name-extension file) + ("json" (org-cite-basic--parse-json)) + ("bib" (org-cite-basic--parse-bibtex 'biblatex)) + ("bibtex" (org-cite-basic--parse-bibtex 'BibTeX)) + (ext + (user-error "Unknown bibliography extension: %S" + ext))))) + (push (cons file-id table) org-cite-basic--bibliography-cache) + table)))) + (push (cons file entries) results)) + (setf (buffer-file-name) nil)) + (error (setq org-cite-basic--file-id-cache nil))))))) (when info (plist-put info :cite-basic/bibliography results)) results))) -- 2.35.1 -- Ihor Radchenko, PhD, Center for Advancing Materials Performance from the Nanoscale (CAMP-nano) State Key Laboratory for Mechanical Behavior of Materials, Xi'an Jiaotong University, Xi'an, China Email: yanta...@gmail.com, ihor_radche...@alumni.sutd.edu.sg