Function: package-install-from-archive
package-install-from-archive is a byte-compiled function defined in
package.el.gz.
Signature
(package-install-from-archive PKG-DESC)
Documentation
Download and install a package defined by PKG-DESC.
Source Code
;; Defined in /usr/src/emacs/lisp/emacs-lisp/package.el.gz
(defun package-install-from-archive (pkg-desc)
"Download and install a package defined by PKG-DESC."
;; This won't happen, unless the archive is doing something wrong.
(when (eq (package-desc-kind pkg-desc) 'dir)
(error "Can't install directory package from archive"))
(let* ((location (package-archive-base pkg-desc))
(file (concat (package-desc-full-name pkg-desc)
(package-desc-suffix pkg-desc))))
(package--with-response-buffer location :file file
(if (or (not (package-check-signature))
(member (package-desc-archive pkg-desc)
package-unsigned-archives))
;; If we don't care about the signature, unpack and we're
;; done.
(let ((save-silently t))
(package-unpack pkg-desc))
;; If we care, check it and *then* write the file.
(let ((content (buffer-string)))
(package--check-signature
location file content nil
;; This function will be called after signature checking.
(lambda (&optional good-sigs)
;; Signature checked, unpack now.
(with-temp-buffer ;FIXME: Just use the previous current-buffer.
(set-buffer-multibyte nil)
(cl-assert (not (multibyte-string-p content)))
(insert content)
(let ((save-silently t))
(package-unpack pkg-desc)))
;; Here the package has been installed successfully, mark it as
;; signed if appropriate.
(when good-sigs
;; Write out good signatures into NAME-VERSION.signed file.
(write-region (mapconcat #'epg-signature-to-string good-sigs "\n")
nil
(expand-file-name
(concat (package-desc-full-name pkg-desc) ".signed")
package-user-dir)
nil 'silent)
;; Update the old pkg-desc which will be shown on the description buffer.
(setf (package-desc-signed pkg-desc) t)
;; Update the new (activated) pkg-desc as well.
(when-let* ((pkg-descs (cdr (assq (package-desc-name pkg-desc)
package-alist))))
(setf (package-desc-signed (car pkg-descs)) t))))))))
;; fetch a backup of the readme file from the server. Slot `dir' is
;; not yet available in PKG-DESC, so cobble that up.
(let* ((dirname (package-desc-full-name pkg-desc))
(pkg-dir (expand-file-name dirname package-user-dir))
(readme (expand-file-name "README-elpa" pkg-dir)))
(unless (file-readable-p readme)
(package--with-response-buffer (package-archive-base pkg-desc)
:file (format "%s-readme.txt" (package-desc-name pkg-desc))
:noerror t
;; do not write empty or whitespace-only readmes to give
;; `package--get-description' a chance to find another readme
(unless (save-excursion
(goto-char (point-min))
(looking-at-p "[[:space:]]*\\'"))
(write-region nil nil readme)))))))