Julian Bradfield
2013-01-08 09:00:24 UTC
After a year (or maybe two) of elapsed time and probably tens of hours
staring at the lisp debugger, I have finally tracked down the most
annoying (for me) outstanding bug in vm. That is, I've fixed it, but I
don't understand the fix or the bug!
My vm is Uday's private 8.2.X branch of 6 February 2012, but I think
this bug is still in trunk (haven't tried it, though).
Here's the bug description:
Create a folder (say /tmp/I) containing a single message.
Visit the folder, and add the label "a" to the message.
Quit the folder.
Now do
(setq vm-virtual-folder-alist
'(
("V" (("/tmp/I") (any)))))
Visit the virtual folder V.
Add the label "b" to the message.
The summary mode line will show the message as having labels "a" and
"b", as expected; but in fact the message has only the new label "b".
To see this, save the folder, quit, and re-visit the real folder (or
the virtual folder).
The thing that happened this morning was that I spent so long staring
at one line in the debugger that the flush timer fired while I was
doing so, which magically made the bug not happen.
The following patch appears to fix the bug:
*** vm-undo.el 2012/11/26 15:09:10 1.1
--- vm-undo.el 2013/01/08 08:27:02 1.2
***************
*** 597,603 ****
(vm-set-labels-of m labels)
(vm-set-label-string-of m nil)
(vm-mark-for-summary-update m)
! (if (eq vm-flush-interval t)
(vm-stuff-virtual-message-data m)
(vm-set-stuff-flag-of m t))))))
--- 597,604 ----
(vm-set-labels-of m labels)
(vm-set-label-string-of m nil)
(vm-mark-for-summary-update m)
! ;; deferring stuffing breaks labels in virtual folders
! (if t ;(eq vm-flush-interval t)
(vm-stuff-virtual-message-data m)
(vm-set-stuff-flag-of m t))))))
This does raise the question in my mind as to whether the other
similarly deferred uses of vm-stuff-virtual-message-data are
dangerous.
staring at the lisp debugger, I have finally tracked down the most
annoying (for me) outstanding bug in vm. That is, I've fixed it, but I
don't understand the fix or the bug!
My vm is Uday's private 8.2.X branch of 6 February 2012, but I think
this bug is still in trunk (haven't tried it, though).
Here's the bug description:
Create a folder (say /tmp/I) containing a single message.
Visit the folder, and add the label "a" to the message.
Quit the folder.
Now do
(setq vm-virtual-folder-alist
'(
("V" (("/tmp/I") (any)))))
Visit the virtual folder V.
Add the label "b" to the message.
The summary mode line will show the message as having labels "a" and
"b", as expected; but in fact the message has only the new label "b".
To see this, save the folder, quit, and re-visit the real folder (or
the virtual folder).
The thing that happened this morning was that I spent so long staring
at one line in the debugger that the flush timer fired while I was
doing so, which magically made the bug not happen.
The following patch appears to fix the bug:
*** vm-undo.el 2012/11/26 15:09:10 1.1
--- vm-undo.el 2013/01/08 08:27:02 1.2
***************
*** 597,603 ****
(vm-set-labels-of m labels)
(vm-set-label-string-of m nil)
(vm-mark-for-summary-update m)
! (if (eq vm-flush-interval t)
(vm-stuff-virtual-message-data m)
(vm-set-stuff-flag-of m t))))))
--- 597,604 ----
(vm-set-labels-of m labels)
(vm-set-label-string-of m nil)
(vm-mark-for-summary-update m)
! ;; deferring stuffing breaks labels in virtual folders
! (if t ;(eq vm-flush-interval t)
(vm-stuff-virtual-message-data m)
(vm-set-stuff-flag-of m t))))))
This does raise the question in my mind as to whether the other
similarly deferred uses of vm-stuff-virtual-message-data are
dangerous.