Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

guile: Fix the mu:body message method #2801

Merged
merged 3 commits into from
Jan 8, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion guile/examples/org2mu4e
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ exec guile -e main -s $0 $@
(org-mu4e-link msg)
(if tag (string-concatenate `(":" ,tag "::")) "")
(or (mu:from msg) "?")
(let ((body (mu:body-txt msg)))
(let ((body (mu:body msg)))
(if (not body) ;; get a 'summary' of the body text
"<no plain-text body>"
(string-map
Expand Down
3 changes: 1 addition & 2 deletions guile/mu-guile.texi
Original file line number Diff line number Diff line change
Expand Up @@ -391,8 +391,7 @@ properties, please refer to the @t{mu-find} man-page.

@itemize
@item @code{(mu:bcc msg)}: the @t{Bcc} field of the message, or @t{#f} if there is none
@item @code{(mu:body-html msg)}: : the html body of the message, or @t{#f} if there is none
@item @code{(mu:body-txt msg)}: the plain-text body of the message, or @t{#f} if there is none
@item @code{(mu:body msg)}: the body of the message, or @t{#f} if there is none
@item @code{(mu:cc msg)}: the @t{Bcc} field of the message, or @t{#f} if there is none
@item @code{(mu:date msg)}: the @t{Date} field of the message, or 0 if there is none
@item @code{(mu:flags msg)}: list of message-flags for this message
Expand Down
19 changes: 15 additions & 4 deletions guile/mu.scm
Original file line number Diff line number Diff line change
Expand Up @@ -38,8 +38,7 @@
mu:header
;; message accessors
mu:field:bcc
mu:field:body-html
mu:field:body-txt
mu:field:body
mu:field:cc
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Although the Mu Guile API is deprecated, people may depend on it, so wouldn't want to add backward-incompatibilities if it can be avoided.

So, it's okay to remove body-txt/body-html from the documentation, but keep the functions around; the former as a synonym for body and the latter always returning #f.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Makes sense. I'll send an updated version with that change.
Is it ok if I force-push to this branch?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I just force-pushed a version implementing the change.

mu:field:date
mu:field:flags
Expand All @@ -54,6 +53,9 @@
mu:field:tags
mu:field:timestamp
mu:field:to
;; deprecated message accessors
mu:body-html
mu:body-txt
;; contact funcs
mu:name
mu:email
Expand Down Expand Up @@ -125,8 +127,7 @@
(export method-name)))))

(define-getter mu:bcc mu:field:bcc)
(define-getter mu:body-html mu:field:body-html)
(define-getter mu:body-txt mu:field:body-txt)
(define-getter mu:body mu:field:body)
(define-getter mu:cc mu:field:cc)
(define-getter mu:date mu:field:date)
(define-getter mu:flags mu:field:flags)
Expand All @@ -142,6 +143,16 @@
(define-getter mu:timestamp mu:field:timestamp)
(define-getter mu:to mu:field:to)

(define-method (mu:body-html (msg <mu:message>))
"The HTML body isn't stored separately anymore, so this method can't return
anything useful. We keep it for backwards compatibility."
#f)

(define-method (mu:body-txt (msg <mu:message>))
"The text body isn't stored separately anymore. This method is now a synonym
for mu:body."
(mu:body msg))

(define-method (mu:header (msg <mu:message>) (hdr <string>))
"Get an arbitrary header HDR from message MSG; return #f if it does
not exist."
Expand Down
20 changes: 18 additions & 2 deletions guile/tests/test-mu-guile.scm
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,23 @@ exec guile -e main -s $0 $@
(str-equal-or-exit (mu:subject msg) "atoms")
(str-equal-or-exit (mu:to msg) "Democritus <[email protected]>")
(str-equal-or-exit (mu:from msg) "Richard P. Feynman <[email protected]>")
;;(str-equal-or-exit (mu:header msg "Content-transfer-encoding") "7BIT")
;;(str-equal-or-exit (mu:header msg "Content-Transfer-Encoding") "8bit")
(str-equal-or-exit (mu:body msg)
(string-join
'("If, in some cataclysm, all scientific knowledge were to be destroyed,"
"and only one sentence passed on to the next generation of creatures,"
"what statement would contain the most information in the fewest words?"
"I believe it is the atomic hypothesis (or atomic fact, or whatever you"
"wish to call it) that all things are made of atoms — little particles"
"that move around in perpetual motion, attracting each other when they"
"are a little distance apart, but repelling upon being squeezed into"
"one another. In that one sentence you will see an enormous amount of"
"information about the world, if just a little imagination and thinking"
"are applied.\n") "\n"))
(str-equal-or-exit (mu:body-txt msg) (mu:body msg))
(let ((got (mu:body-html msg)))
(if got
(error-exit "Expected #f, got ~a" got)))

(if (not (equal? (mu:priority msg) mu:prio:high))
(error-exit "Expected ~a, got ~a" (mu:priority msg) mu:prio:high))))
Expand All @@ -97,7 +113,7 @@ exec guile -e main -s $0 $@
(define (test-stats)
"Test statistical functions."
;; average
(num-equal-or-exit (mu:average mu:size) 82601/14)
(num-equal-or-exit (mu:average mu:size) 41299/7)
(num-equal-or-exit (floor (mu:stddev mu:size)) 12637.0)
(num-equal-or-exit (mu:max mu:size) 46308)
(num-equal-or-exit (mu:min mu:size) 111))
Expand Down
17 changes: 8 additions & 9 deletions mu4e/mu4e-message.el
Original file line number Diff line number Diff line change
Expand Up @@ -71,8 +71,8 @@ Some notes on the format:
the MIME-part), :name (the file name, if any), :mime-type (the
MIME-type, if any) and :size (the size in bytes, if any).
- Messages in the Headers view come from the database and do not have
:attachments, :body-txt or :body-html fields. Message in the
Message view use the actual message file, and do include these fields."
:attachments or :body fields. Message in the Message view use the
actual message file, and do include these fields."
;; after all this documentation, the spectacular implementation
(if msg
(plist-get msg field)
Expand All @@ -81,18 +81,17 @@ Some notes on the format:
(defsubst mu4e-message-field (msg field)
"Retrieve FIELD from message plist MSG.
Like `mu4e-message-field-nil', but will sanitize nil values:
- all string field except body-txt/body-html: nil -> \"\"
- numeric fields + dates : nil -> 0
- all others : return the value
Thus, function will return nil for empty lists, non-existing body-txt
or body-html."
- all string field except body: nil -> \"\"
- numeric fields + dates : nil -> 0
- all others : return the value
Thus, function will return nil for empty lists, or non-existing body."
(let ((val (mu4e-message-field-raw msg field)))
(cond
(val
val) ;; non-nil -> just return it
((member field '(:subject :message-id :path :maildir :in-reply-to))
"") ;; string fields except body-txt, body-html: nil -> ""
((member field '(:body-html :body-txt))
"") ;; string fields except body: nil -> ""
((member field '(:body))
val)
((member field '(:docid :size))
0) ;; numeric type: nil -> 0
Expand Down
2 changes: 1 addition & 1 deletion mu4e/mu4e-server.el
Original file line number Diff line number Diff line change
Expand Up @@ -323,7 +323,7 @@ The server output is as follows:
3. a view looks like:
(:view <msg-sexp>)
=> the <msg-sexp> (see 2.) will be passed to `mu4e-view-func'.
the <msg-sexp> also contains :body-txt and/or :body-html
the <msg-sexp> also contains :body

4. a database update looks like:
(:update <msg-sexp> :move <nil-or-t>)
Expand Down
4 changes: 2 additions & 2 deletions testdata/testdir2/wom_bat/cur/atomic
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@ Subject: atoms
To: "Democritus" <[email protected]>
Message-id: <[email protected]>
MIME-version: 1.0
Content-type: text/plain; charset=us-ascii
Content-transfer-encoding: 7BIT
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Precedence: high

Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this change needed?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, otherwise the msg:body test fails, because with the wrong charset the em dash is skipped.
There are two alternatives:

  1. Substitute the em dash with a regular hyphen.
  2. Change the test to expect the wrong text, with the em dash omitted.

Is the charset wrong on purpose?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I didn't change this part in the new version.

If, in some cataclysm, all scientific knowledge were to be destroyed,
Expand Down