]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix exiting Emacs when savehist-file not writable
authorStefan Kangas <stefankangas@gmail.com>
Tue, 11 May 2021 13:56:41 +0000 (15:56 +0200)
committerLars Ingebrigtsen <larsi@gnus.org>
Tue, 11 May 2021 13:56:41 +0000 (15:56 +0200)
* 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

index b8e9d6b427fbc624475a31d33a3469773161714d..6745d379cb3579f6a93bd69f962bcea48f2daa56 100644 (file)
@@ -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.