Skip to content

Commit

Permalink
Fix exiting Emacs when savehist-file not writable
Browse files Browse the repository at this point in the history
* lisp/savehist.el (savehist-save): Show warning when 'savehist-file'
is not writable.  (Bug#34093)
(savehist--has-given-file-warning): New variable.
  • Loading branch information
skangas authored and larsmagne committed May 11, 2021
1 parent 17a950c commit cd46972
Showing 1 changed file with 24 additions and 17 deletions.
41 changes: 24 additions & 17 deletions lisp/savehist.el
Expand Up @@ -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.
Expand Down Expand Up @@ -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.
Expand Down

0 comments on commit cd46972

Please sign in to comment.