Function: package--download-one-archive

package--download-one-archive is a byte-compiled function defined in package.el.gz.

Signature

(package--download-one-archive ARCHIVE FILE &optional ASYNC)

Documentation

Retrieve an archive file FILE from ARCHIVE, and cache it.

ARCHIVE should be a cons cell of the form (NAME . LOCATION), similar to an entry in package-alist. Save the cached copy to
"archives/NAME/FILE" in package-user-dir.

Source Code

;; Defined in /usr/src/emacs/lisp/emacs-lisp/package.el.gz
(defun package--download-one-archive (archive file &optional async)
  "Retrieve an archive file FILE from ARCHIVE, and cache it.
ARCHIVE should be a cons cell of the form (NAME . LOCATION),
similar to an entry in `package-alist'.  Save the cached copy to
\"archives/NAME/FILE\" in `package-user-dir'."
  ;; The downloaded archive contents will be read as part of
  ;; `package--update-downloads-in-progress'.
  (when async
    (cl-pushnew (cons archive file) package--downloads-in-progress
                :test #'equal))
  (package--with-response-buffer (cdr archive) :file file
    :async async
    :error-form (package--update-downloads-in-progress (cons archive file))
    (let* ((location (cdr archive))
           (name (car archive))
           (content (buffer-string))
           (dir (expand-file-name (concat "archives/" name) package-user-dir))
           (local-file (expand-file-name file dir)))
      (when (listp (read content))
        (make-directory dir t)
        (if (or (not (package-check-signature))
                (member name package-unsigned-archives))
            ;; If we don't care about the signature, save the file and
            ;; we're done.
            (progn
              (cl-assert (not enable-multibyte-characters))
              (let ((coding-system-for-write 'binary))
                (write-region content nil local-file nil 'silent))
              (package--update-downloads-in-progress (cons archive file)))
          ;; If we care, check it (perhaps async) and *then* write the file.
          (package--check-signature
           location file content async
           ;; This function will be called after signature checking.
           (lambda (&optional good-sigs)
             (cl-assert (not enable-multibyte-characters))
             (let ((coding-system-for-write 'binary))
               (write-region content nil local-file nil 'silent))
             ;; Write out good signatures into archive-contents.signed file.
             (when good-sigs
               (write-region (mapconcat #'epg-signature-to-string good-sigs "\n")
                             nil (concat local-file ".signed") nil 'silent)))
           (lambda () (package--update-downloads-in-progress (cons archive file)))))))))