diff options
| author | Stefan Monnier | 2019-10-06 13:48:28 -0400 |
|---|---|---|
| committer | Stefan Monnier | 2019-10-06 13:48:28 -0400 |
| commit | ef9124aaa005d5409b194ec60e3315d8a6625760 (patch) | |
| tree | 3bb0eecc9bc2bdb2092414d8f1bf225d1172a088 | |
| parent | 4638b5ce0ae80568ac3278a5d1ae67086bd7f616 (diff) | |
| download | emacs-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.el | 31 |
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. |
| 1874 | These are packages which are neither contained in | 1870 | These 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. |