Function: package-vc-install-dependencies

package-vc-install-dependencies is a byte-compiled function defined in package-vc.el.gz.

Signature

(package-vc-install-dependencies DEPS)

Documentation

Install missing dependencies according to DEPS.

DEPS is a list of elements (PACKAGE VERSION-LIST), where PACKAGE is a package name and VERSION-LIST is the required version of that package.

Return a list of dependencies that couldn't be met (or nil, when this function successfully installs all given dependencies).

Source Code

;; Defined in /usr/src/emacs/lisp/emacs-lisp/package-vc.el.gz
(defun package-vc-install-dependencies (deps)
  "Install missing dependencies according to DEPS.

DEPS is a list of elements (PACKAGE VERSION-LIST), where
PACKAGE is a package name and VERSION-LIST is the required
version of that package.

Return a list of dependencies that couldn't be met (or nil, when
this function successfully installs all given dependencies)."
  (let ((to-install '()) (missing '()))
    (cl-labels ((search (pkg)
                  "Attempt to find all dependencies for PKG."
                  (cond
                   ((assq (car pkg) to-install)) ;inhibit cycles
                   ((package-installed-p (car pkg) (cadr pkg)))
                   ((if-let* ((desc (package-get-descriptor (car pkg) 'archive)))
                        (let ((reqs (package-desc-reqs desc)))
                          (push desc to-install)
                          (mapc #'search reqs))
                      (push pkg missing)))))
                (version-order (a b)
                  "Predicate to sort packages in order."
                  (version-list-<
                   (package-desc-version b)
                   (package-desc-version a)))
                (duplicate-p (a b)
                  "Are A and B the same package?"
                  (eq (package-desc-name a) (package-desc-name b)))
                (depends-on-p (target package)
                  "Does PACKAGE depend on TARGET?"
                  (or (eq target package)
                      (and-let* ((desc (package-get-descriptor package 'archive)))
                        (seq-some
                         (apply-partially #'depends-on-p target)
                         (mapcar #'car (package-desc-reqs desc))))))
                (dependent-order (a b)
                  (let ((desc-a (package-desc-name a))
                        (desc-b (package-desc-name b)))
                    (depends-on-p desc-a desc-b))))
      (mapc #'search deps)
      (cl-callf sort to-install #'version-order)
      (cl-callf seq-uniq to-install #'duplicate-p)
      (cl-callf sort to-install #'dependent-order))
    (mapc #'package-install-from-archive to-install)
    missing))