From a703f002143b7167beb4fb10c71a497c8ed5b2f9 Mon Sep 17 00:00:00 2001 From: Thiago Jung Bauermann Date: Fri, 3 Jan 2025 15:17:37 -0300 Subject: [PATCH 1/3] guile: tests: Fix encoding of "atomic" message MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit It's stated to be US-ASCII with 7-bit encoding, but it contains the UTF-8 character '—'. Fixing the encoding very slightly changes the average size of messages reported by mu:average, so adjust the new expected value. --- guile/tests/test-mu-guile.scm | 4 ++-- testdata/testdir2/wom_bat/cur/atomic | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/guile/tests/test-mu-guile.scm b/guile/tests/test-mu-guile.scm index afa4f48c..975d3d71 100755 --- a/guile/tests/test-mu-guile.scm +++ b/guile/tests/test-mu-guile.scm @@ -83,7 +83,7 @@ exec guile -e main -s $0 $@ (str-equal-or-exit (mu:subject msg) "atoms") (str-equal-or-exit (mu:to msg) "Democritus ") (str-equal-or-exit (mu:from msg) "Richard P. Feynman ") - ;;(str-equal-or-exit (mu:header msg "Content-transfer-encoding") "7BIT") + ;;(str-equal-or-exit (mu:header msg "Content-Transfer-Encoding") "8bit") (if (not (equal? (mu:priority msg) mu:prio:high)) (error-exit "Expected ~a, got ~a" (mu:priority msg) mu:prio:high)))) @@ -97,7 +97,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)) diff --git a/testdata/testdir2/wom_bat/cur/atomic b/testdata/testdir2/wom_bat/cur/atomic index c3c67920..44eac88d 100644 --- a/testdata/testdir2/wom_bat/cur/atomic +++ b/testdata/testdir2/wom_bat/cur/atomic @@ -4,8 +4,8 @@ Subject: atoms To: "Democritus" Message-id: <3BE9E6535E302944823E7A1A20D852173@msg.id> 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 If, in some cataclysm, all scientific knowledge were to be destroyed, From 606f4be74b1a1f5de74752fdcc7b33872c38b1fb Mon Sep 17 00:00:00 2001 From: Thiago Jung Bauermann Date: Thu, 2 Jan 2025 14:01:35 -0300 Subject: [PATCH 2/3] guile: Fix the mu:body message method Somewhere along the way, the body-txt and body-html fields were merged into a single body field. Later, commit 8eac3922215c ("guile: re-enable the guile support") finally removed support for Field::Id::BodyHtml from mu:c:get-field. Unfortunately mu.scm and the documentation are still stuck in the past, so update them. mu:body-txt is now a synonym for mu:body, and mu:body-html always returns #f. I wanted to add a mu:body test also for the rfc822.1 message, but there's currently a bug where its body text is is duplicated (issue #2802), so the test would fail. --- guile/examples/org2mu4e | 2 +- guile/mu-guile.texi | 3 +-- guile/mu.scm | 19 +++++++++++++++---- guile/tests/test-mu-guile.scm | 16 ++++++++++++++++ 4 files changed, 33 insertions(+), 7 deletions(-) diff --git a/guile/examples/org2mu4e b/guile/examples/org2mu4e index 3556b9a2..e7f10ad3 100755 --- a/guile/examples/org2mu4e +++ b/guile/examples/org2mu4e @@ -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 "" (string-map diff --git a/guile/mu-guile.texi b/guile/mu-guile.texi index 9eae2fee..a5c24b9e 100644 --- a/guile/mu-guile.texi +++ b/guile/mu-guile.texi @@ -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 diff --git a/guile/mu.scm b/guile/mu.scm index 08eae1fa..31eca41a 100644 --- a/guile/mu.scm +++ b/guile/mu.scm @@ -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 mu:field:date mu:field:flags @@ -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 @@ -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) @@ -142,6 +143,16 @@ (define-getter mu:timestamp mu:field:timestamp) (define-getter mu:to mu:field:to) +(define-method (mu:body-html (msg )) + "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 )) + "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 ) (hdr )) "Get an arbitrary header HDR from message MSG; return #f if it does not exist." diff --git a/guile/tests/test-mu-guile.scm b/guile/tests/test-mu-guile.scm index 975d3d71..ed00f1e3 100755 --- a/guile/tests/test-mu-guile.scm +++ b/guile/tests/test-mu-guile.scm @@ -84,6 +84,22 @@ exec guile -e main -s $0 $@ (str-equal-or-exit (mu:to msg) "Democritus ") (str-equal-or-exit (mu:from msg) "Richard P. Feynman ") ;;(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)))) From 51137998dbc70d2513b77498408ef1ec57a374de Mon Sep 17 00:00:00 2001 From: Thiago Jung Bauermann Date: Fri, 3 Jan 2025 14:33:42 -0300 Subject: [PATCH 3/3] mu4e: Update references to :body-txt and :body-html Most are in comments, but one is in code. --- mu4e/mu4e-message.el | 17 ++++++++--------- mu4e/mu4e-server.el | 2 +- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/mu4e/mu4e-message.el b/mu4e/mu4e-message.el index e42ed455..80ab1ba6 100644 --- a/mu4e/mu4e-message.el +++ b/mu4e/mu4e-message.el @@ -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) @@ -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 diff --git a/mu4e/mu4e-server.el b/mu4e/mu4e-server.el index b62a4ab6..31b2dcba 100644 --- a/mu4e/mu4e-server.el +++ b/mu4e/mu4e-server.el @@ -323,7 +323,7 @@ The server output is as follows: 3. a view looks like: (:view ) => the (see 2.) will be passed to `mu4e-view-func'. - the also contains :body-txt and/or :body-html + the also contains :body 4. a database update looks like: (:update :move )