summaryrefslogtreecommitdiff
path: root/lisp/emacs-lisp
diff options
context:
space:
mode:
authorArtur Malabarba <bruce.connor.am@gmail.com>2015-02-03 17:51:39 -0200
committerArtur Malabarba <bruce.connor.am@gmail.com>2015-02-03 17:51:39 -0200
commit2a4a5069a6a0dba8888d72e60b66a3df5ed5a8cb (patch)
treeccb750252fbfd10fe7403c846d049bf846d527dd /lisp/emacs-lisp
parent504fada7e7502b9052076c20f16f55d7e9bd3c58 (diff)
downloademacs-2a4a5069a6a0dba8888d72e60b66a3df5ed5a8cb.tar.gz
emacs-2a4a5069a6a0dba8888d72e60b66a3df5ed5a8cb.tar.bz2
emacs-2a4a5069a6a0dba8888d72e60b66a3df5ed5a8cb.zip
emacs-lisp/package.el (package-menu-execute): Offer to remove packages.
Diffstat (limited to 'lisp/emacs-lisp')
-rw-r--r--lisp/emacs-lisp/package.el53
1 files changed, 34 insertions, 19 deletions
diff --git a/lisp/emacs-lisp/package.el b/lisp/emacs-lisp/package.el
index 298604e9892..d013fd4a329 100644
--- a/lisp/emacs-lisp/package.el
+++ b/lisp/emacs-lisp/package.el
@@ -1536,6 +1536,18 @@ If NOSAVE is non-nil, the package is not removed from
'package-selected-packages (remove name package-selected-packages)))
(message "Package `%s' deleted." (package-desc-full-name pkg-desc))))))
+(defun package--removable-packages ()
+ "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)))))
+ (cl-loop for p in (mapcar #'car package-alist)
+ unless (memq p needed)
+ collect p)))
+
;;;###autoload
(defun package-autoremove ()
"Remove packages that are no more needed.
@@ -1550,22 +1562,16 @@ will be deleted."
(when (or package-selected-packages
(yes-or-no-p
"`package-selected-packages' is empty! Really remove ALL packages? "))
- (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)))))
- (cl-loop for p in (mapcar #'car package-alist)
- unless (memq p needed)
- collect p into lst
- finally (if lst
- (when (y-or-n-p
- (format "%s packages will be deleted:\n%s, proceed? "
- (length lst)
- (mapconcat #'symbol-name lst ", ")))
- (mapc (lambda (p)
- (package-delete (cadr (assq p package-alist)) t))
- lst))
- (message "Nothing to autoremove"))))))
+ (let ((removable (package--removable-packages)))
+ (if removable
+ (when (y-or-n-p
+ (format "%s packages will be deleted:\n%s, proceed? "
+ (length removable)
+ (mapconcat #'symbol-name removable ", ")))
+ (mapc (lambda (p)
+ (package-delete (cadr (assq p package-alist)) t))
+ removable)
+ (message "Nothing to autoremove"))))))
(defun package-archive-base (desc)
"Return the archive containing the package NAME."
@@ -2377,9 +2383,18 @@ Optional argument NOQUERY non-nil means do not ask the user to confirm."
(package-delete elt)
(error (message (cadr err)))))
(error "Aborted")))
- (if (or delete-list install-list)
- (package-menu--generate t t)
- (message "No operations specified."))))
+ (if (not (or delete-list install-list))
+ (message "No operations specified.")
+ (when package-selected-packages
+ (let ((removable (package--removable-packages)))
+ (when (and removable
+ (y-or-n-p
+ (format "These %d packages are no longer needed, delete them (%s)? "
+ (length removable)
+ (mapconcat #'symbol-name removable ", "))))
+ (mapc (lambda (p) (package-delete (cadr (assq p package-alist))))
+ removable))))
+ (package-menu--generate t t))))
(defun package-menu--version-predicate (A B)
(let ((vA (or (aref (cadr A) 1) '(0)))