From: Lars Ingebrigtsen Date: Thu, 12 May 2022 01:59:16 +0000 (+0200) Subject: New command 'package-update-all' X-Git-Tag: emacs-29.0.90~1910^2~774 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=42001f843bb7ca687bf5096543a5d478dab38b87;p=emacs.git New command 'package-update-all' * lisp/emacs-lisp/package.el (package-update-all): New function (bug#19146). (package--updateable-packages): Factored out... (package-update): ... from here. --- diff --git a/doc/emacs/package.texi b/doc/emacs/package.texi index fc2a093ec42..eb4f5b0edab 100644 --- a/doc/emacs/package.texi +++ b/doc/emacs/package.texi @@ -329,12 +329,14 @@ version of the package, a newer version is also installed. @findex package-install @findex package-update +@findex package-update-all Packages are most conveniently installed using the package menu (@pxref{Package Menu}), but you can also use the command @kbd{M-x package-install}. This prompts for the name of a package with the @samp{available} status, then downloads and installs it. Similarly, if you want to update a package, you can use the @kbd{M-x -package-update} command. +package-update} command, and if you just want to update all the +packages, you can use the @kbd{M-x package-update-all} command. @cindex package requirements A package may @dfn{require} certain other packages to be installed, diff --git a/etc/NEWS b/etc/NEWS index d9777eecd60..672260ca82b 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -829,6 +829,10 @@ this includes "binary" buffers like 'archive-mode' and 'image-mode'. ** Package ++++ +*** New command 'package-update-all'. +This command allows updating all packages without any queries. + +++ *** New command 'package-update'. This command allows you to upgrade packages without using 'M-x diff --git a/lisp/emacs-lisp/package.el b/lisp/emacs-lisp/package.el index c1e14a4acb5..72b22a65566 100644 --- a/lisp/emacs-lisp/package.el +++ b/lisp/emacs-lisp/package.el @@ -2140,26 +2140,44 @@ to install it but still mark it as selected." (defun package-update (name) "Update package NAME if a newer version exists." (interactive - (progn - ;; Initialize the package system to get the list of package - ;; symbols for completion. - (package--archives-initialize) - (list (completing-read - "Update package: " - (mapcar - #'car - (seq-filter - (lambda (elt) - (let ((available - (assq (car elt) package-archive-contents))) - (and available - (version-list-< - (package-desc-priority-version (cadr elt)) - (package-desc-priority-version (cadr available)))))) - package-alist)) - nil t)))) - (package-delete (cadr (assq (intern name) package-alist)) 'force) - (package-install (intern name) 'dont-select)) + (list (completing-read + "Update package: " (package--updateable-packages) nil t))) + (let ((package (if (symbolp name) + name + (intern name)))) + (package-delete (cadr (assq package package-alist)) 'force) + (package-install package 'dont-select))) + +(defun package--updateable-packages () + ;; Initialize the package system to get the list of package + ;; symbols for completion. + (package--archives-initialize) + (mapcar + #'car + (seq-filter + (lambda (elt) + (let ((available + (assq (car elt) package-archive-contents))) + (and available + (version-list-< + (package-desc-priority-version (cadr elt)) + (package-desc-priority-version (cadr available)))))) + package-alist))) + +(defun package-update-all (&optional inhibit-queries) + "Upgrade all packages." + (interactive "P") + (let ((updateable (package--updateable-packages))) + (if (not updateable) + (message "No packages to update") + (when (and (not inhibit-queries) + (not (yes-or-no-p + (if (length= updateable 1) + "One package to update. Do it? " + (format "%s packages to update. Do it?" + (length updateable)))))) + (user-error "Updating aborted")) + (mapc #'package-update updateable)))) (defun package-strip-rcs-id (str) "Strip RCS version ID from the version string STR.