Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package maildir-utils for openSUSE:Factory checked in at 2024-04-16 20:05:00 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/maildir-utils (Old) and /work/SRC/openSUSE:Factory/.maildir-utils.new.26366 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "maildir-utils" Tue Apr 16 20:05:00 2024 rev:53 rq:1167921 version:1.12.4 Changes: -------- --- /work/SRC/openSUSE:Factory/maildir-utils/maildir-utils.changes 2024-04-09 16:53:24.213739150 +0200 +++ /work/SRC/openSUSE:Factory/.maildir-utils.new.26366/maildir-utils.changes 2024-04-16 20:10:59.068196625 +0200 @@ -1,0 +2,13 @@ +Tue Apr 16 06:09:50 UTC 2024 - Michael Vetter <mvet...@suse.com> + +- Update to 1.12.4: + * query when quitting emacs with unhandled marks in a headers buffer + * fix mime-handling + * update sent handling (simplifying it) + * some internal improvements + * number of small fixes / updates + * documentation updates + * re-enable a specific database lock; this makes indexing a bit slower, + but hopefully avoids some db corruption. + +------------------------------------------------------------------- Old: ---- mu-1.12.3.tar.xz New: ---- mu-1.12.4.tar.xz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ maildir-utils.spec ++++++ --- /var/tmp/diff_new_pack.jeYAcr/_old 2024-04-16 20:11:00.920264685 +0200 +++ /var/tmp/diff_new_pack.jeYAcr/_new 2024-04-16 20:11:00.920264685 +0200 @@ -17,7 +17,7 @@ Name: maildir-utils -Version: 1.12.3 +Version: 1.12.4 Release: 0 Summary: Maildir indexer and searcher License: GPL-3.0-or-later ++++++ mu-1.12.3.tar.xz -> mu-1.12.4.tar.xz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mu-1.12.3/IDEAS.org new/mu-1.12.4/IDEAS.org --- old/mu-1.12.3/IDEAS.org 2024-04-08 22:22:35.000000000 +0200 +++ new/mu-1.12.4/IDEAS.org 2024-04-15 18:05:22.000000000 +0200 @@ -5,9 +5,7 @@ the Github issue list, i.e. without any clear plan for adding in the near future. -- Ability to _mute_ message threads. This is useful but also requires quite bit of - extra infra; we could add some blacklist for "muted" messages, perhaps on the - 'mu server' side, but then we'd need some way to manage that (ie., unmute). +- Ability to _mute_ message threads. This is useful but also requires quite bit of extra infra; we could add some blacklist for "muted" messages, perhaps on the 'mu server' side, but then we'd need some way to manage that (ie., unmute). https://github.com/djcb/mu/issues/636 - Support automatic handling for List-Unsubscribe headers @@ -23,10 +21,6 @@ https://github.com/djcb/mu/issues/2308 Shouldn't be _too_ hard, for someone that uses the functionality. -- Support mu4e-mark-handle-when also for when leaving emacs - (kill-emacs-query-functions). - https://github.com/djcb/mu/issues/2649 - - Make sorting stable if there are multiple messages with the same date. We _could_ do this by adding some random millisecs to each messasge's timestamp; _or_ complicating the search (i.e., the message hash?). Maybe leave as is? @@ -42,3 +36,14 @@ PDF-specific, we could pipe a PDF through some tool to extract text; and we'd need some way for users to specify a MIME-type => tool mapping (in Config). https://github.com/djcb/mu/issues/2117 + +- Support "aggregate actions" apply to a set of messages, e.g. apply patch-set + in a set of messages. That'll require some advanced scripting, maybe using + Guile. + https://github.com/djcb/mu/issues/301 + +* Done + +- Support mu4e-mark-handle-when also for when leaving emacs + (kill-emacs-query-functions). + https://github.com/djcb/mu/issues/2649 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mu-1.12.3/lib/mu-indexer.cc new/mu-1.12.4/lib/mu-indexer.cc --- old/mu-1.12.3/lib/mu-indexer.cc 2024-04-08 22:22:35.000000000 +0200 +++ new/mu-1.12.4/lib/mu-indexer.cc 2024-04-15 18:05:22.000000000 +0200 @@ -242,8 +242,9 @@ * but it believed those are _false alarms_ * https://gitlab.gnome.org/GNOME/glib/-/issues/2662 * - * std::unique_lock lock{w_lock_}; + * For now, set the lock as we were seeing some db corruption. */ + std::unique_lock lock{w_lock_}; auto msg{Message::make_from_path(path, store_.message_options())}; if (!msg) { mu_warning("failed to create message from {}: {}", path, msg.error().what()); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mu-1.12.3/lib/mu-server.cc new/mu-1.12.4/lib/mu-server.cc --- old/mu-1.12.3/lib/mu-server.cc 2024-04-08 22:22:35.000000000 +0200 +++ new/mu-1.12.4/lib/mu-server.cc 2024-04-15 18:05:22.000000000 +0200 @@ -184,7 +184,6 @@ void queries_handler(const Command& cmd); void quit_handler(const Command& cmd); void remove_handler(const Command& cmd); - void sent_handler(const Command& cmd); void view_handler(const Command& cmd); private: @@ -415,12 +414,6 @@ [&](const auto& params) { remove_handler(params); }}); cmap.emplace( - "sent", - CommandInfo{ArgMap{{":path", ArgInfo{Type::String, true, "path to the message file"}}}, - "tell mu about a message that was sent", - [&](const auto& params) { sent_handler(params); }}); - - cmap.emplace( "view", CommandInfo{ArgMap{ {":docid", ArgInfo{Type::Number, false, "document-id"}}, @@ -984,21 +977,6 @@ } void -Server::Private::sent_handler(const Command& cmd) -{ - const auto path{cmd.string_arg(":path").value_or("")}; - const auto docid = store().add_message(path); - if (!docid) - throw Error{Error::Code::Store, "failed to add path: {}: {}", - path, docid.error().what()}; - - output_sexp(Sexp().put_props( - ":sent", Sexp::t_sym, - ":path", path, - ":docid", docid.value())); -} - -void Server::Private::view_mark_as_read(Store::Id docid, Message&& msg, bool rename) { auto new_flags = [](const Message& m)->Option<Flags> { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mu-1.12.3/lib/utils/mu-utils.cc new/mu-1.12.4/lib/utils/mu-utils.cc --- old/mu-1.12.3/lib/utils/mu-utils.cc 2024-04-08 22:22:35.000000000 +0200 +++ new/mu-1.12.4/lib/utils/mu-utils.cc 2024-04-15 18:05:22.000000000 +0200 @@ -489,7 +489,7 @@ { struct tm tbuf{}; GDateTime *dtime{}; - ::time_t t; + gint64 t; /* one-sided dates */ if (dstr.empty()) @@ -531,7 +531,7 @@ t = g_date_time_to_unix(dtime); g_date_time_unref(dtime); - return std::max<::time_t>(t, 0); + return to_time_t(t); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mu-1.12.3/lib/utils/mu-utils.hh new/mu-1.12.4/lib/utils/mu-utils.hh --- old/mu-1.12.3/lib/utils/mu-utils.hh 2024-04-08 22:22:35.000000000 +0200 +++ new/mu-1.12.4/lib/utils/mu-utils.hh 2024-04-15 18:05:22.000000000 +0200 @@ -36,7 +36,6 @@ #include "mu-option.hh" - #ifndef FMT_HEADER_ONLY #define FMT_HEADER_ONLY #endif /*FMT_HEADER_ONLY*/ @@ -269,6 +268,26 @@ } /** + * Convert an int64_t to a time_t, clamping it within the range. + * + * This is only doing anything when using a 32-bit time_t value. This doesn't + * solve the 3038 problem, but at least allows for clearly marking where we + * convert + * + * @param t some 64-bit value that encodes a Unix time. + * + * @return a time_t value + */ +constexpr ::time_t time_t_min = 0; +constexpr ::time_t time_t_max = std::numeric_limits<::time_t>::max(); +constexpr ::time_t to_time_t(int64_t t) { + return std::clamp(t, + static_cast<int64_t>(time_t_min), + static_cast<int64_t>(time_t_max)); +} + + +/** * Parse a date string to the corresponding time_t * * * @param date the date expressed a YYYYMMDDHHMMSS or any n... of the first diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mu-1.12.3/lib/utils/tests/test-utils.cc new/mu-1.12.4/lib/utils/tests/test-utils.cc --- old/mu-1.12.3/lib/utils/tests/test-utils.cc 2024-04-08 22:22:35.000000000 +0200 +++ new/mu-1.12.4/lib/utils/tests/test-utils.cc 2024-04-15 18:05:22.000000000 +0200 @@ -62,7 +62,7 @@ } g_setenv("TZ", hki, TRUE); - std::vector<std::tuple<const char*, bool/*is_first*/, int64_t>> cases = {{ + std::vector<std::tuple<const char*, bool/*is_first*/, ::time_t>> cases = {{ {"2015-09-18T09:10:23", true, 1442556623}, {"1972-12-14T09:10:23", true, 93165023}, {"1972-12-14T09:10", true, 93165000}, @@ -82,8 +82,8 @@ // {"fnorb", true, -1}, // {"fnorb", false, -1}, - {"", false, G_MAXINT64}, - {"", true, 0} + {"", false, time_t_max}, + {"", true, time_t_min} }}; for (auto& test: cases) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mu-1.12.3/meson.build new/mu-1.12.4/meson.build --- old/mu-1.12.3/meson.build 2024-04-08 22:22:35.000000000 +0200 +++ new/mu-1.12.4/meson.build 2024-04-15 18:05:22.000000000 +0200 @@ -17,7 +17,7 @@ ################################################################################ # project setup project('mu', ['c', 'cpp'], - version: '1.12.3', + version: '1.12.4', meson_version: '>= 0.56.0', license: 'GPL-3.0-or-later', default_options : [ @@ -28,7 +28,7 @@ # hard-code the date here (for reproduciblity); we derive the dates used in e.g. # documentation from this. -mu_date='2024-04-08' +mu_date='2024-04-15' # installation paths prefixdir = get_option('prefix') diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mu-1.12.3/mu4e/mu4e-compose.el new/mu-1.12.4/mu4e/mu4e-compose.el --- old/mu-1.12.3/mu4e/mu4e-compose.el 2024-04-08 22:22:35.000000000 +0200 +++ new/mu-1.12.4/mu4e/mu4e-compose.el 2024-04-15 18:05:22.000000000 +0200 @@ -369,8 +369,8 @@ I.e., either \"name <email>\" or \"email\". Return nil if not found. This function can be used for `completion-at-point-functions', to -complete addresses. This can be used outside mu4e, but mu4e must -be active (running) for this to work." +complete addresses. This can be used from outside mu4e, but mu4e +must be active (running) for this to work." (let* ((end (point)) (start (save-excursion (re-search-backward "\\(\\`\\|[\n:,]\\)[ \t]*") @@ -526,6 +526,9 @@ "Handler called with DOCID and PATH for the just-sent message. For Forwarded ('Passed') and Replied messages, try to set the appropriate flag at the message forwarded or replied-to." + ;; XXX we don't need this function anymore here, but + ;; we have an external caller in mu4e-icalendar... we should + ;; update that. (mu4e--set-parent-flags path) ;; if the draft file exists, remove it now. (when (file-exists-p path) @@ -549,15 +552,23 @@ (unless (message-fetch-field "In-Reply-To") (message-remove-header "References"))) (when use-hard-newlines - (mu4e--send-harden-newlines))) - ;; for safety, always save the draft before sending - (set-buffer-modified-p t) - (save-buffer)) - -(defun mu4e--compose-after-send () - "Function called just after sending a message." - (setq mu4e-sent-func #'mu4e-sent-handler) - (mu4e--server-sent (buffer-file-name))) + (mu4e--send-harden-newlines)) + ;; now handle what happens _after_ sending; typically, draft is gone and + ;; the sent message appears in sent. Update flags for related messages, + ;; i.e. for Forwarded ('Passed') and Replied messages, try to set the + ;; appropriate flag at the message forwarded or replied-to. + (add-hook 'message-sent-hook + (lambda () + (save-restriction + (message-narrow-to-headers) + (when-let ((fcc-path (message-fetch-field "Fcc"))) + (mu4e--set-parent-flags fcc-path) + ;; we end up with a ((buried) buffer here, visiting + ;; the fcc-path; not quite sure why. But let's + ;; get rid of it (#2681) + (when-let ((buf (find-buffer-visiting fcc-path))) + (kill-buffer buf))))) + nil t))) ;;; Crypto (defun mu4e--compose-setup-crypto (parent compose-type) @@ -793,12 +804,11 @@ ;; annoyingly, various message- functions call `message-pop-to-buffer` ;; (showing the message. But we're not ready for that yet. So ;; temporarily override that. - (advice-add 'message-pop-to-buffer - :override #'mu4e--fake-pop-to-buffer) - (funcall compose-func parent) + (cl-letf (((symbol-function #'message-pop-to-buffer) + #'mu4e--fake-pop-to-buffer)) + (funcall compose-func parent)) ;; add some more headers, if needed. (message-generate-headers (mu4e--headers compose-type)) - (advice-remove 'message-pop-to-buffer #'mu4e--fake-pop-to-buffer) (current-buffer)))) ;; returns new buffer (this is not the tmp buf) @@ -842,7 +852,6 @@ (add-hook 'before-save-hook #'mu4e--compose-before-save nil t) (add-hook 'after-save-hook #'mu4e--compose-after-save nil t) (add-hook 'message-send-hook #'mu4e--compose-before-send nil t) - (add-hook 'message-sent-hook #'mu4e--compose-after-send nil t) (when-let ((fcc-path (mu4e--fcc-path (mu4e--message-basename) parent))) (message-add-header (concat "Fcc: " fcc-path "\n"))) @@ -1002,8 +1011,10 @@ (mu4e--compose-setup 'edit (lambda (parent) - (find-file (plist-get parent :path)) - (mu4e--delimit-headers))))) + (let ((buf (find-file-noselect (plist-get parent :path)))) + (with-current-buffer buf + (mu4e--delimit-headers)) + (switch-to-buffer buf)))))) ;;;###autoload (defun mu4e-compose-resend (address) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mu-1.12.3/mu4e/mu4e-contacts.el new/mu-1.12.4/mu4e/mu4e-contacts.el --- old/mu-1.12.3/mu4e/mu4e-contacts.el 2024-04-08 22:22:35.000000000 +0200 +++ new/mu-1.12.4/mu4e/mu4e-contacts.el 2024-04-15 18:05:22.000000000 +0200 @@ -149,25 +149,39 @@ (eq t (compare-strings addr nil nil m nil nil 'case-insensitive)))) (mu4e-personal-addresses)))) + (defun mu4e-personal-or-alternative-address-p (addr) "Is ADDR either a personal or an alternative address? That is, does it match either `mu4e-personal-address-p' or `message-alternative-emails'. -Note that this expanded definition of user-addresses not used for - indexing mu does not know about `message-alternative-emails' so - it cannot use it for indexing." +Note that this expanded definition of user-addresses is only used +in emacs, not in `mu' (e.g. when indexing). + +Also see `mu4e-personal-or-alternative-address-or-empty-p'." (let ((alts message-alternative-emails)) (or (mu4e-personal-address-p addr) (cond ((functionp alts) (funcall alts addr)) ((stringp alts) (string-match alts addr)) (t nil))))) + +(defun mu4e-personal-or-alternative-address-or-empty-p (addr) + "Is ADDR either a personal, alternative address or nil? + +This is like `mu4e-personal-or-alternative-address-p' but also +return t for _empty_ ADDR. This can be useful for use with +`message-dont-reply-to-names' since it can receive empty strings; +those can be filtered-out by returning t here. + +See #2680 for further details. " + (or (and addr (string= addr "")) + (mu4e-personal-or-alternative-address-p addr))) + ;; Helpers - ;;; RFC2822 handling of phrases in mail-addresses ;; ;; The optional display-name contains a phrase, it sits before the diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mu-1.12.3/mu4e/mu4e-icalendar.el new/mu-1.12.4/mu4e/mu4e-icalendar.el --- old/mu-1.12.3/mu4e/mu4e-icalendar.el 2024-04-08 22:22:35.000000000 +0200 +++ new/mu-1.12.4/mu4e/mu4e-icalendar.el 2024-04-15 18:05:22.000000000 +0200 @@ -135,21 +135,19 @@ (plist-get (car (plist-get msg :reply-to)) :email) (plist-get (car (plist-get msg :from)) :email) (mu4e-warn "Cannot find organizer")))) - (mu4e--compose-setup - 'reply - (lambda (_parent) - (message-reply organizer) - (goto-char (point-max)) - (message-goto-body) - (mml-insert-multipart "alternative") - (mml-insert-empty-tag 'part 'type "text/plain") - (mml-attach-buffer ical-name - "text/calendar; method=REPLY; charset=UTF-8") - (when mu4e-icalendar-trash-after-reply - ;; Override `mu4e-sent-handler' set by `mu4e-compose-mode' to - ;; also trash the message (thus must be appended to hooks). - (add-hook 'message-sent-hook - (mu4e--icalendar-trash-message-hook msg) 90 t)))) + (message-reply organizer) + (goto-char (point-max)) + (message-goto-body) + (mml-insert-multipart "alternative") + (mml-insert-empty-tag 'part 'type "text/plain") + (mml-attach-buffer ical-name + "text/calendar; method=REPLY; charset=UTF-8") + (mu4e-compose-mode) + (when mu4e-icalendar-trash-after-reply + ;; Override `mu4e-sent-handler' set by `mu4e-compose-mode' to + ;; also trash the message (thus must be appended to hooks). + (add-hook 'message-sent-hook + (mu4e--icalendar-trash-message-hook msg) 90 t)) (when gnus-icalendar-org-enabled-p (if (gnus-icalendar-find-org-event-file event) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mu-1.12.3/mu4e/mu4e-mark.el new/mu-1.12.4/mu4e/mu4e-mark.el --- old/mu-1.12.3/mu4e/mu4e-mark.el 2024-04-08 22:22:35.000000000 +0200 +++ new/mu-1.12.4/mu4e/mu4e-mark.el 2024-04-15 18:05:22.000000000 +0200 @@ -1,6 +1,6 @@ ;;; mu4e-mark.el --- Marking messages -*- lexical-binding: t -*- -;; Copyright (C) 2011-2022 Dirk-Jan C. Binnema +;; Copyright (C) 2011-2024 Dirk-Jan C. Binnema ;; Author: Dirk-Jan C. Binnema <d...@djcbsoftware.nl> ;; Maintainer: Dirk-Jan C. Binnema <d...@djcbsoftware.nl> @@ -39,8 +39,11 @@ ;;; Variables & constants (defcustom mu4e-headers-leave-behavior 'ask - "What to do when user leaves the headers view. -That is when he e.g. quits, refreshes or does a new search. + "What to do when user leaves the current headers view. + +\"Leaving\" here means quitting the headers views, refreshing it +or even quitting mu4e or Emacs. + Value is one of the following symbols: - `ask' ask user whether to ignore the marks - `apply' automatically apply the marks before doing anything else @@ -90,7 +93,13 @@ (defun mu4e--mark-initialize () "Initialize the marks-subsystem." - (set (make-local-variable 'mu4e--mark-map) (make-hash-table))) + (set (make-local-variable 'mu4e--mark-map) (make-hash-table)) + ;; ask user when kill buffer / emacs with live marks. + ;; (subject to mu4e-headers-leave-behavior) + (add-hook 'kill-buffer-query-functions + #'mu4e-mark-handle-when-leaving nil t) + (add-hook 'kill-emacs-query-functions + #'mu4e-mark-handle-when-leaving nil t)) (defun mu4e--mark-clear () "Clear the marks-subsystem." @@ -454,7 +463,8 @@ ("ignore marks?" . ignore))))) ;; we determined what to do... now do it (when (eq what 'apply) - (mu4e-mark-execute-all t)))))) + (mu4e-mark-execute-all t))))) + t) ;; return t for compat with `kill-buffer-query-functions ;;; _ (provide 'mu4e-mark) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mu-1.12.3/mu4e/mu4e-mime-parts.el new/mu-1.12.4/mu4e/mu4e-mime-parts.el --- old/mu-1.12.3/mu4e/mu4e-mime-parts.el 2024-04-08 22:22:35.000000000 +0200 +++ new/mu-1.12.4/mu4e/mu4e-mime-parts.el 2024-04-15 18:05:22.000000000 +0200 @@ -361,7 +361,7 @@ ;; - index: the index number of the mime part (default) ;; - temp: the full path to the mime part in a ;; temporary file, which is deleted immediately - ;; after invoking handler + ;; after the handler returns ;; - pipe: the attachment is piped to some shell command ;; or as a string parameter to a function ).") diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mu-1.12.3/mu4e/mu4e-server.el new/mu-1.12.4/mu4e/mu4e-server.el --- old/mu-1.12.3/mu4e/mu4e-server.el 2024-04-08 22:22:35.000000000 +0200 +++ new/mu-1.12.4/mu4e/mu4e-server.el 2024-04-15 18:05:22.000000000 +0200 @@ -664,7 +664,7 @@ (unless (or (not maildir) (file-exists-p (mu4e-join-paths (mu4e-root-maildir) maildir))) - (mu4e-error "Target dir does not exist")) + (mu4e-error "Target directory does not exist")) (mu4e--server-call-mu `(move :docid ,(if (stringp docid-or-msgid) nil docid-or-msgid) @@ -679,24 +679,17 @@ (mu4e--server-call-mu `(ping))) (defun mu4e--server-queries (queries) - "Sends queries to the mu server, expecting a (:queries ...) in response. + "Sends queries to the mu server, expecting a (:queries ...) sexp in response. QUERIES is a list of queries for the number of results with read/unread status are returned in the pong-response." (mu4e--server-call-mu `(queries :queries ,queries))) (defun mu4e--server-remove (docid) - "Remove message with DOCID. -The results are reporter through either (:update ... ) -or (:error) sexp, which are handled my `mu4e-error-func', -respectively." + "Remove message with DOCID. +The results are reported through either (:update ... ) +or (:error) sexps." (mu4e--server-call-mu `(remove :docid ,docid))) -(defun mu4e--server-sent (path) - "Tell the mu server we sent a message at PATH. -If this works, we will receive (:info add :path <path> :docid -<docid> :fcc <path>)." - (mu4e--server-call-mu `(sent :path ,path))) - (defun mu4e--server-view (docid-or-msgid &optional mark-as-read) "View a message referred to by DOCID-OR-MSGID. Optionally, if MARK-AS-READ is non-nil, the backend marks the diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mu-1.12.3/mu4e/mu4e-view.el new/mu-1.12.4/mu4e/mu4e-view.el --- old/mu-1.12.3/mu4e/mu4e-view.el 2024-04-08 22:22:35.000000000 +0200 +++ new/mu-1.12.4/mu4e/mu4e-view.el 2024-04-15 18:05:22.000000000 +0200 @@ -709,6 +709,7 @@ (defun mu4e--view-render-buffer (msg) "Render current buffer with MSG using Gnus' article mode." + (setq gnus-summary-buffer (get-buffer-create " *appease-gnus*")) (let* ((inhibit-read-only t) (max-specpdl-size mu4e-view-max-specpdl-size) (mm-decrypt-option 'known) @@ -730,6 +731,8 @@ (ignore-errors (run-hooks 'gnus-article-decode-hook)) (gnus-article-prepare-display) (mu4e--view-activate-urls) + ;; `gnus-summary-bookmark-make-record' does not work properly when "appeased." + (kill-local-variable 'bookmark-make-record-function) (setq mu4e~gnus-article-mime-handles gnus-article-mime-handles gnus-article-decoded-p gnus-article-decode-hook) (set-buffer-modified-p nil) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mu-1.12.3/mu4e/mu4e.texi new/mu-1.12.4/mu4e/mu4e.texi --- old/mu-1.12.3/mu4e/mu4e.texi 2024-04-08 22:22:35.000000000 +0200 +++ new/mu-1.12.4/mu4e/mu4e.texi 2024-04-15 18:05:22.000000000 +0200 @@ -2984,14 +2984,12 @@ @node MIME-part actions @section MIME-part actions -Finally, let's define a MIME-part action. As mentioned, MIME-part -functions receive @emph{2} arguments, the message and the attachment -number to use. +Finally, let's define a MIME-part action. The following example action counts the number of lines in an attachment, and defines @key{n} as its shortcut key (the @key{n} is prefixed to the -description). See the the @code{mu4e-view-mime-part-actions} for the details -of the format. +description). See the the @code{mu4e-view-mime-part-actions} for the details of +the format. @lisp (add-to-list 'mu4e-view-mime-part-actions @@ -2999,6 +2997,14 @@ '(:name "line-count" :handler "wc -l" :receives pipe)) @end lisp +Or another one, to import a calendar invitation into the venerable emacs diary: +@lisp +(add-to-list 'mu4e-view-mime-part-actions + ;; import into calendar; + '(:name "dimport-in-diary" :handler (lambda(file) (icalendar-import-file file diary-file)) + :receives temp)) +@end lisp + @node Example actions @section Example actions @@ -3606,6 +3612,21 @@ (setq mu4e-view-show-addresses t) @end lisp +For recent emacs (29 and later), address-completion may need some extra setup: +@lisp +(add-hook 'message-mode-hook + (lambda () + (add-to-list 'completion-at-point-functions + #'eudc-capf-complete))) +@end lisp +or, if that does not work: +@lisp +(add-hook 'message-mode-hook + (lambda () + (add-to-list 'completion-at-point-functions + #'message-expand-name))) +@end lisp + @noindent After this, you should be able to: @itemize @@ -3615,6 +3636,7 @@ @end itemize + @node Sauron @section Sauron