Byte compilation: handle case where the output file is a mountpoint.
See Bug#44631. While testing for a readonly output directory has slightly different semantics, in practice they should cover cases where Emacs is sandboxed and can only write to the destination file, not its directory. * lisp/emacs-lisp/bytecomp.el (byte-compile-file): Handle the case where the output directory is not writable. * test/lisp/emacs-lisp/bytecomp-tests.el (bytecomp-tests--not-writable-directory) (bytecomp-tests--dest-mountpoint): New unit tests.
This commit is contained in:
parent
897b8561cd
commit
fe50a8b9ba
2 changed files with 82 additions and 1 deletions
|
@ -1963,7 +1963,11 @@ See also `emacs-lisp-byte-compile-and-load'."
|
|||
(insert "\n") ; aaah, unix.
|
||||
(cond
|
||||
((null target-file) nil) ;We only wanted the warnings!
|
||||
((file-writable-p target-file)
|
||||
((and (file-writable-p target-file)
|
||||
;; We attempt to create a temporary file in the
|
||||
;; target directory, so the target directory must be
|
||||
;; writable.
|
||||
(file-writable-p (file-name-directory target-file)))
|
||||
;; We must disable any code conversion here.
|
||||
(let* ((coding-system-for-write 'no-conversion)
|
||||
;; Write to a tempfile so that if another Emacs
|
||||
|
@ -1992,6 +1996,14 @@ See also `emacs-lisp-byte-compile-and-load'."
|
|||
;; deleting target-file before writing it.
|
||||
(rename-file tempfile target-file t))
|
||||
(or noninteractive (message "Wrote %s" target-file)))
|
||||
((file-writable-p target-file)
|
||||
;; In case the target directory isn't writable (see e.g. Bug#44631),
|
||||
;; try writing to the output file directly. We must disable any
|
||||
;; code conversion here.
|
||||
(let ((coding-system-for-write 'no-conversion))
|
||||
(with-file-modes (logand (default-file-modes) #o666)
|
||||
(write-region (point-min) (point-max) target-file nil 1)))
|
||||
(or noninteractive (message "Wrote %s" target-file)))
|
||||
(t
|
||||
;; This is just to give a better error message than write-region
|
||||
(let ((exists (file-exists-p target-file)))
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue