emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

master cd46972: Fix exiting Emacs when savehist-file not writable


From: Lars Ingebrigtsen
Subject: master cd46972: Fix exiting Emacs when savehist-file not writable
Date: Tue, 11 May 2021 09:58:29 -0400 (EDT)

branch: master
commit cd46972ee82d392cef8fa6e51c370d3d8f48777a
Author: Stefan Kangas <stefankangas@gmail.com>
Commit: Lars Ingebrigtsen <larsi@gnus.org>

    Fix exiting Emacs when savehist-file not writable
    
    * lisp/savehist.el (savehist-save): Show warning when 'savehist-file'
    is not writable.  (Bug#34093)
    (savehist--has-given-file-warning): New variable.
---
 lisp/savehist.el | 41 ++++++++++++++++++++++++-----------------
 1 file changed, 24 insertions(+), 17 deletions(-)

diff --git a/lisp/savehist.el b/lisp/savehist.el
index b8e9d6b..6745d37 100644
--- a/lisp/savehist.el
+++ b/lisp/savehist.el
@@ -213,6 +213,7 @@ Normally invoked by calling `savehist-mode' to unset the 
minor mode."
     (cancel-timer savehist-timer)
     (setq savehist-timer nil)))
 
+(defvar savehist--has-given-file-warning nil)
 (defun savehist-save (&optional auto-save)
   "Save the values of minibuffer history variables.
 Unbound symbols referenced in `savehist-additional-variables' are ignored.
@@ -286,23 +287,29 @@ If AUTO-SAVE is non-nil, compare the saved contents to 
the one last saved,
     ;; If autosaving, avoid writing if nothing has changed since the
     ;; last write.
     (let ((checksum (md5 (current-buffer) nil nil savehist-coding-system)))
-      (unless (and auto-save (equal checksum savehist-last-checksum))
-       ;; Set file-precious-flag when saving the buffer because we
-       ;; don't want a half-finished write ruining the entire
-       ;; history.  Remember that this is run from a timer and from
-       ;; kill-emacs-hook, and also that multiple Emacs instances
-       ;; could write to this file at once.
-       (let ((file-precious-flag t)
-             (coding-system-for-write savehist-coding-system)
-              (dir (file-name-directory savehist-file)))
-          ;; Ensure that the directory exists before saving.
-          (unless (file-exists-p dir)
-            (make-directory dir t))
-         (write-region (point-min) (point-max) savehist-file nil
-                       (unless (called-interactively-p 'interactive) 'quiet)))
-       (when savehist-file-modes
-         (set-file-modes savehist-file savehist-file-modes))
-       (setq savehist-last-checksum checksum)))))
+      (condition-case err
+        (unless (and auto-save (equal checksum savehist-last-checksum))
+         ;; Set file-precious-flag when saving the buffer because we
+         ;; don't want a half-finished write ruining the entire
+         ;; history.  Remember that this is run from a timer and from
+         ;; kill-emacs-hook, and also that multiple Emacs instances
+         ;; could write to this file at once.
+         (let ((file-precious-flag t)
+               (coding-system-for-write savehist-coding-system)
+                (dir (file-name-directory savehist-file)))
+            ;; Ensure that the directory exists before saving.
+            (unless (file-exists-p dir)
+              (make-directory dir t))
+           (write-region (point-min) (point-max) savehist-file nil
+                         (unless (called-interactively-p 'interactive) 
'quiet)))
+         (when savehist-file-modes
+           (set-file-modes savehist-file savehist-file-modes))
+         (setq savehist-last-checksum checksum))
+        (file-error
+         (unless savehist--has-given-file-warning
+          (lwarn '(savehist-file) :warning "Error writing `%s': %s"
+                 savehist-file (caddr err))
+          (setq savehist--has-given-file-warning t)))))))
 
 (defun savehist-autosave ()
   "Save the minibuffer history if it has been modified since the last save.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]