[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