Function: package--dependencies

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

Signature

(package--dependencies PKG)

Documentation

Return a list of all transitive dependencies of PKG.

Each element of the resulting list is a cons-cell (NAME VERSION-LIST), where NAME is a symbol designating the package name and VERSION-LIST designates the least version number that any dependency of PKG requires. This format is intentionally meant to mirror that of package-desc-reqs, which see. PKG is either a symbol designating a package name known in the archives or a package-desc object, or a list of package names.

Source Code

;; Defined in /usr/src/emacs/lisp/emacs-lisp/package.el.gz
(defun package--dependencies (pkg)
  "Return a list of all transitive dependencies of PKG.
Each element of the resulting list is a cons-cell (NAME VERSION-LIST),
where NAME is a symbol designating the package name and VERSION-LIST
designates the least version number that any dependency of PKG requires.
This format is intentionally meant to mirror that of
`package-desc-reqs', which see.  PKG is either a symbol designating a
package name known in the archives or a `package-desc' object, or a list
of package names."
  (cl-loop for desc in (mapcar (lambda (d) (package-get-descriptor d t))
                               (ensure-list pkg))
           when desc
           append (named-let rec ((pkg-desc desc) (min-version nil) (seen '()))
                    (let ((deps '()))
                      (pcase-dolist (`(,name ,vlist) (package-desc-reqs pkg-desc))
                        (cond*
                         ((bind* (pred (lambda (d) (version-list-<= vlist (package-desc-version d))))))
                         ((memq name seen))
                         ((eq name 'emacs) (push (list name vlist) deps))
                         ((bind-and* (desc (package-get-descriptor name t pred)))
                          (setq deps (nconc (rec desc vlist (cons name seen)) deps)))
                         (t (push (list name vlist) deps))))
                      (cons (list (package-desc-name pkg-desc) min-version) deps)))
           into all
           finally return
           (mapcar
            (lambda (ent)
              (list (car ent) (seq-reduce (lambda (acc vlist)
                                            (if (version-list-< acc vlist) vlist acc))
                                          (mapcar #'cadr (cdr ent)) '())))
            (seq-group-by #'car (delete-dups (cdr all))))))