branch: externals/org commit 2a4e5a8e58f381497b5b53e96691ac2eaf98bdcd Author: Ihor Radchenko <yanta...@gmail.com> Commit: Ihor Radchenko <yanta...@gmail.com>
org-persist--normalize-associated: Use cache to calculate buffer hash --- lisp/org-persist.el | 31 +++++++++++++++++++++++-------- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/lisp/org-persist.el b/lisp/org-persist.el index 9fee5f7936..413c7790d8 100644 --- a/lisp/org-persist.el +++ b/lisp/org-persist.el @@ -355,6 +355,9 @@ or file-path, (:inode inode), (:hash hash), or or (:key key)." container) (_ (error "org-persist: Unknown container type: %S" container))))) +(defvar org-persist--associated-buffer-cache (make-hash-table :weakness 'key) + "Buffer hash cache.") + (defun org-persist--normalize-associated (associated) "Normalize ASSOCIATED representation into (:type value)." (pcase associated @@ -368,14 +371,26 @@ or file-path, (:inode inode), (:hash hash), or or (:key key)." rtn)) ((or (pred bufferp) `(:buffer ,associated2)) (when associated2 (setq associated associated2)) - (let* ((file (buffer-file-name - (or (buffer-base-buffer associated) - associated))) - (inode (when (and file - (fboundp 'file-attribute-inode-number)) - (file-attribute-inode-number - (file-attributes file)))) - (hash (secure-hash 'md5 associated))) + (let ((cached (gethash associated org-persist--associated-buffer-cache)) + file inode hash) + (if (and cached (eq (buffer-modified-tick associated) + (car cached))) + (progn + (setq file (nth 1 cached) + inode (nth 2 cached) + hash (nth 3 cached))) + (setq file (buffer-file-name + (or (buffer-base-buffer associated) + associated))) + (setq inode (when (and file + (fboundp 'file-attribute-inode-number)) + (file-attribute-inode-number + (file-attributes file)))) + (setq hash (secure-hash 'md5 associated)) + (puthash associated + (list (buffer-modified-tick associated) + file inode hash) + org-persist--associated-buffer-cache)) (let ((rtn `(:hash ,hash))) (when file (setq rtn (plist-put rtn :file file))) (when inode (setq rtn (plist-put rtn :inode inode)))