From 0916fd3aaacf62e641414fb2b474c86888116487 Mon Sep 17 00:00:00 2001 From: Lars Ingebrigtsen Date: Tue, 3 May 2022 18:00:32 +0200 Subject: [PATCH] Add new command 'package-update' * doc/emacs/package.texi (Package Installation): Mention it. * lisp/emacs-lisp/package.el (package-update): New command (bug#18790). --- doc/emacs/package.texi | 5 ++++- etc/NEWS | 7 +++++++ lisp/emacs-lisp/package.el | 25 +++++++++++++++++++++++++ 3 files changed, 36 insertions(+), 1 deletion(-) diff --git a/doc/emacs/package.texi b/doc/emacs/package.texi index caa65bf33b6..bd3ae2aa6ad 100644 --- a/doc/emacs/package.texi +++ b/doc/emacs/package.texi @@ -320,10 +320,13 @@ version of the package, a newer version is also installed. @section Package Installation @findex package-install +@findex package-update 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. +@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. @cindex package requirements A package may @dfn{require} certain other packages to be installed, diff --git a/etc/NEWS b/etc/NEWS index f897158afd0..b6a47326330 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -707,6 +707,13 @@ script that was used in ancient South Asia. A new input method, * Changes in Specialized Modes and Packages in Emacs 29.1 +** Package + ++++ +*** New command 'package-update'. +This command allows you to upgrade packages without using 'M-x +list-packages'. + ** Miscellaneous +++ diff --git a/lisp/emacs-lisp/package.el b/lisp/emacs-lisp/package.el index 7f2c427c2ee..58c1349e1c2 100644 --- a/lisp/emacs-lisp/package.el +++ b/lisp/emacs-lisp/package.el @@ -2136,6 +2136,31 @@ to install it but still mark it as selected." (message "Package `%s' installed." name)) (message "`%s' is already installed" name)))) +;;;###autoload +(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)) + (defun package-strip-rcs-id (str) "Strip RCS version ID from the version string STR. If the result looks like a dotted numeric version, return it. -- 2.39.5