mirror of
git://git.sv.gnu.org/emacs.git
synced 2025-12-17 19:30:38 -08:00
* lisp/emacs-lisp/package.el: Obey buffer-file-coding-system (bug#35739)
`url-insert-file-contents` saves in buffer-file-coding-system the coding-system used to decode the contents. Preserve this as the contents is moved from buffer to string to buffer, and use it when saving the contents to file, so as to try and better preserve the original byte sequence. (package--buffer-string, package--cs): New functions. (package--check-signature): Encode `string` if a coding-system was specified in buffer-file-coding-system. (package--download-one-archive, package-install-from-archive): Obey and preserve the buffer-file-coding-system if specified. Do not merge.
This commit is contained in:
parent
134edc1036
commit
b3df372959
1 changed files with 27 additions and 9 deletions
|
|
@ -1241,6 +1241,17 @@ errors."
|
||||||
(signal 'bad-signature (list sig-file)))
|
(signal 'bad-signature (list sig-file)))
|
||||||
good-signatures)))
|
good-signatures)))
|
||||||
|
|
||||||
|
(defun package--buffer-string ()
|
||||||
|
(let ((string (buffer-string)))
|
||||||
|
(when (and buffer-file-coding-system
|
||||||
|
(> (length string) 0))
|
||||||
|
(put-text-property 0 1 'package--cs buffer-file-coding-system string))
|
||||||
|
string))
|
||||||
|
|
||||||
|
(defun package--cs (string)
|
||||||
|
(and (> (length string) 0)
|
||||||
|
(get-text-property 0 'package--cs string)))
|
||||||
|
|
||||||
(defun package--check-signature (location file &optional string async callback unwind)
|
(defun package--check-signature (location file &optional string async callback unwind)
|
||||||
"Check signature of the current buffer.
|
"Check signature of the current buffer.
|
||||||
Download the signature file from LOCATION by appending \".sig\"
|
Download the signature file from LOCATION by appending \".sig\"
|
||||||
|
|
@ -1260,8 +1271,12 @@ Otherwise, an error is signaled.
|
||||||
|
|
||||||
UNWIND, if provided, is a function to be called after everything
|
UNWIND, if provided, is a function to be called after everything
|
||||||
else, even if an error is signaled."
|
else, even if an error is signaled."
|
||||||
(let ((sig-file (concat file ".sig"))
|
(let* ((sig-file (concat file ".sig"))
|
||||||
(string (or string (buffer-string))))
|
(string (or string (package--buffer-string)))
|
||||||
|
(cs (package--cs string)))
|
||||||
|
;; Re-encode the downloaded file with the coding-system with which
|
||||||
|
;; it was decoded, so we (hopefully) get the exact same bytes back.
|
||||||
|
(when cs (setq string (encode-coding-string string cs)))
|
||||||
(package--with-response-buffer location :file sig-file
|
(package--with-response-buffer location :file sig-file
|
||||||
:async async :noerror t
|
:async async :noerror t
|
||||||
;; Connection error is assumed to mean "no sig-file".
|
;; Connection error is assumed to mean "no sig-file".
|
||||||
|
|
@ -1529,7 +1544,7 @@ similar to an entry in `package-alist'. Save the cached copy to
|
||||||
:error-form (package--update-downloads-in-progress archive)
|
:error-form (package--update-downloads-in-progress archive)
|
||||||
(let* ((location (cdr archive))
|
(let* ((location (cdr archive))
|
||||||
(name (car archive))
|
(name (car archive))
|
||||||
(content (buffer-string))
|
(content (package--buffer-string))
|
||||||
(dir (expand-file-name (format "archives/%s" name) package-user-dir))
|
(dir (expand-file-name (format "archives/%s" name) package-user-dir))
|
||||||
(local-file (expand-file-name file dir)))
|
(local-file (expand-file-name file dir)))
|
||||||
(when (listp (read content))
|
(when (listp (read content))
|
||||||
|
|
@ -1538,7 +1553,8 @@ similar to an entry in `package-alist'. Save the cached copy to
|
||||||
(member name package-unsigned-archives))
|
(member name package-unsigned-archives))
|
||||||
;; If we don't care about the signature, save the file and
|
;; If we don't care about the signature, save the file and
|
||||||
;; we're done.
|
;; we're done.
|
||||||
(progn (let ((coding-system-for-write 'utf-8))
|
(progn (let ((coding-system-for-write
|
||||||
|
(or (package--cs content) 'utf-8)))
|
||||||
(write-region content nil local-file nil 'silent))
|
(write-region content nil local-file nil 'silent))
|
||||||
(package--update-downloads-in-progress archive))
|
(package--update-downloads-in-progress archive))
|
||||||
;; If we care, check it (perhaps async) and *then* write the file.
|
;; If we care, check it (perhaps async) and *then* write the file.
|
||||||
|
|
@ -1546,7 +1562,7 @@ similar to an entry in `package-alist'. Save the cached copy to
|
||||||
location file content async
|
location file content async
|
||||||
;; This function will be called after signature checking.
|
;; This function will be called after signature checking.
|
||||||
(lambda (&optional good-sigs)
|
(lambda (&optional good-sigs)
|
||||||
(let ((coding-system-for-write 'utf-8))
|
(let ((coding-system-for-write (or (package--cs content) 'utf-8)))
|
||||||
(write-region content nil local-file nil 'silent))
|
(write-region content nil local-file nil 'silent))
|
||||||
;; Write out good signatures into archive-contents.signed file.
|
;; Write out good signatures into archive-contents.signed file.
|
||||||
(when good-sigs
|
(when good-sigs
|
||||||
|
|
@ -1838,15 +1854,17 @@ if all the in-between dependencies are also in PACKAGE-LIST."
|
||||||
(let ((save-silently t))
|
(let ((save-silently t))
|
||||||
(package-unpack pkg-desc))
|
(package-unpack pkg-desc))
|
||||||
;; If we care, check it and *then* write the file.
|
;; If we care, check it and *then* write the file.
|
||||||
(let ((content (buffer-string)))
|
(let ((content (package--buffer-string)))
|
||||||
(package--check-signature
|
(package--check-signature
|
||||||
location file content nil
|
location file content nil
|
||||||
;; This function will be called after signature checking.
|
;; This function will be called after signature checking.
|
||||||
(lambda (&optional good-sigs)
|
(lambda (&optional good-sigs)
|
||||||
;; Signature checked, unpack now.
|
;; Signature checked, unpack now.
|
||||||
(with-temp-buffer (insert content)
|
(with-temp-buffer
|
||||||
(let ((save-silently t))
|
(insert content)
|
||||||
(package-unpack pkg-desc)))
|
(setq buffer-file-coding-system (package--cs content))
|
||||||
|
(let ((save-silently t))
|
||||||
|
(package-unpack pkg-desc)))
|
||||||
;; Here the package has been installed successfully, mark it as
|
;; Here the package has been installed successfully, mark it as
|
||||||
;; signed if appropriate.
|
;; signed if appropriate.
|
||||||
(when good-sigs
|
(when good-sigs
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue