[PATCH v2] emacs: show: lazy part bugfix

Austin Clements amdragon at MIT.EDU
Wed Sep 4 07:56:39 PDT 2013


Quoth Mark Walters on Sep 04 at  8:30 am:
> 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).

s/ work)/) 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.

This says that things fail when a lazy part has sub-parts, but not
what the failure is.  What is the failure?  Can you give a specific
sequence of events and conditions that leads to and demonstrates the
failure?

(I ask not just for commit posterity, but because I actually don't
know, though I may have figured it out after writing the comment
below.)

> We fix this by removing any existing part-information from the
> relevant region before doing the lazy insertion.
> ---
> This is the same as the previous patch
> id:1377246875-7784-1-git-send-email-markwalters1009 at gmail.com except I
> have added a substantial comment. I now believe the +1 in the remove
> part information is genuinely correct for the reason detailed in the comment.
>  
> This does seem to fix an actual bug (see parent message and links there).
> 
> Best wishes
> 
> Mark
> 
> 
>  emacs/notmuch-show.el |   13 +++++++++++++
>  1 files changed, 13 insertions(+), 0 deletions(-)
> 
> diff --git a/emacs/notmuch-show.el b/emacs/notmuch-show.el
> index 20844f0..58ef4df 100644
> --- a/emacs/notmuch-show.el
> +++ b/emacs/notmuch-show.el
> @@ -852,7 +852,20 @@ message at DEPTH in the current thread."
>    ;; from a message header etc) so instead we start from the last
>    ;; character of the button by adding a newline and finish by
>    ;; removing the extra newline from the end of the part.
> +  ;;
> +  ;; Essentially, this function wants text properties to be
> +  ;; front-nonsticky (where most of the other functions need
> +  ;; front-sticky so that is what they actually are) and this is a way
> +  ;; of faking the front-nonsticky for this one function.

Most properties are rear-sticky and front-nonsticky.  Maybe this is
referring specifically to :notmuch-part, which is the other way
around?

> +  ;;
> +  ;; For exactly this reason we also remove existing part-information
> +  ;; from one extra character: this extra character is the newline
> +  ;; that we delete at the end.

This comment doesn't say what the root of the problem is.  Is the
following accurate?

;; First, eliminate the :notmuch-part property from the region we'll
;; be inserting this part in, since we never override an existing
;; :notmuch-part property.  If we're inserting a leaf part, it will
;; re-apply the same :notmuch-part, but if this isn't a leaf, the
;; children need to apply different :notmuch-part values.
;; :notmuch-part was originally applied to the newline following the
;; button as well, so remove it from that character, too.  (If we
;; didn't remove it from the newline, this would all be for naught:
;; :notmuch-part is front-sticky and we insert the part immediately
;; before this newline, so the part would inherit :notmuch-part from
;; the newline.)

> +
>    (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)


More information about the notmuch mailing list