* lisp/emacs-lisp/package.el (package--get-deps): Rewrite.

Avoid inf-recursion with dependency cycles.
Remove unused `only` arg.  Prune duplicates early rather than late.
(package--removable-packages): Simplify code accordingly.
This commit is contained in:
Stefan Monnier 2019-10-06 13:48:28 -04:00
parent 4638b5ce0a
commit ef9124aaa0

View file

@ -1844,21 +1844,17 @@ if it is still empty."
(package--save-selected-packages (package--find-non-dependencies)))
(memq pkg package-selected-packages))
(defun package--get-deps (pkg &optional only)
(let* ((pkg-desc (cadr (assq pkg package-alist)))
(direct-deps (cl-loop for p in (package-desc-reqs pkg-desc)
for name = (car p)
when (assq name package-alist)
collect name))
(indirect-deps (unless (eq only 'direct)
(delete-dups
(cl-loop for p in direct-deps
append (package--get-deps p))))))
(cl-case only
(direct direct-deps)
(separate (list direct-deps indirect-deps))
(indirect indirect-deps)
(t (delete-dups (append direct-deps indirect-deps))))))
(defun package--get-deps (pkgs)
(let ((seen '()))
(while pkgs
(let ((pkg (pop pkgs)))
(if (memq pkg seen)
nil ;; Done already!
(let ((pkg-desc (cadr (assq pkg package-alist))))
(when pkg-desc
(push pkg seen)
(setq pkgs (append (package-desc-reqs pkg-desc) pkgs)))))))
seen))
(defun package--user-installed-p (package)
"Return non-nil if PACKAGE is a user-installed package.
@ -1873,10 +1869,7 @@ control over."
"Return a list of names of packages no longer needed.
These are packages which are neither contained in
`package-selected-packages' nor a dependency of one that is."
(let ((needed (cl-loop for p in package-selected-packages
if (assq p package-alist)
;; `p' and its dependencies are needed.
append (cons p (package--get-deps p)))))
(let ((needed (package--get-deps package-selected-packages)))
(cl-loop for p in (mapcar #'car package-alist)
unless (or (memq p needed)
;; Do not auto-remove external packages.