branch: elpa/vm
commit 64bdc613196565776a47e181f89e88533132b023
Merge: ba6f0201d2 e7a9e90795
Author: Mark Diekhans <[email protected]>
Commit: Mark Diekhans <[email protected]>

    Merge branch 'main' into 'main'
    
    Fix wrong-type-argument error in undo functions with intern records
    
    Closes #548
    
    See merge request emacs-vm/vm!79
---
 lisp/vm-undo.el      |  9 +++++++++
 test/vm-undo-test.el | 35 +++++++++++++++++++++++++++++++++++
 2 files changed, 44 insertions(+)

diff --git a/lisp/vm-undo.el b/lisp/vm-undo.el
index f7b41d2ce2..14200e7ba4 100644
--- a/lisp/vm-undo.el
+++ b/lisp/vm-undo.el
@@ -53,6 +53,9 @@
       (cond ((null (car udp))
             (setq udp-prev udp))
            ((and (not (eq (car (car udp)) 'vm-set-buffer-modified-p))
+                 ;; skip records that don't have a message struct
+                 ;; (e.g., intern records from vm-expunge-label)
+                 (vectorp (car (cdr (car udp))))
                  ;; delete flag == expunged is the
                  ;; indicator of an expunged message
                  (eq (vm-deleted-flag (car (cdr (car udp)))) 'expunged))
@@ -68,6 +71,9 @@
       (cond ((null (car udp))
             (setq udp-prev udp))
            ((and (not (eq (car (car udp)) 'vm-set-buffer-modified-p))
+                 ;; skip records that don't have a message struct
+                 ;; (e.g., intern records from vm-expunge-label)
+                 (vectorp (car (cdr (car udp))))
                  ;; message-id-number == "Q" is the
                  ;; indicator of a dead message
                  (equal (vm-message-id-number-of (car (cdr (car udp)))) "Q"))
@@ -151,6 +157,9 @@
 
 (defun vm-undo-set-message-pointer (record)
   (if (and (not (eq (car record) 'vm-set-buffer-modified-p))
+          ;; skip records that don't have a message struct
+          ;; (e.g., intern records from vm-expunge-label)
+          (vectorp (nth 1 record))
           (not (eq (nth 1 record) vm-message-pointer)))
       (progn
        (vm-record-and-change-message-pointer
diff --git a/test/vm-undo-test.el b/test/vm-undo-test.el
index 5d0a48d6e6..4604b80fe3 100644
--- a/test/vm-undo-test.el
+++ b/test/vm-undo-test.el
@@ -230,6 +230,41 @@ Body
     ;; Label should be back in obarray
     (should (intern-soft "undo-test" vm-label-obarray))))
 
+;;; Test for clear-expunge handling of non-message records (bug fix)
+
+(ert-deftest vm-undo-test-clear-expunge-handles-intern-records ()
+  "Test that vm-clear-expunge-invalidated-undos handles intern records.
+This tests the fix for a bug where intern records from vm-expunge-label
+caused wrong-type-argument errors because the function assumed all
+non-boundary records had message structs."
+  (let ((vm-undo-record-list
+         (list nil
+               '(intern "some-label" vm-label-obarray)  ; non-message record
+               nil)))
+    ;; Should not error
+    (vm-clear-expunge-invalidated-undos)
+    ;; The intern record should still be there (not removed)
+    (should (member '(intern "some-label" vm-label-obarray)
+                    vm-undo-record-list))))
+
+(ert-deftest vm-undo-test-clear-virtual-quit-handles-intern-records ()
+  "Test that vm-clear-virtual-quit-invalidated-undos handles intern records."
+  (let ((vm-undo-record-list
+         (list nil
+               '(intern "some-label" vm-label-obarray)  ; non-message record
+               nil)))
+    ;; Should not error
+    (vm-clear-virtual-quit-invalidated-undos)
+    ;; The intern record should still be there (not removed)
+    (should (member '(intern "some-label" vm-label-obarray)
+                    vm-undo-record-list))))
+
+(ert-deftest vm-undo-test-set-message-pointer-handles-intern-records ()
+  "Test that vm-undo-set-message-pointer handles intern records."
+  (let ((vm-message-pointer nil))
+    ;; Should not error when called with an intern record
+    (vm-undo-set-message-pointer '(intern "some-label" vm-label-obarray))))
+
 ;;; Flag setting functions tests
 
 (ert-deftest vm-undo-test-flag-functions-exist ()

Reply via email to