aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStefan Monnier2019-10-06 13:48:28 -0400
committerStefan Monnier2019-10-06 13:48:28 -0400
commitef9124aaa005d5409b194ec60e3315d8a6625760 (patch)
tree3bb0eecc9bc2bdb2092414d8f1bf225d1172a088
parent4638b5ce0ae80568ac3278a5d1ae67086bd7f616 (diff)
downloademacs-ef9124aaa005d5409b194ec60e3315d8a6625760.tar.gz
emacs-ef9124aaa005d5409b194ec60e3315d8a6625760.zip
* 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.
-rw-r--r--lisp/emacs-lisp/package.el31
1 files 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."
1844 (package--save-selected-packages (package--find-non-dependencies))) 1844 (package--save-selected-packages (package--find-non-dependencies)))
1845 (memq pkg package-selected-packages)) 1845 (memq pkg package-selected-packages))
1846 1846
1847(defun package--get-deps (pkg &optional only) 1847(defun package--get-deps (pkgs)
1848 (let* ((pkg-desc (cadr (assq pkg package-alist))) 1848 (let ((seen '()))
1849 (direct-deps (cl-loop for p in (package-desc-reqs pkg-desc) 1849 (while pkgs
1850 for name = (car p) 1850 (let ((pkg (pop pkgs)))
1851 when (assq name package-alist) 1851 (if (memq pkg seen)
1852 collect name)) 1852 nil ;; Done already!
1853 (indirect-deps (unless (eq only 'direct) 1853 (let ((pkg-desc (cadr (assq pkg package-alist))))
1854 (delete-dups 1854 (when pkg-desc
1855 (cl-loop for p in direct-deps 1855 (push pkg seen)
1856 append (package--get-deps p)))))) 1856 (setq pkgs (append (package-desc-reqs pkg-desc) pkgs)))))))
1857 (cl-case only 1857 seen))
1858 (direct direct-deps)
1859 (separate (list direct-deps indirect-deps))
1860 (indirect indirect-deps)
1861 (t (delete-dups (append direct-deps indirect-deps))))))
1862 1858
1863(defun package--user-installed-p (package) 1859(defun package--user-installed-p (package)
1864 "Return non-nil if PACKAGE is a user-installed package. 1860 "Return non-nil if PACKAGE is a user-installed package.
@@ -1873,10 +1869,7 @@ control over."
1873 "Return a list of names of packages no longer needed. 1869 "Return a list of names of packages no longer needed.
1874These are packages which are neither contained in 1870These are packages which are neither contained in
1875`package-selected-packages' nor a dependency of one that is." 1871`package-selected-packages' nor a dependency of one that is."
1876 (let ((needed (cl-loop for p in package-selected-packages 1872 (let ((needed (package--get-deps package-selected-packages)))
1877 if (assq p package-alist)
1878 ;; `p' and its dependencies are needed.
1879 append (cons p (package--get-deps p)))))
1880 (cl-loop for p in (mapcar #'car package-alist) 1873 (cl-loop for p in (mapcar #'car package-alist)
1881 unless (or (memq p needed) 1874 unless (or (memq p needed)
1882 ;; Do not auto-remove external packages. 1875 ;; Do not auto-remove external packages.