mu4e: clean up temp file handling
Use a temp file directory per mu4e session Remove files when a buffer is closed, not after 30 secs
This commit is contained in:
@ -534,11 +534,16 @@ string after PROMPT."
|
|||||||
(let ((timestr (read-string (mu4e-format "%s" prompt))))
|
(let ((timestr (read-string (mu4e-format "%s" prompt))))
|
||||||
(apply 'encode-time (parse-time-string timestr))))
|
(apply 'encode-time (parse-time-string timestr))))
|
||||||
|
|
||||||
|
|
||||||
|
(defvar mu4e--temp-dir nil "Directory for temporary files.
|
||||||
|
Created when mu4e starts, and removed when it closes.")
|
||||||
|
|
||||||
(defun mu4e-make-temp-file (ext)
|
(defun mu4e-make-temp-file (ext)
|
||||||
"Create a self-destructing temporary file with extension EXT.
|
"Create a self-destructing temporary file with extension EXT.
|
||||||
The file will self-destruct in a short while, enough to open it
|
The file will self-destruct in a short while, enough to open it
|
||||||
in an external program."
|
in an external program."
|
||||||
(let ((tmpfile (make-temp-file "mu4e-" nil (concat "." ext))))
|
(let* ((temporary-file-directory (or mu4e--temp-dir temporary-file-directory))
|
||||||
|
(tmpfile (make-temp-file "mu4e-" nil (concat "." ext))))
|
||||||
(run-at-time "30 sec" nil
|
(run-at-time "30 sec" nil
|
||||||
(lambda () (ignore-errors (delete-file tmpfile))))
|
(lambda () (ignore-errors (delete-file tmpfile))))
|
||||||
tmpfile))
|
tmpfile))
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
;;; mu4e-mime-parts.el --- Dealing with MIME-parts & URLs -*- lexical-binding: t -*-
|
;;; mu4e-mime-parts.el --- Dealing with MIME-parts & URLs -*- lexical-binding: t -*-
|
||||||
|
|
||||||
;; Copyright (C) 2023-2024 Dirk-Jan C. Binnema
|
;; Copyright (C) 2023-2026 Dirk-Jan C. Binnema
|
||||||
|
|
||||||
;; Author: Dirk-Jan C. Binnema <djcb@djcbsoftware.nl>
|
;; Author: Dirk-Jan C. Binnema <djcb@djcbsoftware.nl>
|
||||||
;; Maintainer: Dirk-Jan C. Binnema <djcb@djcbsoftware.nl>
|
;; Maintainer: Dirk-Jan C. Binnema <djcb@djcbsoftware.nl>
|
||||||
@ -63,25 +63,25 @@ See `mu4e--uniquify-file-name' for an example."
|
|||||||
|
|
||||||
;; remember the mime-handles, so we can clean them up when
|
;; remember the mime-handles, so we can clean them up when
|
||||||
;; we quit this buffer.
|
;; we quit this buffer.
|
||||||
(defvar-local mu4e--view-gnus-article-mime-handles nil)
|
|
||||||
|
(defvar-local mu4e--view-gnus-article-mime-handles nil
|
||||||
|
"MIME handles for the message in this buffer.")
|
||||||
(put 'mu4e--view-gnus-article-mime-handles 'permanent-local t)
|
(put 'mu4e--view-gnus-article-mime-handles 'permanent-local t)
|
||||||
|
|
||||||
(defun mu4e--view-kill-mime-handles ()
|
(defvar-local mu4e--view-temp-files nil
|
||||||
"Kill cached MIME-handles, if any."
|
"Temporary files.")
|
||||||
|
(put 'mu4e--view-temp-files 'permanent-local t)
|
||||||
|
|
||||||
|
(defun mu4e--view-buffer-cleanup ()
|
||||||
|
"Clean-up some internals when killing the view buffer."
|
||||||
|
;; Kill cached MIME-handles, if any.
|
||||||
(when mu4e--view-gnus-article-mime-handles
|
(when mu4e--view-gnus-article-mime-handles
|
||||||
(mm-destroy-parts mu4e--view-gnus-article-mime-handles)
|
(mm-destroy-parts mu4e--view-gnus-article-mime-handles)
|
||||||
(setq mu4e--view-gnus-article-mime-handles nil)))
|
(setq mu4e--view-gnus-article-mime-handles nil))
|
||||||
|
;; Delete temp files created for opening MIME-parts externally.
|
||||||
;; Temp directories created to hand attachments to external openers; cleaned up
|
(dolist (file mu4e--view-temp-files)
|
||||||
;; when the view buffer is killed.
|
(ignore-errors (delete-file file)))
|
||||||
(defvar-local mu4e--view-temp-dirs nil)
|
(setq mu4e--view-temp-files nil))
|
||||||
(put 'mu4e--view-temp-dirs 'permanent-local t)
|
|
||||||
|
|
||||||
(defun mu4e--view-kill-temp-dirs ()
|
|
||||||
"Delete temp dirs created for opening MIME-parts externally."
|
|
||||||
(dolist (dir mu4e--view-temp-dirs)
|
|
||||||
(ignore-errors (delete-directory dir)))
|
|
||||||
(setq mu4e--view-temp-dirs nil))
|
|
||||||
|
|
||||||
;;; MIME-parts
|
;;; MIME-parts
|
||||||
(defvar-local mu4e--view-mime-parts nil
|
(defvar-local mu4e--view-mime-parts nil
|
||||||
@ -438,23 +438,25 @@ Each of the actions is a plist with keys
|
|||||||
|
|
||||||
(defun mu4e--view-mime-part-to-temp-file (handle)
|
(defun mu4e--view-mime-part-to-temp-file (handle)
|
||||||
"Write MIME-part HANDLE to a temporary file and return the file name.
|
"Write MIME-part HANDLE to a temporary file and return the file name.
|
||||||
|
|
||||||
The filename is deduced from the MIME-part's filename, or
|
The filename is deduced from the MIME-part's filename, or
|
||||||
otherwise random; the result is placed in a temporary directory
|
otherwise random; the result is placed in a temporary directory
|
||||||
with a unique name. Returns the full path for the file created.
|
with a unique name. Returns the full path for the file created.
|
||||||
The directory is registered for cleanup when the current view
|
|
||||||
buffer is killed (see `mu4e--view-kill-temp-dirs')."
|
The file is registered for cleanup when the current view
|
||||||
(let* ((tmpdir (make-temp-file "mu4e-temp-" t))
|
buffer is killed."
|
||||||
(fname (mm-handle-filename handle))
|
(let* ((fname (mm-handle-filename handle))
|
||||||
(fname (and fname
|
(fname (and fname
|
||||||
(gnus-map-function mm-file-name-rewrite-functions
|
(gnus-map-function mm-file-name-rewrite-functions
|
||||||
(file-name-nondirectory fname))))
|
(file-name-nondirectory fname))))
|
||||||
(fname (if fname
|
(fname (if fname
|
||||||
(mu4e-join-paths
|
(mu4e-join-paths
|
||||||
tmpdir (replace-regexp-in-string "/" "-" fname))
|
mu4e--temp-dir
|
||||||
(let ((temporary-file-directory tmpdir))
|
(replace-regexp-in-string "/" "-" fname))
|
||||||
(make-temp-file "mimepart")))))
|
(let ((temporary-file-directory mu4e--temp-dir))
|
||||||
|
(make-temp-file "mime-part-")))))
|
||||||
(mm-save-part-to-file handle fname)
|
(mm-save-part-to-file handle fname)
|
||||||
(push tmpdir mu4e--view-temp-dirs)
|
(push fname mu4e--view-temp-files)
|
||||||
fname))
|
fname))
|
||||||
|
|
||||||
(defun mu4e--view-open-file (file &optional force-ask)
|
(defun mu4e--view-open-file (file &optional force-ask)
|
||||||
|
|||||||
@ -654,8 +654,7 @@ activates URLs (in plain-text mode only)."
|
|||||||
(setq mu4e--view-gnus-article-mime-handles gnus-article-mime-handles
|
(setq mu4e--view-gnus-article-mime-handles gnus-article-mime-handles
|
||||||
gnus-article-decoded-p gnus-article-decode-hook)
|
gnus-article-decoded-p gnus-article-decode-hook)
|
||||||
(set-buffer-modified-p nil)
|
(set-buffer-modified-p nil)
|
||||||
(add-hook 'kill-buffer-hook #'mu4e--view-kill-mime-handles)
|
(add-hook 'kill-buffer-hook #'mu4e--view-buffer-cleanup))
|
||||||
(add-hook 'kill-buffer-hook #'mu4e--view-kill-temp-dirs))
|
|
||||||
(epg-error
|
(epg-error
|
||||||
(mu4e-message "EPG error: %s; fall back to raw view"
|
(mu4e-message "EPG error: %s; fall back to raw view"
|
||||||
(error-message-string err))))))
|
(error-message-string err))))))
|
||||||
|
|||||||
@ -158,6 +158,9 @@ mu4e is already running, invoke FUNC (if non-nil).
|
|||||||
|
|
||||||
Otherwise, check requirements, then start mu4e. When successful,
|
Otherwise, check requirements, then start mu4e. When successful,
|
||||||
invoke FUNC (if available) afterwards."
|
invoke FUNC (if available) afterwards."
|
||||||
|
;; create dir for temporary files.
|
||||||
|
(unless (and mu4e--temp-dir (file-directory-p mu4e--temp-dir))
|
||||||
|
(setq mu4e--temp-dir (make-temp-file "mu4e-" t)))
|
||||||
(unless (mu4e-context-current)
|
(unless (mu4e-context-current)
|
||||||
(mu4e--context-autoswitch nil mu4e-context-policy))
|
(mu4e--context-autoswitch nil mu4e-context-policy))
|
||||||
(setq mu4e-pong-func
|
(setq mu4e-pong-func
|
||||||
@ -216,7 +219,10 @@ invoke FUNC (if available) afterwards."
|
|||||||
(when (member major-mode
|
(when (member major-mode
|
||||||
'(mu4e-headers-mode mu4e-view-mode mu4e-main-mode))
|
'(mu4e-headers-mode mu4e-view-mode mu4e-main-mode))
|
||||||
(kill-buffer)))))
|
(kill-buffer)))))
|
||||||
(buffer-list)))
|
(buffer-list))
|
||||||
|
(when mu4e--temp-dir
|
||||||
|
(ignore-errors (delete-directory mu4e--temp-dir 'recursive))
|
||||||
|
(setq mu4e--temp-dir nil)))
|
||||||
|
|
||||||
;;; Handlers
|
;;; Handlers
|
||||||
(defun mu4e--default-handler (&rest args)
|
(defun mu4e--default-handler (&rest args)
|
||||||
|
|||||||
Reference in New Issue
Block a user