Write autoloads file atomically

* lisp/emacs-lisp/autoload.el (autoload--save-buffer):
New function, to save buffer atomically.
(autoload-save-buffers, update-directory-autoloads):
Use autoload--save-buffer.
* lisp/Makefile.in ($(lisp)/loaddefs.el):
No longer write to a temp file by hand.
This commit is contained in:
Glenn Morris 2017-05-06 17:58:20 -07:00
parent 03d941982f
commit 7f3d63908c
2 changed files with 19 additions and 16 deletions

View file

@ -866,11 +866,26 @@ FILE's modification time."
(error "%s:0:0: error: %s: %s" file (car err) (cdr err)))
))
;; For parallel builds, to stop another process reading a half-written file.
(defun autoload--save-buffer ()
"Save current buffer to its file, atomically."
;; Copied from byte-compile-file.
(let* ((version-control 'never)
(tempfile (make-temp-name buffer-file-name))
(kill-emacs-hook
(cons (lambda () (ignore-errors (delete-file tempfile)))
kill-emacs-hook)))
(write-region (point-min) (point-max) tempfile nil 1)
(backup-buffer)
(rename-file tempfile buffer-file-name t)
(set-buffer-modified-p nil)
(set-visited-file-modtime)
(or noninteractive (message "Wrote %s" buffer-file-name))))
(defun autoload-save-buffers ()
(while autoload-modified-buffers
(with-current-buffer (pop autoload-modified-buffers)
(let ((version-control 'never))
(save-buffer)))))
(autoload--save-buffer))))
;; FIXME This command should be deprecated.
;; See http://debbugs.gnu.org/22213#41
@ -1110,8 +1125,7 @@ write its autoloads into the specified file instead."
;; dependencies don't trigger unnecessarily.
(if (not changed)
(set-buffer-modified-p nil)
(let ((version-control 'never))
(save-buffer)))
(autoload--save-buffer))
;; In case autoload entries were added to other files because of
;; file-local autoload-generated-file settings.