Allow installing packages with DOS line endings
* lisp/emacs-lisp/package.el (package-install-from-buffer): Allow installing files with different line ending conventions (Unix, DOS and Macos) (bug#48137).
This commit is contained in:
parent
aa8859d0cb
commit
606b783acb
2 changed files with 87 additions and 2 deletions
|
@ -2195,8 +2195,24 @@ Downloads and installs required packages as needed."
|
|||
((derived-mode-p 'tar-mode)
|
||||
(package-tar-file-info))
|
||||
(t
|
||||
(save-excursion
|
||||
(package-buffer-info)))))
|
||||
;; Package headers should be parsed from decoded text
|
||||
;; (see Bug#48137) where possible.
|
||||
(if (and (eq buffer-file-coding-system 'no-conversion)
|
||||
buffer-file-name)
|
||||
(let* ((package-buffer (current-buffer))
|
||||
(decoding-system
|
||||
(car (find-operation-coding-system
|
||||
'insert-file-contents
|
||||
(cons buffer-file-name
|
||||
package-buffer)))))
|
||||
(with-temp-buffer
|
||||
(insert-buffer-substring package-buffer)
|
||||
(decode-coding-region (point-min) (point-max)
|
||||
decoding-system)
|
||||
(package-buffer-info)))
|
||||
|
||||
(save-excursion
|
||||
(package-buffer-info))))))
|
||||
(name (package-desc-name pkg-desc)))
|
||||
;; Download and install the dependencies.
|
||||
(let* ((requires (package-desc-reqs pkg-desc))
|
||||
|
@ -2222,6 +2238,7 @@ directory."
|
|||
(setq default-directory file)
|
||||
(dired-mode))
|
||||
(insert-file-contents-literally file)
|
||||
(set-visited-file-name file)
|
||||
(when (string-match "\\.tar\\'" file) (tar-mode)))
|
||||
(package-install-from-buffer)))
|
||||
|
||||
|
|
|
@ -263,6 +263,74 @@ Must called from within a `tar-mode' buffer."
|
|||
(should (file-exists-p autoloads-file))
|
||||
(should-not (get-file-buffer autoloads-file)))))
|
||||
|
||||
(ert-deftest package-test-install-file ()
|
||||
"Install files with `package-install-file'."
|
||||
(with-package-test (:basedir (ert-resource-directory))
|
||||
(package-initialize)
|
||||
(let* ((pkg-el "simple-single-1.3.el")
|
||||
(source-file (expand-file-name pkg-el (ert-resource-directory))))
|
||||
(should-not (package-installed-p 'simple-single))
|
||||
(package-install-file source-file)
|
||||
(should (package-installed-p 'simple-single))
|
||||
(package-delete (cadr (assq 'simple-single package-alist)))
|
||||
(should-not (package-installed-p 'simple-single)))
|
||||
|
||||
(let* ((pkg-el "multi-file-0.2.3.tar")
|
||||
(source-file (expand-file-name pkg-el (ert-resource-directory))))
|
||||
(package-initialize)
|
||||
(should-not (package-installed-p 'multie-file))
|
||||
(package-install-file source-file)
|
||||
(should (package-installed-p 'multi-file))
|
||||
(package-delete (cadr (assq 'multi-file package-alist))))
|
||||
))
|
||||
|
||||
(ert-deftest package-test-install-file-EOLs ()
|
||||
"Install same file multiple time with `package-install-file'
|
||||
but with a different end of line convention (bug#48137)."
|
||||
(with-package-test (:basedir (ert-resource-directory))
|
||||
(package-initialize)
|
||||
(let* ((pkg-el "simple-single-1.3.el")
|
||||
(source-file (expand-file-name pkg-el (ert-resource-directory))))
|
||||
|
||||
(with-temp-buffer
|
||||
(insert-file-contents source-file)
|
||||
|
||||
(let (hashes)
|
||||
(dolist (coding '(unix dos mac) hashes)
|
||||
(let* ((eol-file (expand-file-name pkg-el package-test-user-dir)))
|
||||
;; save package with this EOL convention.
|
||||
(set-buffer-file-coding-system coding)
|
||||
(write-region (point-min) (point-max) eol-file)
|
||||
|
||||
(should-not (package-installed-p 'simple-single))
|
||||
(package-install-file eol-file)
|
||||
(should (package-installed-p 'simple-single))
|
||||
|
||||
;; check the package file has been installed unmodified.
|
||||
(let ((eol-hash (with-temp-buffer
|
||||
(insert-file-contents-literally eol-file)
|
||||
(buffer-hash))))
|
||||
;; also perform an additional check that the package
|
||||
;; file created with this EOL convention is different
|
||||
;; than all the others created so far.
|
||||
(should-not (member eol-hash hashes))
|
||||
(setq hashes (cons eol-hash hashes))
|
||||
|
||||
(let* ((descr (cadr (assq 'simple-single package-alist)))
|
||||
(pkg-dir (package-desc-dir descr))
|
||||
(dest-file (expand-file-name "simple-single.el" pkg-dir ))
|
||||
(dest-hash (with-temp-buffer
|
||||
(insert-file-contents-literally dest-file)
|
||||
(buffer-hash))))
|
||||
|
||||
(should (string= dest-hash eol-hash))))
|
||||
|
||||
(package-delete (cadr (assq 'simple-single package-alist)))
|
||||
(should-not (package-installed-p 'simple-single))
|
||||
(delete-file eol-file)
|
||||
(should-not (file-exists-p eol-file))
|
||||
)))))))
|
||||
|
||||
(ert-deftest package-test-install-dependency ()
|
||||
"Install a package which includes a dependency."
|
||||
(with-package-test ()
|
||||
|
|
Loading…
Add table
Reference in a new issue