emacs-lisp/package.el (package-menu-execute): Offer to remove packages.
This commit is contained in:
parent
504fada7e7
commit
2a4a5069a6
2 changed files with 38 additions and 19 deletions
|
@ -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 <thierry.volpiatto@gmail.com>
|
||||
|
||||
* emacs-lisp/package.el (package-reinstall): Don't change package's selected status.
|
||||
|
|
|
@ -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)))
|
||||
|
|
Loading…
Add table
Reference in a new issue