From ef9124aaa005d5409b194ec60e3315d8a6625760 Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Sun, 6 Oct 2019 13:48:28 -0400 Subject: [PATCH] * 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. --- lisp/emacs-lisp/package.el | 31 ++++++++++++------------------- 1 file changed, 12 insertions(+), 19 deletions(-) diff --git a/lisp/emacs-lisp/package.el b/lisp/emacs-lisp/package.el index 188f398a56b..169bcda69f0 100644 --- a/lisp/emacs-lisp/package.el +++ b/lisp/emacs-lisp/package.el @@ -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. -- 2.39.5