branch: externals/org
commit 9c255cacfea64e2ef90892f2466cd3fc0c96f640
Author: Ihor Radchenko <yanta...@posteo.net>
Commit: Ihor Radchenko <yanta...@posteo.net>

    org-element-ignored-local-variables: Add missing variables
    
    This fixes ox-hugo bug when Org buffer copy cache is corrupted.
    
    * lisp/org-element.el (org-element--cache-variables): Add
    more state variables.  Move above
    `org-element-ignored-local-variables' definition.
    (org-element-ignored-local-variables): Make use of the value of
    `org-element--cache-variables'.
    *
    testing/lisp/test-org-element.el (test-org-element/cache-ignored-locals):
    Add guard against adding new cache state variables that are not listed
    in `org-element--cache-variables'.
    
    Reported-by: George Kettleborough <kett...@gmail.com>
    Link: 
https://orgmode.org/list/41acf96e-8f62-4ed5-9853-b4ff4e0e2...@gmail.com
---
 lisp/org-element.el              | 33 +++++++++++++++------------------
 testing/lisp/test-org-element.el | 25 +++++++++++++++++++++++++
 2 files changed, 40 insertions(+), 18 deletions(-)

diff --git a/lisp/org-element.el b/lisp/org-element.el
index fe747e0660..2ef4657ad3 100644
--- a/lisp/org-element.el
+++ b/lisp/org-element.el
@@ -499,14 +499,22 @@ past the brackets."
              (goto-char end)
              (buffer-substring-no-properties (1+ pos) (1- end)))))))))
 
+(defconst org-element--cache-variables
+  '( org-element--cache org-element--cache-size
+     org-element--headline-cache org-element--headline-cache-size
+     org-element--cache-hash-left org-element--cache-hash-right
+     org-element--cache-sync-requests org-element--cache-sync-timer
+     org-element--cache-sync-keys-value org-element--cache-change-tic
+     org-element--cache-last-buffer-size
+     org-element--cache-diagnostics-ring
+     org-element--cache-diagnostics-ring-size
+     org-element--cache-gapless
+     org-element--cache-change-warning)
+  "List of variable symbols holding cache state.")
+
 (defconst org-element-ignored-local-variables
-  '( org-font-lock-keywords org-element--cache-change-tic
-     org-element--cache-change-tic org-element--cache-size
-     org-element--headline-cache-size
-     org-element--cache-sync-keys-value
-     org-element--cache-change-warning org-element--headline-cache
-     org-element--cache org-element--cache-sync-keys
-     org-element--cache-sync-requests org-element--cache-sync-timer)
+  `( org-font-lock-keywords
+     ,@org-element--cache-variables)
   "List of variables not copied through upon Org buffer duplication.
 Export process and parsing in `org-element-parse-secondary-string'
 takes place on a copy of the original buffer.  When this copy is
@@ -5791,17 +5799,6 @@ See `org-element--cache-key' for more information.")
 (defvar-local org-element--cache-last-buffer-size nil
   "Last value of `buffer-size' for registered changes.")
 
-(defconst org-element--cache-variables
-  '( org-element--cache org-element--cache-size
-     org-element--headline-cache org-element--headline-cache-size
-     org-element--cache-hash-left org-element--cache-hash-right
-     org-element--cache-sync-requests org-element--cache-sync-timer
-     org-element--cache-sync-keys-value org-element--cache-change-tic
-     org-element--cache-last-buffer-size
-     org-element--cache-gapless
-     org-element--cache-change-warning)
-  "List of variable symbols holding cache state.")
-
 (defvar org-element--cache-non-modifying-commands
   '(org-agenda
     org-agenda-redo
diff --git a/testing/lisp/test-org-element.el b/testing/lisp/test-org-element.el
index ade255ea09..0098eaf152 100644
--- a/testing/lisp/test-org-element.el
+++ b/testing/lisp/test-org-element.el
@@ -5303,6 +5303,31 @@ a
          :title
          (org-element-lineage (org-element-at-point) '(headline))))))))
 
+(ert-deftest test-org-element/cache-ignored-locals ()
+  "Test `org-element-ignored-local-variables' value.
+Anything holding element cache state must not be copied around
+buffers, as in `org-element-copy-buffer' or
+`org-export-copy-buffer'.  Otherwise, we may encounter
+hard-to-debug errors when cache state is either not up-to-date or
+modified by side effect, influencing the original values."
+  (mapatoms
+   (lambda (var)
+     (when (and (boundp var)
+                (symbol-value var)
+                (string-match-p "^org-element--cache" (symbol-name var))
+                (not (memq var '(org-element--cache-interrupt-C-g-max-count
+                               org-element--cache-map-statistics-threshold
+                               org-element--cache-variables
+                               org-element--cache-interrupt-C-g-count
+                               org-element--cache-interrupt-C-g
+                               org-element--cache-element-properties
+                               org-element--cache-sensitive-re
+                               org-element--cache-hash-size
+                               org-element--cache-non-modifying-commands
+                               org-element--cache-self-verify-frequency
+                               org-element--cache-diagnostics-level))))
+       (should (memq var org-element-ignored-local-variables))))))
+
 (provide 'test-org-element)
 
 ;;; test-org-element.el ends here

Reply via email to