emacs-diffs
[Top][All Lists]
Advanced

[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)))



reply via email to

[Prev in Thread] Current Thread [Next in Thread]