[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Emacs-diffs] master 2a4a506 1/2: emacs-lisp/package.el (package-menu-ex
From: |
Artur Malabarba |
Subject: |
[Emacs-diffs] master 2a4a506 1/2: emacs-lisp/package.el (package-menu-execute): Offer to remove packages. |
Date: |
Tue, 03 Feb 2015 20:17:23 +0000 |
branch: master
commit 2a4a5069a6a0dba8888d72e60b66a3df5ed5a8cb
Author: Artur Malabarba <address@hidden>
Commit: Artur Malabarba <address@hidden>
emacs-lisp/package.el (package-menu-execute): Offer to remove packages.
---
lisp/ChangeLog | 4 +++
lisp/emacs-lisp/package.el | 53 ++++++++++++++++++++++++++++---------------
2 files changed, 38 insertions(+), 19 deletions(-)
diff --git a/lisp/ChangeLog b/lisp/ChangeLog
index c834d7c..38d41b27 100644
--- a/lisp/ChangeLog
+++ b/lisp/ChangeLog
@@ -21,6 +21,10 @@
(package-menu-mark-delete, package-menu--find-upgrades)
(package-menu--status-predicate, describe-package-1): Use it
+ (package--removable-packages): New function.
+ (package-autoremove): Use it.
+ (package-menu-execute): Offer to remove unneeded packages.
+
2015-02-03 Thierry Volpiatto <address@hidden>
* emacs-lisp/package.el (package-reinstall): Don't change package's
selected status.
diff --git a/lisp/emacs-lisp/package.el b/lisp/emacs-lisp/package.el
index 298604e..d013fd4 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)))