[PATCH] emacs: show: lazy part bugfix

Subject: [PATCH] emacs: show: lazy part bugfix

Date: Fri, 23 Aug 2013 09:34:35 +0100

To: notmuch@notmuchmail.org, amdragon@MIT.EDU

Cc:

From: Mark Walters


The lazy part handling had a subtle bug. Notmuch stores the part
information as a text property with the displayed part so attachment
handling (saving viewing etc work).

Now, some mime parts have subparts and to avoid overwriting the
sub-part data notmuch checks and if part data is already recorded it
does not overwrite it.

Now with lazy part handling this could fail: there is already part
data stored. In the common case it works as the part type information
was stored when the lazy-part button was inserted. However, this fails
if the lazy part has sub-parts: notmuch had no idea these existed
until the lazy part insertion.

We fix this by removing any existing part-information from the
relevant region before doing the lazy insertion.
---
This was shown up by Istvan's patch in id:m3r4dtgz9k.fsf@zsu.kismala.com and 
the bug found by Jamie in id:87fvu4fl25.fsf@servo.finestructure.net

I think this is essentially the right patch: I am not certain about
the +1 in the removing the property. It seems to be needed but maybe
something with front/back sticky would be better.

Also this definitely needs more testing before going into master: this
code is definitely fragile.

Best wishes 

Mark

 emacs/notmuch-show.el |    3 +++
 1 files changed, 3 insertions(+), 0 deletions(-)

diff --git a/emacs/notmuch-show.el b/emacs/notmuch-show.el
index 20844f0..a31b6dc 100644
--- a/emacs/notmuch-show.el
+++ b/emacs/notmuch-show.el
@@ -853,6 +853,9 @@ message at DEPTH in the current thread."
   ;; character of the button by adding a newline and finish by
   ;; removing the extra newline from the end of the part.
   (save-excursion
+    ;; Remove part-information from lazy part-region
+    (put-text-property (button-start button) (1+ (button-end button)) :notmuch-part nil)
+
     (goto-char (button-end button))
     (insert "\n")
     (let* ((inhibit-read-only t)
-- 
1.7.9.1


Thread: